From 9586ff19a14342eeff115590ef0da40209ef5787 Mon Sep 17 00:00:00 2001 From: granny Date: Thu, 4 Dec 2025 18:55:42 -0800 Subject: [PATCH] apply minecraft feature patches --- .../0001-Ridables.patch | 4364 ++++++++--------- ...-Configurable-entity-base-attributes.patch | 1770 +++---- .../0003-Barrels-and-enderchests-6-rows.patch | 14 +- .../0004-Giants-AI-settings.patch | 2 +- .../0005-Chickens-can-retaliate.patch | 14 +- ...-Minecart-settings-and-WASD-controls.patch | 24 +- ...0007-Villagers-follow-emerald-blocks.patch | 40 +- .../0008-Implement-elytra-settings.patch | 14 +- .../0009-Configurable-jockey-options.patch | 60 +- ...ed-to-crystals-and-crystals-shoot-ph.patch | 20 +- .../0011-Phantoms-burn-in-light.patch | 39 +- ...e-entity-breeding-times-configurable.patch | 782 +-- ...mes-from-item-forms-of-entities-to-e.patch | 28 +- ...Villager-Clerics-to-farm-Nether-Wart.patch | 40 +- ...fing-override-to-everything-affected.patch | 314 +- ...0016-Add-EntityTeleportHinderedEvent.patch | 10 +- ...oggle-for-water-sensitive-mob-damage.patch | 1648 +++---- ...018-API-for-any-mob-to-burn-daylight.patch | 277 +- ...turally-aggressive-to-players-chance.patch | 20 +- .../0020-Mobs-always-drop-experience.patch | 1632 +++--- 20 files changed, 5509 insertions(+), 5603 deletions(-) rename purpur-server/minecraft-patches/{unapplied-features => features}/0001-Ridables.patch (85%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0002-Configurable-entity-base-attributes.patch (74%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0003-Barrels-and-enderchests-6-rows.patch (95%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0004-Giants-AI-settings.patch (98%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0005-Chickens-can-retaliate.patch (83%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0006-Minecart-settings-and-WASD-controls.patch (88%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0007-Villagers-follow-emerald-blocks.patch (77%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0008-Implement-elytra-settings.patch (90%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0009-Configurable-jockey-options.patch (71%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0010-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch (94%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0011-Phantoms-burn-in-light.patch (65%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0012-Make-entity-breeding-times-configurable.patch (66%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0013-Apply-display-names-from-item-forms-of-entities-to-e.patch (84%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0014-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch (87%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0015-Add-mobGriefing-override-to-everything-affected.patch (55%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0016-Add-EntityTeleportHinderedEvent.patch (93%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0017-Toggle-for-water-sensitive-mob-damage.patch (66%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0018-API-for-any-mob-to-burn-daylight.patch (59%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0019-Cows-naturally-aggressive-to-players-chance.patch (87%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0020-Mobs-always-drop-experience.patch (65%) diff --git a/purpur-server/minecraft-patches/unapplied-features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch similarity index 85% rename from purpur-server/minecraft-patches/unapplied-features/0001-Ridables.patch rename to purpur-server/minecraft-patches/features/0001-Ridables.patch index 943880bf4..ce5415c48 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0001-Ridables.patch +++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Ridables diff --git a/net/minecraft/gametest/framework/GameTestHelper.java b/net/minecraft/gametest/framework/GameTestHelper.java -index 6c452f195055afb489f828bfac9f23217ba7653d..7261bb8b2728b6e4ff519874375ef42fff74678a 100644 +index 05eb0c3273ffa1b5a1ebd8f8ae42c11830d755c7..49d3154afe2ca5789e63bdf972c791969405c16d 100644 --- a/net/minecraft/gametest/framework/GameTestHelper.java +++ b/net/minecraft/gametest/framework/GameTestHelper.java -@@ -314,6 +314,8 @@ public class GameTestHelper { +@@ -324,6 +324,8 @@ public class GameTestHelper { public void setAfk(final boolean afk) {} // Purpur - AFK API @@ -18,22 +18,22 @@ index 6c452f195055afb489f828bfac9f23217ba7653d..7261bb8b2728b6e4ff519874375ef42f public boolean isClientAuthoritative() { return false; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 9337f3fa2daa224d04499fd2bb0fef9c1283ba27..614f725bee3b3047402543a12896935faeea877d 100644 +index 2b18da0e98ff30a81e88d0e99baa67acb339e4e5..c494e06e040f9335806279abd336564fe0f5e5f3 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1819,6 +1819,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - BlockPhysicsEvent serverLevel.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent serverLevel.updateLagCompensationTick(); // Paper - lag compensation - net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = serverLevel.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers + serverLevel.hasRidableMoveEvent = org.purpurmc.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur - Ridables - profilerFiller.push(() -> serverLevel + " " + serverLevel.dimension().location()); + profilerFiller.push(() -> serverLevel + " " + serverLevel.dimension().identifier()); /* Drop global time updates if (this.tickCount % 20 == 0) { diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 6f1a3d9323f3d84b6b0f5d443c0875a98e435f59..b8b641caf8b82f4071bfeff37d50ef65ff2a0505 100644 +index 008053d564869f208823f4d107823fed5fbaab66..6f86d2d29afa79ebe5c29d1d062089f1769b7767 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -224,6 +224,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -230,6 +230,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe public boolean hasPhysicsEvent = true; // Paper - BlockPhysicsEvent public boolean hasEntityMoveEvent; // Paper - Add EntityMoveEvent private final alternate.current.wire.WireHandler wireHandler = new alternate.current.wire.WireHandler(this); // Paper - optimize redstone (Alternate Current) @@ -42,10 +42,10 @@ index 6f1a3d9323f3d84b6b0f5d443c0875a98e435f59..b8b641caf8b82f4071bfeff37d50ef65 @Override public @Nullable LevelChunk getChunkIfLoaded(int x, int z) { diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index d4b57465b7d49f8000de31f75c49f3f7ed333419..3624c08509131b1acbeaffc8c90f8b52d16d8d52 100644 +index fba5c4e2ea656df6f487644f1c76e4245b0ba4ca..8d32717e8cc3c6880cb9ff10904114269dff7d67 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -775,6 +775,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -767,6 +767,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.trackEnteredOrExitedLavaOnVehicle(); this.updatePlayerAttributes(); this.advancements.flushDirty(this, true); @@ -62,10 +62,10 @@ index d4b57465b7d49f8000de31f75c49f3f7ed333419..3624c08509131b1acbeaffc8c90f8b52 private void updatePlayerAttributes() { diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index caae7fc98d13ad92d17b6869b1fe86a79a1f5ba6..cb8d0109932116776dd3be33986d1e1ef775d121 100644 +index 4b4a4698673725b058072034fb525eeb941c0489..b89c73e74216333f5ac70ee9c80bdbea61cc47b5 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2863,6 +2863,8 @@ public class ServerGamePacketListenerImpl +@@ -2902,6 +2902,8 @@ public class ServerGamePacketListenerImpl ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); final boolean resendData = event.isCancelled() || !ServerGamePacketListenerImpl.this.player.getItemInHand(hand).is(itemType); @@ -75,10 +75,10 @@ index caae7fc98d13ad92d17b6869b1fe86a79a1f5ba6..cb8d0109932116776dd3be33986d1e1e if (itemType == Items.WATER_BUCKET && target instanceof net.minecraft.world.entity.animal.Bucketable && target instanceof LivingEntity && resendData) { target.resendPossiblyDesyncedEntityData(ServerGamePacketListenerImpl.this.player); // Paper - The entire mob gets deleted, so resend it diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 96320494c8c738d86d33820c4acfb504291dc58c..046cf7d2146f68bf1b959ae19fd034a241e12164 100644 +index 4100869ad757a784a1096c1997707b1b8715ce0b..56a066c5452ee9fc16d176df46ecfbd9584a3783 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -3353,6 +3353,13 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -3369,6 +3369,13 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name this.passengers = ImmutableList.copyOf(list); } @@ -92,7 +92,7 @@ index 96320494c8c738d86d33820c4acfb504291dc58c..046cf7d2146f68bf1b959ae19fd034a2 } } -@@ -3393,6 +3400,14 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -3409,6 +3416,14 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name return false; } // CraftBukkit end @@ -107,7 +107,7 @@ index 96320494c8c738d86d33820c4acfb504291dc58c..046cf7d2146f68bf1b959ae19fd034a2 if (this.passengers.size() == 1 && this.passengers.get(0) == passenger) { this.passengers = ImmutableList.of(); } else { -@@ -5435,4 +5450,44 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -5460,4 +5475,44 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name return ((ServerLevel) this.level()).isPositionEntityTicking(this.blockPosition()); } // Paper end - Expose entity id counter @@ -152,35 +152,11 @@ index 96320494c8c738d86d33820c4acfb504291dc58c..046cf7d2146f68bf1b959ae19fd034a2 + } + // Purpur end - Ridables } -diff --git a/net/minecraft/world/entity/GlowSquid.java b/net/minecraft/world/entity/GlowSquid.java -index 70790f4e813bb950e103314644bd1d767edb4123..8a10da9409e19b03b559d14c6f5238b5393545c7 100644 ---- a/net/minecraft/world/entity/GlowSquid.java -+++ b/net/minecraft/world/entity/GlowSquid.java -@@ -34,6 +34,19 @@ public class GlowSquid extends Squid { - } - // Purpur end - Flying squids! Oh my! - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.glowSquidRidable; -+ } -+ -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.glowSquidControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected ParticleOptions getInkParticle() { - return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 679073e7cd4e96a018b9bc6598b2c6fb385f1688..28a6316996fe44228539bd54b019ef40f016f967 100644 +index cc5d69971d56b3f78284a03b885e3539b228a10a..63e847182bb030322e1e4b17b5f886ef58d975bb 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -240,9 +240,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -244,9 +244,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin protected int noActionTime; public float lastHurt; public boolean jumping; @@ -193,7 +169,7 @@ index 679073e7cd4e96a018b9bc6598b2c6fb385f1688..28a6316996fe44228539bd54b019ef40 protected InterpolationHandler interpolation = new InterpolationHandler(this); protected double lerpYHeadRot; protected int lerpHeadSteps; -@@ -291,7 +291,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -294,7 +294,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin protected LivingEntity(EntityType type, Level level) { super(type, level); @@ -210,7 +186,7 @@ index 679073e7cd4e96a018b9bc6598b2c6fb385f1688..28a6316996fe44228539bd54b019ef40 @Override protected void checkFallDamage(double y, boolean onGround, BlockState state, BlockPos pos) { -@@ -3066,6 +3067,20 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3111,6 +3112,20 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.5)); } else { @@ -231,7 +207,7 @@ index 679073e7cd4e96a018b9bc6598b2c6fb385f1688..28a6316996fe44228539bd54b019ef40 this.moveRelative(amount, relative); this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.91F)); -@@ -3669,8 +3684,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3799,8 +3814,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.pushEntities(); profilerFiller.pop(); // Paper start - Add EntityMoveEvent @@ -244,7 +220,7 @@ index 679073e7cd4e96a018b9bc6598b2c6fb385f1688..28a6316996fe44228539bd54b019ef40 Location from = new Location(this.level().getWorld(), this.xo, this.yo, this.zo, this.yRotO, this.xRotO); Location to = new Location(this.level().getWorld(), this.getX(), this.getY(), this.getZ(), this.getYRot(), this.getXRot()); io.papermc.paper.event.entity.EntityMoveEvent event = new io.papermc.paper.event.entity.EntityMoveEvent(this.getBukkitLivingEntity(), from, to.clone()); -@@ -3680,6 +3697,21 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3810,6 +3827,21 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.absSnapTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch()); } } @@ -267,7 +243,7 @@ index 679073e7cd4e96a018b9bc6598b2c6fb385f1688..28a6316996fe44228539bd54b019ef40 // Paper end - Add EntityMoveEvent if (this.level() instanceof ServerLevel serverLevel && this.isSensitiveToWater() && this.isInWaterOrRain()) { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 7d98c5aaf29d2204ed43f221f95913ac749419db..bb1d33f759b74174f5c1a45c351a2d2c243c4f03 100644 +index e79d46bc349d8db559086e1f563b2c0a7793b6e4..d8faed1fc3ead010f0abd8ffdf3428881472a25c 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -156,8 +156,8 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab @@ -281,7 +257,15 @@ index 7d98c5aaf29d2204ed43f221f95913ac749419db..bb1d33f759b74174f5c1a45c351a2d2c this.jumpControl = new JumpControl(this); this.bodyRotationControl = this.createBodyControl(); this.navigation = this.createNavigation(level); -@@ -1322,7 +1322,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -594,6 +594,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + } + } + } else { ++ if (getRider() == null || !this.isControllable()) // Purpur - Ridables + this.igniteForSeconds(8.0F); + } + } +@@ -1357,7 +1358,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab } protected InteractionResult mobInteract(Player player, InteractionHand hand) { @@ -290,9 +274,9 @@ index 7d98c5aaf29d2204ed43f221f95913ac749419db..bb1d33f759b74174f5c1a45c351a2d2c } protected void usePlayerItem(Player player, InteractionHand hand, ItemStack stack) { -@@ -1673,4 +1673,58 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab - registrar.register(DebugSubscriptions.BRAINS, () -> DebugBrainDump.takeBrainDump(level, this)); - } +@@ -1697,4 +1698,58 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + public float chargeSpeedModifier() { + return 1.0F; } + + // Purpur start - Ridables @@ -350,7 +334,7 @@ index 7d98c5aaf29d2204ed43f221f95913ac749419db..bb1d33f759b74174f5c1a45c351a2d2c + // Purpur end - Ridables } diff --git a/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/net/minecraft/world/entity/ai/attributes/AttributeMap.java -index fdb02fc40579866167e8cc9bcefbd961588b53a6..7dd8c1c8e27410854ce1ee90defc607c2710b5a2 100644 +index 92b7f4cbd276dad49cba78514db3552af8cdd80c..fd26471047cc5bef28ee9ddba4a8542deef889cc 100644 --- a/net/minecraft/world/entity/ai/attributes/AttributeMap.java +++ b/net/minecraft/world/entity/ai/attributes/AttributeMap.java @@ -18,14 +18,21 @@ public class AttributeMap { @@ -385,14 +369,14 @@ index fdb02fc40579866167e8cc9bcefbd961588b53a6..7dd8c1c8e27410854ce1ee90defc607c + return this.attributes.values().stream().filter(instance -> instance.getAttribute().value().isClientSyncable() && (entity == null || entity.shouldSendAttribute(instance.getAttribute().value()))).collect(Collectors.toList()); // Purpur - Ridables } - @Nullable + public @Nullable AttributeInstance getInstance(Holder attribute) { diff --git a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -index 942cda3d411e579fb5fd2f2edf0be59cc7bdbee8..d9aefe5777fa545d67621bc1ce2ef6a11ca9b27c 100644 +index 6cf01fe1aac41af171b444ac737816a06bd80d6f..686776bb00560f9da8838bd5f8dd64aaddfa7a2b 100644 --- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -@@ -136,7 +136,7 @@ public class DefaultAttributes { - .put(EntityType.OCELOT, Ocelot.createAttributes().build()) +@@ -142,7 +142,7 @@ public class DefaultAttributes { .put(EntityType.PANDA, Panda.createAttributes().build()) + .put(EntityType.PARCHED, Parched.createAttributes().build()) .put(EntityType.PARROT, Parrot.createAttributes().build()) - .put(EntityType.PHANTOM, Monster.createMonsterAttributes().build()) + .put(EntityType.PHANTOM, net.minecraft.world.entity.monster.Phantom.createAttributes().build()) // Purpur - Ridables @@ -447,10 +431,10 @@ index d7f9b3b2b1077ea10e8f64b87c8f4c4354e90858..713f62b34a91fa76f40e49a5e390145f this.lookAtCooldown--; this.getYRotD().ifPresent(rotationWanted -> this.mob.yHeadRot = this.rotateTowards(this.mob.yHeadRot, rotationWanted + 20.0F, this.yMaxRotSpeed)); diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index acb402027bbb16a1b590415b2358cf03147119c0..0720d331eaae7c9f12d654cef278ffcf7510597b 100644 +index ca68d356e892e0ac8a651ced92aab7dbfd4699b4..2cfcf1f7473d8612777ca0752f6d1521c231ef42 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java -@@ -45,11 +45,58 @@ public class Bat extends AmbientCreature { +@@ -42,11 +42,58 @@ public class Bat extends AmbientCreature { public Bat(EntityType type, Level level) { super(type, level); @@ -509,7 +493,7 @@ index acb402027bbb16a1b590415b2358cf03147119c0..0720d331eaae7c9f12d654cef278ffcf @Override public boolean isFlapping() { return !this.isResting() && this.tickCount % 10.0F == 0.0F; -@@ -101,7 +148,7 @@ public class Bat extends AmbientCreature { +@@ -97,7 +144,7 @@ public class Bat extends AmbientCreature { } public static AttributeSupplier.Builder createAttributes() { @@ -518,7 +502,7 @@ index acb402027bbb16a1b590415b2358cf03147119c0..0720d331eaae7c9f12d654cef278ffcf } public boolean isResting() { -@@ -132,6 +179,14 @@ public class Bat extends AmbientCreature { +@@ -128,6 +175,14 @@ public class Bat extends AmbientCreature { @Override protected void customServerAiStep(ServerLevel level) { @@ -533,93 +517,174 @@ index acb402027bbb16a1b590415b2358cf03147119c0..0720d331eaae7c9f12d654cef278ffcf super.customServerAiStep(level); BlockPos blockPos = this.blockPosition(); BlockPos blockPos1 = blockPos.above(); -diff --git a/net/minecraft/world/entity/animal/AbstractCow.java b/net/minecraft/world/entity/animal/AbstractCow.java -index 439d0dfabf9263bfbfb727b87dba17e848f6e66c..ce578519ad26d1086a81ebf2a2b698d1bee643af 100644 ---- a/net/minecraft/world/entity/animal/AbstractCow.java -+++ b/net/minecraft/world/entity/animal/AbstractCow.java -@@ -37,6 +37,7 @@ public abstract class AbstractCow extends Animal { - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new PanicGoal(this, 2.0)); - this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); - this.goalSelector.addGoal(3, new TemptGoal(this, 1.25, itemStack -> level().purpurConfig.cowFeedMushrooms > 0 && (itemStack.is(net.minecraft.world.level.block.Blocks.RED_MUSHROOM.asItem()) || itemStack.is(net.minecraft.world.level.block.Blocks.BROWN_MUSHROOM.asItem())) || itemStack.is(ItemTags.COW_FOOD), false)); // Purpur - Cows eat mushrooms -@@ -82,13 +83,14 @@ public abstract class AbstractCow extends Animal { +diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java +index 0591dc9c39f94768c5ebf74cad7bae98921ff66c..6ab6305f0b25f7c860673c70d9ce911688ecf1e6 100644 +--- a/net/minecraft/world/entity/animal/allay/Allay.java ++++ b/net/minecraft/world/entity/animal/allay/Allay.java +@@ -113,10 +113,23 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS + private float spinningAnimationTicks; + private float spinningAnimationTicks0; + public boolean forceDancing = false; // CraftBukkit ++ private org.purpurmc.purpur.controller.FlyingMoveControllerWASD purpurController; // Purpur - Ridables - @Override - public InteractionResult mobInteract(Player player, InteractionHand hand) { -+ if (getRider() != null) return InteractionResult.PASS; // Purpur - Ridables - ItemStack itemInHand = player.getItemInHand(hand); - if (itemInHand.is(Items.BUCKET) && !this.isBaby()) { - // CraftBukkit start - Got milk? - org.bukkit.event.player.PlayerBucketFillEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerBucketFillEvent(player.level(), player, this.blockPosition(), this.blockPosition(), null, itemInHand, Items.MILK_BUCKET, hand); - if (event.isCancelled()) { - player.containerMenu.sendAllDataToRemote(); // Paper - Fix inventory desync -- return InteractionResult.PASS; -+ return tryRide(player, hand); // Purpur - Ridables - } - // CraftBukkit end - player.playSound(SoundEvents.COW_MILK, 1.0F, 1.0F); -diff --git a/net/minecraft/world/entity/animal/AbstractFish.java b/net/minecraft/world/entity/animal/AbstractFish.java -index ee762c5f6bba53e78ba7c478ebfad19f017f31ca..9ffd362fbf977e5df272ca78927cd02f0a7191f3 100644 ---- a/net/minecraft/world/entity/animal/AbstractFish.java -+++ b/net/minecraft/world/entity/animal/AbstractFish.java -@@ -90,6 +90,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { - @Override - protected void registerGoals() { - super.registerGoals(); + public Allay(EntityType type, Level level) { + super(type, level); +- this.moveControl = new FlyingMoveControl(this, 20, true); ++ // Purpur start - Ridables ++ this.purpurController = new org.purpurmc.purpur.controller.FlyingMoveControllerWASD(this, 0.1F, 0.5F); ++ this.moveControl = new FlyingMoveControl(this, 20, true) { ++ @Override ++ public void tick() { ++ if (mob.getRider() != null && mob.isControllable()) { ++ purpurController.purpurTick(mob.getRider()); ++ } else { ++ super.tick(); ++ } ++ } ++ }; ++ // Purpur end - Ridables + this.setCanPickUpLoot(this.canPickUpLoot()); + this.vibrationUser = new Allay.VibrationUser(); + this.vibrationData = new VibrationSystem.Data(); +@@ -132,6 +145,28 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS + } + // CraftBukkit end + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.allayRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.allayRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.allayControllable; ++ } ++ ++ @Override ++ protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(0, new PanicGoal(this, 1.25)); - this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 1.6, 1.4, EntitySelector.NO_SPECTATORS::test)); - this.goalSelector.addGoal(4, new AbstractFish.FishSwimGoal(this)); -@@ -103,7 +104,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { ++ } ++ // Purpur end - Ridables ++ @Override - public void travel(Vec3 travelVector) { - if (this.isInWater()) { -- this.moveRelative(0.01F, travelVector); -+ this.moveRelative(getRider() != null ? getSpeed() : 0.01F, travelVector); // Purpur - Ridables - this.move(MoverType.SELF, this.getDeltaMovement()); - this.setDeltaMovement(this.getDeltaMovement().scale(0.9)); - if (this.getTarget() == null) { -@@ -163,7 +164,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { - protected void playStepSound(BlockPos pos, BlockState block) { + protected Brain.Provider brainProvider() { + return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); +@@ -227,6 +262,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS + protected void customServerAiStep(ServerLevel level) { + ProfilerFiller profilerFiller = Profiler.get(); + profilerFiller.push("allayBrain"); ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider + this.getBrain().tick(level, this); + profilerFiller.pop(); + profilerFiller.push("allayActivityUpdate"); +diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java +index 901e4e9897e76cd4158d7f8bb8ec829df8ff8196..767a730baa8a7694ed7d5f05b70118da1f4288cc 100644 +--- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java ++++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java +@@ -82,6 +82,23 @@ public class Armadillo extends Animal { + return Animal.createAnimalAttributes().add(Attributes.MAX_HEALTH, 12.0).add(Attributes.MOVEMENT_SPEED, 0.14); } -- static class FishMoveControl extends MoveControl { -+ static class FishMoveControl extends org.purpurmc.purpur.controller.WaterMoveControllerWASD { // Purpur - Ridables - private final AbstractFish fish; ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.armadilloRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.armadilloRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.armadilloControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java +index 2e5291af79a04ff7ebfc533596a008b404571214..3837397563bf3d568c120ae4e4e38d1a6dc7a8b2 100644 +--- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java ++++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java +@@ -121,6 +121,23 @@ public class Axolotl extends Animal implements Bucketable { + this.lookControl = new Axolotl.AxolotlLookControl(this, 20); + } - FishMoveControl(AbstractFish mob) { -@@ -171,14 +172,22 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { - this.fish = mob; ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.axolotlRidable; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.axolotlControllable; ++ } ++ ++ @Override ++ protected void registerGoals() { ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables ++ } ++ // Purpur end - Ridables ++ + @Override + public float getWalkTargetValue(BlockPos pos, LevelReader level) { + return 0.0F; +@@ -328,6 +345,7 @@ public class Axolotl extends Animal implements Bucketable { + protected void customServerAiStep(ServerLevel level) { + ProfilerFiller profilerFiller = Profiler.get(); + profilerFiller.push("axolotlBrain"); ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider + this.getBrain().tick(level, this); + profilerFiller.pop(); + profilerFiller.push("axolotlActivityUpdate"); +@@ -564,23 +582,31 @@ public class Axolotl extends Animal implements Bucketable { } -+ // Purpur start - Ridables @Override - public void tick() { -+ public void purpurTick(Player rider) { -+ super.purpurTick(rider); -+ fish.setDeltaMovement(fish.getDeltaMovement().add(0.0D, 0.005D, 0.0D)); -+ } -+ // Purpur end - Ridables -+ -+ @Override + public void vanillaTick() { // Purpur - Ridables - if (this.fish.isEyeInFluid(FluidTags.WATER)) { - this.fish.setDeltaMovement(this.fish.getDeltaMovement().add(0.0, 0.005, 0.0)); + if (!Axolotl.this.isPlayingDead()) { +- super.tick(); ++ super.vanillaTick(); // Purpur - Ridables } + } + } - if (this.operation == MoveControl.Operation.MOVE_TO && !this.fish.getNavigation().isDone()) { -- float f = (float)(this.speedModifier * this.fish.getAttributeValue(Attributes.MOVEMENT_SPEED)); -+ float f = (float)(this.getSpeedModifier() * this.fish.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables - this.fish.setSpeed(Mth.lerp(0.125F, this.fish.getSpeed(), f)); - double d = this.wantedX - this.fish.getX(); - double d1 = this.wantedY - this.fish.getY(); -diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index 3988a8e8ba319e5e80a9fba916b62bdb4996e08f..345f10125d80ead9341d285ed8d3faa3013e5b40 100644 ---- a/net/minecraft/world/entity/animal/Bee.java -+++ b/net/minecraft/world/entity/animal/Bee.java + static class AxolotlMoveControl extends SmoothSwimmingMoveControl { + private final Axolotl axolotl; ++ private final org.purpurmc.purpur.controller.WaterMoveControllerWASD waterController; // Purpur - Ridables + + public AxolotlMoveControl(Axolotl axolotl) { + super(axolotl, 85, 10, 0.1F, 0.5F, false); + this.axolotl = axolotl; ++ waterController = new org.purpurmc.purpur.controller.WaterMoveControllerWASD(axolotl, 0.5D); // Purpur - Ridables + } + + @Override + public void tick() { ++ // Purpur start - Ridables ++ if (axolotl.getRider() != null && axolotl.isControllable()) { ++ waterController.purpurTick(axolotl.getRider()); ++ return; ++ } ++ // Purpur end - Ridables + if (!this.axolotl.isPlayingDead()) { + super.tick(); + } +diff --git a/net/minecraft/world/entity/animal/bee/Bee.java b/net/minecraft/world/entity/animal/bee/Bee.java +index c6290c732af942907413b30d49910a3e3933c71a..d1e23e50bb6b023ecf4475406e23e14d43e89aad 100644 +--- a/net/minecraft/world/entity/animal/bee/Bee.java ++++ b/net/minecraft/world/entity/animal/bee/Bee.java @@ -153,6 +153,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { public Bee(EntityType type, Level level) { @@ -707,10 +772,10 @@ index 3988a8e8ba319e5e80a9fba916b62bdb4996e08f..345f10125d80ead9341d285ed8d3faa3 this.goalSelector.addGoal(8, new Bee.BeeWanderGoal()); this.goalSelector.addGoal(9, new FloatGoal(this)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new Bee.BeeHurtByOtherGoal(this).setAlertOthers(new Class[0])); + this.targetSelector.addGoal(1, new Bee.BeeHurtByOtherGoal(this).setAlertOthers()); this.targetSelector.addGoal(2, new Bee.BeeBecomeAngryTargetGoal(this)); this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); -@@ -1087,15 +1137,15 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1079,15 +1129,15 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } @@ -729,68 +794,29 @@ index 3988a8e8ba319e5e80a9fba916b62bdb4996e08f..345f10125d80ead9341d285ed8d3faa3 } } -diff --git a/net/minecraft/world/entity/animal/Cat.java b/net/minecraft/world/entity/animal/Cat.java -index f6912836026638900fa5929b9550386a004fef11..dc207012d233de1fa056bb318e3e143496743ebb 100644 ---- a/net/minecraft/world/entity/animal/Cat.java -+++ b/net/minecraft/world/entity/animal/Cat.java -@@ -93,10 +93,36 @@ public class Cat extends TamableAnimal { - this.reassessTameGoals(); +diff --git a/net/minecraft/world/entity/animal/camel/Camel.java b/net/minecraft/world/entity/animal/camel/Camel.java +index 98721e4d406385108b3d63e9e811f730454090e7..a6a66084323435697b3185d7b86acaf5c7453719 100644 +--- a/net/minecraft/world/entity/animal/camel/Camel.java ++++ b/net/minecraft/world/entity/animal/camel/Camel.java +@@ -90,6 +90,13 @@ public class Camel extends AbstractHorse { + groundPathNavigation.setCanWalkOverFences(true); } + // Purpur start - Ridables + @Override -+ public boolean isRidable() { -+ return level().purpurConfig.catRidable; -+ } -+ -+ @Override + public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.catRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.catControllable; -+ } -+ -+ @Override -+ public void onMount(Player rider) { -+ super.onMount(rider); -+ setInSittingPose(false); -+ setLying(false); -+ setRelaxStateOne(false); ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.camelRidableInWater; + } + // Purpur end - Ridables + @Override - protected void registerGoals() { - this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); - this.goalSelector.addGoal(1, new FloatGoal(this)); -+ this.goalSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new TamableAnimal.TamableAnimalPanicGoal(1.5)); - this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); - this.goalSelector.addGoal(3, new Cat.CatRelaxOnOwnerGoal(this)); -@@ -109,6 +135,7 @@ public class Cat extends TamableAnimal { - this.goalSelector.addGoal(10, new BreedGoal(this, 0.8)); - this.goalSelector.addGoal(11, new WaterAvoidingRandomStrollGoal(this, 0.8, 1.0000001E-5F)); - this.goalSelector.addGoal(12, new LookAtPlayerGoal(this, Player.class, 10.0F)); -+ this.targetSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Rabbit.class, false, null)); - this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR)); - } -@@ -375,6 +402,7 @@ public class Cat extends TamableAnimal { - - @Override - public InteractionResult mobInteract(Player player, InteractionHand hand) { -+ if (getRider() != null) return InteractionResult.PASS; // Purpur - Ridables - ItemStack itemInHand = player.getItemInHand(hand); - Item item = itemInHand.getItem(); - if (this.isTame()) { -diff --git a/net/minecraft/world/entity/animal/Chicken.java b/net/minecraft/world/entity/animal/Chicken.java -index 59b634a186cfb7b1bb6205ec0db76b1e3d2523c2..bb261f049e28dd5fec00d92a844a1eaa4e8e0ca3 100644 ---- a/net/minecraft/world/entity/animal/Chicken.java -+++ b/net/minecraft/world/entity/animal/Chicken.java -@@ -72,9 +72,27 @@ public class Chicken extends Animal { + protected void addAdditionalSaveData(ValueOutput output) { + super.addAdditionalSaveData(output); +diff --git a/net/minecraft/world/entity/animal/chicken/Chicken.java b/net/minecraft/world/entity/animal/chicken/Chicken.java +index b44367e42793cec9af35f50dffff479b4be7b728..4961bb85b91f68075cf0d22440d6377d9fcb7721 100644 +--- a/net/minecraft/world/entity/animal/chicken/Chicken.java ++++ b/net/minecraft/world/entity/animal/chicken/Chicken.java +@@ -73,9 +73,27 @@ public class Chicken extends Animal { this.setPathfindingMalus(PathType.WATER, 0.0F); } @@ -818,33 +844,38 @@ index 59b634a186cfb7b1bb6205ec0db76b1e3d2523c2..bb261f049e28dd5fec00d92a844a1eaa this.goalSelector.addGoal(1, new PanicGoal(this, 1.4)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); this.goalSelector.addGoal(3, new TemptGoal(this, 1.0, itemStack -> itemStack.is(ItemTags.CHICKEN_FOOD), false)); -diff --git a/net/minecraft/world/entity/animal/Cod.java b/net/minecraft/world/entity/animal/Cod.java -index 03fdb604042f6bca069f16d062345e8f45baac23..4bbe60e47cd3710c2dd31a418de38b894eb8247d 100644 ---- a/net/minecraft/world/entity/animal/Cod.java -+++ b/net/minecraft/world/entity/animal/Cod.java -@@ -13,6 +13,18 @@ public class Cod extends AbstractSchoolingFish { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.codRidable; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.codControllable; -+ } -+ // Purpur end - Ridables -+ +diff --git a/net/minecraft/world/entity/animal/cow/AbstractCow.java b/net/minecraft/world/entity/animal/cow/AbstractCow.java +index f6f251227db315b58bee45f8011624a347eb8fea..a25ef3bc802759f61947ef8242c19e9320693d35 100644 +--- a/net/minecraft/world/entity/animal/cow/AbstractCow.java ++++ b/net/minecraft/world/entity/animal/cow/AbstractCow.java +@@ -38,6 +38,7 @@ public abstract class AbstractCow extends Animal { @Override - public ItemStack getBucketItemStack() { - return new ItemStack(Items.COD_BUCKET); -diff --git a/net/minecraft/world/entity/animal/Cow.java b/net/minecraft/world/entity/animal/Cow.java -index 83b399be5af622aa413f1fd6ad82d920ae92b454..380c8e3c9c790d626cd9f8d4b1f13838d0b756ec 100644 ---- a/net/minecraft/world/entity/animal/Cow.java -+++ b/net/minecraft/world/entity/animal/Cow.java + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new PanicGoal(this, 2.0)); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.25, itemStack -> level().purpurConfig.cowFeedMushrooms > 0 && (itemStack.is(net.minecraft.world.level.block.Blocks.RED_MUSHROOM.asItem()) || itemStack.is(net.minecraft.world.level.block.Blocks.BROWN_MUSHROOM.asItem())) || itemStack.is(ItemTags.COW_FOOD), false)); // Purpur - Cows eat mushrooms +@@ -83,13 +84,14 @@ public abstract class AbstractCow extends Animal { + + @Override + public InteractionResult mobInteract(Player player, InteractionHand hand) { ++ if (getRider() != null) return InteractionResult.PASS; // Purpur - Ridables + ItemStack itemInHand = player.getItemInHand(hand); + if (itemInHand.is(Items.BUCKET) && !this.isBaby()) { + // CraftBukkit start - Got milk? + org.bukkit.event.player.PlayerBucketFillEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerBucketFillEvent(player.level(), player, this.blockPosition(), this.blockPosition(), null, itemInHand, Items.MILK_BUCKET, hand); + if (event.isCancelled()) { + player.containerMenu.sendAllDataToRemote(); // Paper - Fix inventory desync +- return InteractionResult.PASS; ++ return tryRide(player, hand); // Purpur - Ridables + } + // CraftBukkit end + player.playSound(SoundEvents.COW_MILK, 1.0F, 1.0F); +diff --git a/net/minecraft/world/entity/animal/cow/Cow.java b/net/minecraft/world/entity/animal/cow/Cow.java +index f37322e0d90ea055a643b144dd87578df6a0bcc9..0268063bb0db8c30c594a7d75d0d11f7236c3a68 100644 +--- a/net/minecraft/world/entity/animal/cow/Cow.java ++++ b/net/minecraft/world/entity/animal/cow/Cow.java @@ -29,6 +29,23 @@ public class Cow extends AbstractCow { super(type, level); } @@ -869,13 +900,50 @@ index 83b399be5af622aa413f1fd6ad82d920ae92b454..380c8e3c9c790d626cd9f8d4b1f13838 @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/Dolphin.java b/net/minecraft/world/entity/animal/Dolphin.java -index 487a0e850d1d4f4c2e9c1175708712146f809a68..703bb05c293b3ae13745c014cbd5f12864dec003 100644 ---- a/net/minecraft/world/entity/animal/Dolphin.java -+++ b/net/minecraft/world/entity/animal/Dolphin.java +diff --git a/net/minecraft/world/entity/animal/cow/MushroomCow.java b/net/minecraft/world/entity/animal/cow/MushroomCow.java +index ea6299e728d7c7e7a52d7c65d759407ba27c8eac..1a9f5f17e46af831bc6621c83c57e5436397dbc2 100644 +--- a/net/minecraft/world/entity/animal/cow/MushroomCow.java ++++ b/net/minecraft/world/entity/animal/cow/MushroomCow.java +@@ -61,6 +61,23 @@ public class MushroomCow extends AbstractCow implements Shearable { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.mooshroomRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.mooshroomRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.mooshroomControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + public float getWalkTargetValue(BlockPos pos, LevelReader level) { + return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); +@@ -121,7 +138,7 @@ public class MushroomCow extends AbstractCow implements Shearable { + java.util.List drops = this.generateDefaultDrops(serverLevel, itemInHand); + org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemInHand, hand, drops); + if (event != null) { +- if (event.isCancelled()) return InteractionResult.PASS; ++ if (event.isCancelled()) return tryRide(player, hand); // Purpur - Ridables + drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); + // Paper end - custom shear drops + } +diff --git a/net/minecraft/world/entity/animal/dolphin/Dolphin.java b/net/minecraft/world/entity/animal/dolphin/Dolphin.java +index 45b6707ce9944a6a69f51196c3323821648d500b..656335a3bd021efc538ab407673c09a83178ed7c 100644 +--- a/net/minecraft/world/entity/animal/dolphin/Dolphin.java ++++ b/net/minecraft/world/entity/animal/dolphin/Dolphin.java @@ -76,14 +76,82 @@ public class Dolphin extends AgeableWaterCreature { - @Nullable - public BlockPos treasurePos; + private static final boolean DEFAULT_GOT_FISH = false; + @Nullable public BlockPos treasurePos; private boolean isNaturallyAggressiveToPlayers; // Purpur - Dolphins naturally aggressive to players chance + private int spitCooldown; // Purpur - Ridables @@ -954,10 +1022,10 @@ index 487a0e850d1d4f4c2e9c1175708712146f809a68..703bb05c293b3ae13745c014cbd5f128 + } + // Purpur end - Ridables + - @Nullable @Override - public SpawnGroupData finalizeSpawn( -@@ -160,6 +228,7 @@ public class Dolphin extends AgeableWaterCreature { + public @Nullable SpawnGroupData finalizeSpawn( + ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData +@@ -158,6 +226,7 @@ public class Dolphin extends AgeableWaterCreature { this.goalSelector.addGoal(0, new BreathAirGoal(this)); this.goalSelector.addGoal(0, new TryFindWaterGoal(this)); this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.2000000476837158D, true)); // Purpur - Dolphins naturally aggressive to players chance @@ -965,7 +1033,7 @@ index 487a0e850d1d4f4c2e9c1175708712146f809a68..703bb05c293b3ae13745c014cbd5f128 this.goalSelector.addGoal(1, new Dolphin.DolphinSwimToTreasureGoal(this)); this.goalSelector.addGoal(2, new Dolphin.DolphinSwimWithPlayerGoal(this, 4.0)); this.goalSelector.addGoal(4, new RandomSwimmingGoal(this, 1.0, 10)); -@@ -170,6 +239,7 @@ public class Dolphin extends AgeableWaterCreature { +@@ -168,6 +237,7 @@ public class Dolphin extends AgeableWaterCreature { this.goalSelector.addGoal(8, new Dolphin.PlayWithItemsGoal()); this.goalSelector.addGoal(8, new FollowBoatGoal(this)); this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, Guardian.class, 8.0F, 1.0, 1.0)); @@ -973,7 +1041,7 @@ index 487a0e850d1d4f4c2e9c1175708712146f809a68..703bb05c293b3ae13745c014cbd5f128 this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Guardian.class).setAlertOthers()); this.targetSelector.addGoal(2, new net.minecraft.world.entity.ai.goal.target.NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (ignored, ignored2) -> isNaturallyAggressiveToPlayers)); // Purpur - Dolphins naturally aggressive to players chance } -@@ -215,7 +285,7 @@ public class Dolphin extends AgeableWaterCreature { +@@ -213,7 +283,7 @@ public class Dolphin extends AgeableWaterCreature { @Override protected boolean canRide(Entity entity) { @@ -982,7 +1050,7 @@ index 487a0e850d1d4f4c2e9c1175708712146f809a68..703bb05c293b3ae13745c014cbd5f128 } @Override -@@ -244,6 +314,11 @@ public class Dolphin extends AgeableWaterCreature { +@@ -242,6 +312,11 @@ public class Dolphin extends AgeableWaterCreature { @Override public void tick() { super.tick(); @@ -994,11 +1062,507 @@ index 487a0e850d1d4f4c2e9c1175708712146f809a68..703bb05c293b3ae13745c014cbd5f128 if (this.isNoAi()) { this.setAirSupply(this.getMaxAirSupply()); } else { -diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java -index 30a781b28fc4c78ca581fba405fae66f5b72251e..1da6563a3a1d85e562b85435bb27cd82bbc05faf 100644 ---- a/net/minecraft/world/entity/animal/Fox.java -+++ b/net/minecraft/world/entity/animal/Fox.java -@@ -144,6 +144,44 @@ public class Fox extends Animal { +diff --git a/net/minecraft/world/entity/animal/equine/AbstractHorse.java b/net/minecraft/world/entity/animal/equine/AbstractHorse.java +index e837c63631c637238b9fe0ba05984af5e0d2b833..a1dce0a5ce1fcd0a2ff7104b3592ffd5c948db34 100644 +--- a/net/minecraft/world/entity/animal/equine/AbstractHorse.java ++++ b/net/minecraft/world/entity/animal/equine/AbstractHorse.java +@@ -128,11 +128,21 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory + + protected AbstractHorse(EntityType type, Level level) { + super(type, level); ++ this.moveControl = new net.minecraft.world.entity.ai.control.MoveControl(this); // Purpur - use vanilla controller ++ this.lookControl = new net.minecraft.world.entity.ai.control.LookControl(this); // Purpur - use vanilla controller + this.createInventory(); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return false; // vanilla handles ++ } ++ // Purpur end - Ridables ++ + @Override + protected void registerGoals() { ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new AbstractHorse.MountPanicGoal(1.2)); + this.goalSelector.addGoal(1, new RunAroundLikeCrazyGoal(this, 1.2)); + this.goalSelector.addGoal(2, new BreedGoal(this, 1.0, AbstractHorse.class)); +@@ -143,6 +153,7 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory + if (this.canPerformRearing()) { + this.goalSelector.addGoal(9, new RandomStandGoal(this)); + } ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur - Ridables + + this.addBehaviourGoals(); + } +diff --git a/net/minecraft/world/entity/animal/equine/Donkey.java b/net/minecraft/world/entity/animal/equine/Donkey.java +index 55844fe13c403a55d135ec4ff4731d88601b205e..8aec9f254c82993632e68368d37b8c9bee7869cc 100644 +--- a/net/minecraft/world/entity/animal/equine/Donkey.java ++++ b/net/minecraft/world/entity/animal/equine/Donkey.java +@@ -16,6 +16,13 @@ public class Donkey extends AbstractChestedHorse { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.donkeyRidableInWater; ++ } ++ // Purpur end - Ridables ++ + @Override + public SoundEvent getAmbientSound() { + return SoundEvents.DONKEY_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/equine/Horse.java b/net/minecraft/world/entity/animal/equine/Horse.java +index 1763543942a25a788c0f90241db75ddad70a7da8..cc50151ce6e6daffc1ecd41eb89a0d2f159f651e 100644 +--- a/net/minecraft/world/entity/animal/equine/Horse.java ++++ b/net/minecraft/world/entity/animal/equine/Horse.java +@@ -50,6 +50,13 @@ public class Horse extends AbstractHorse { + this.setPathfindingMalus(PathType.DAMAGE_OTHER, -1.0F); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.horseRidableInWater; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void randomizeAttributes(RandomSource random) { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); +diff --git a/net/minecraft/world/entity/animal/equine/Llama.java b/net/minecraft/world/entity/animal/equine/Llama.java +index cceb66525a4d017b2db21bd301e63670c639223f..bba6493eee2f605faac0d49d665117d2f2c41213 100644 +--- a/net/minecraft/world/entity/animal/equine/Llama.java ++++ b/net/minecraft/world/entity/animal/equine/Llama.java +@@ -82,7 +82,58 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { + super(type, level); + this.getNavigation().setRequiredPathLength(40.0F); + this.maxDomestication = 30; // Paper - Missing entity API; configure max temper instead of a hardcoded value ++ // Purpur start - Ridables ++ this.moveControl = new org.purpurmc.purpur.controller.MoveControllerWASD(this) { ++ @Override ++ public void tick() { ++ if (entity.getRider() != null && entity.isControllable() && isSaddled()) { ++ purpurTick(entity.getRider()); ++ } else { ++ vanillaTick(); ++ } ++ } ++ }; ++ this.lookControl = new org.purpurmc.purpur.controller.LookControllerWASD(this) { ++ @Override ++ public void tick() { ++ if (entity.getRider() != null && entity.isControllable() && isSaddled()) { ++ purpurTick(entity.getRider()); ++ } else { ++ vanillaTick(); ++ } ++ } ++ }; ++ // Purpur end - Ridables ++ } ++ ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.llamaRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.llamaRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.llamaControllable; ++ } ++ ++ @Override ++ public boolean isSaddled() { ++ return super.isWearingBodyArmor() || this.isTamed(); ++ } ++ ++ @Nullable ++ @Override ++ public LivingEntity getControllingPassenger() { ++ Entity firstPassenger = this.getFirstPassenger(); ++ return !this.isNoAi() && firstPassenger instanceof net.minecraft.world.entity.Mob mob && firstPassenger.canControlVehicle() ? mob : null; + } ++ // Purpur end - Ridables + + public boolean isTraderLlama() { + return false; +@@ -120,6 +171,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.LlamaHasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new RunAroundLikeCrazyGoal(this, 1.2)); + this.goalSelector.addGoal(2, new LlamaFollowCaravanGoal(this, 2.1F)); + this.goalSelector.addGoal(3, new RangedAttackGoal(this, 1.25, 40, 20.0F)); +@@ -130,6 +182,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { + this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 0.7)); + this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(9, new RandomLookAroundGoal(this)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.LlamaHasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new Llama.LlamaHurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new Llama.LlamaAttackWolfGoal(this)); + } +diff --git a/net/minecraft/world/entity/animal/equine/Mule.java b/net/minecraft/world/entity/animal/equine/Mule.java +index b5444b88d30e7d375495bdbbe1469beb72beb87a..60c151af9e51ba1dd1063344a3f5c021b6a48440 100644 +--- a/net/minecraft/world/entity/animal/equine/Mule.java ++++ b/net/minecraft/world/entity/animal/equine/Mule.java +@@ -15,6 +15,13 @@ public class Mule extends AbstractChestedHorse { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.muleRidableInWater; ++ } ++ // Purpur end - Ridables ++ + @Override + public SoundEvent getAmbientSound() { + return SoundEvents.MULE_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/equine/SkeletonHorse.java b/net/minecraft/world/entity/animal/equine/SkeletonHorse.java +index 0afb4c836e697f820696bd760cca761520bc8250..3d98259439c3bdb97ab2c66734daf90a56b290ef 100644 +--- a/net/minecraft/world/entity/animal/equine/SkeletonHorse.java ++++ b/net/minecraft/world/entity/animal/equine/SkeletonHorse.java +@@ -43,6 +43,13 @@ public class SkeletonHorse extends AbstractHorse { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isTamed() { ++ return super.isTamed() || this.level().purpurConfig.skeletonHorseRidable; ++ } ++ // Purpur end - Ridables ++ + public static AttributeSupplier.Builder createAttributes() { + return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); + } +@@ -62,6 +69,7 @@ public class SkeletonHorse extends AbstractHorse { + + @Override + protected void addBehaviourGoals() { ++ if (level().purpurConfig.skeletonHorseCanSwim) goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur - Ridables + } + + @Override +diff --git a/net/minecraft/world/entity/animal/equine/TraderLlama.java b/net/minecraft/world/entity/animal/equine/TraderLlama.java +index 44f85dc4075e9fc000dc89ba01e2039c01989dde..68b72c18a3880dead3b32b646a2f6a09d4b98c44 100644 +--- a/net/minecraft/world/entity/animal/equine/TraderLlama.java ++++ b/net/minecraft/world/entity/animal/equine/TraderLlama.java +@@ -31,6 +31,28 @@ public class TraderLlama extends Llama { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.traderLlamaRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.traderLlamaRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.traderLlamaControllable; ++ } ++ ++ @Override ++ public boolean isSaddled() { ++ return super.isSaddled() || isTamed(); ++ } ++ // Purpur end - Ridables ++ + @Override + public boolean isTraderLlama() { + return true; +diff --git a/net/minecraft/world/entity/animal/equine/ZombieHorse.java b/net/minecraft/world/entity/animal/equine/ZombieHorse.java +index 4cfae7e877c6545780a8b9fdb3e326edb8cc7943..c1a13047c673cafc5de873215dd368eae6ac8b5e 100644 +--- a/net/minecraft/world/entity/animal/equine/ZombieHorse.java ++++ b/net/minecraft/world/entity/animal/equine/ZombieHorse.java +@@ -52,6 +52,18 @@ public class ZombieHorse extends AbstractHorse { + this.setPathfindingMalus(PathType.DAMAGE_OTHER, -1.0F); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombieHorseRidableInWater; ++ } ++ ++ @Override ++ public boolean isTamed() { ++ return super.isTamed() || this.level().purpurConfig.zombieHorseRidable; ++ } ++ // Purpur end - Ridables ++ + public static AttributeSupplier.Builder createAttributes() { + return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 25.0); + } +diff --git a/net/minecraft/world/entity/animal/feline/Cat.java b/net/minecraft/world/entity/animal/feline/Cat.java +index 6acd39413ab4fed1eaf251d3b6d9b9e184060e5c..2fe8b8382b7cb4056f4d430cf632ecf413e8e25b 100644 +--- a/net/minecraft/world/entity/animal/feline/Cat.java ++++ b/net/minecraft/world/entity/animal/feline/Cat.java +@@ -95,10 +95,36 @@ public class Cat extends TamableAnimal { + this.reassessTameGoals(); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.catRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.catRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.catControllable; ++ } ++ ++ @Override ++ public void onMount(Player rider) { ++ super.onMount(rider); ++ setInSittingPose(false); ++ setLying(false); ++ setRelaxStateOne(false); ++ } ++ // Purpur end - Ridables ++ + @Override + protected void registerGoals() { + this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); + this.goalSelector.addGoal(1, new FloatGoal(this)); ++ this.goalSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new TamableAnimal.TamableAnimalPanicGoal(1.5)); + this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); + this.goalSelector.addGoal(3, new Cat.CatRelaxOnOwnerGoal(this)); +@@ -111,6 +137,7 @@ public class Cat extends TamableAnimal { + this.goalSelector.addGoal(10, new BreedGoal(this, 0.8)); + this.goalSelector.addGoal(11, new WaterAvoidingRandomStrollGoal(this, 0.8, 1.0000001E-5F)); + this.goalSelector.addGoal(12, new LookAtPlayerGoal(this, Player.class, 10.0F)); ++ this.targetSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Rabbit.class, false, null)); + this.targetSelector.addGoal(1, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR)); + } +@@ -373,6 +400,7 @@ public class Cat extends TamableAnimal { + + @Override + public InteractionResult mobInteract(Player player, InteractionHand hand) { ++ if (getRider() != null) return InteractionResult.PASS; // Purpur - Ridables + ItemStack itemInHand = player.getItemInHand(hand); + Item item = itemInHand.getItem(); + if (this.isTame()) { +diff --git a/net/minecraft/world/entity/animal/feline/Ocelot.java b/net/minecraft/world/entity/animal/feline/Ocelot.java +index 94fdbae92dabf7505a7c7b518d4c07b4f68c8e9c..22fa29aa785eda8fb4a895d36413626da8a49a0e 100644 +--- a/net/minecraft/world/entity/animal/feline/Ocelot.java ++++ b/net/minecraft/world/entity/animal/feline/Ocelot.java +@@ -66,6 +66,23 @@ public class Ocelot extends Animal { + this.reassessTrustingGoals(); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.ocelotRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.ocelotRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.ocelotControllable; ++ } ++ // Purpur end - Ridables ++ + public boolean isTrusting() { + return this.entityData.get(DATA_TRUSTING); + } +@@ -97,12 +114,14 @@ public class Ocelot extends Animal { + protected void registerGoals() { + this.temptGoal = new Ocelot.OcelotTemptGoal(this, 0.6, itemStack -> itemStack.is(ItemTags.OCELOT_FOOD), true); + this.goalSelector.addGoal(1, new FloatGoal(this)); ++ this.goalSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(3, this.temptGoal); + this.goalSelector.addGoal(7, new LeapAtTargetGoal(this, 0.3F)); + this.goalSelector.addGoal(8, new OcelotAttackGoal(this)); + this.goalSelector.addGoal(9, new BreedGoal(this, 0.8)); + this.goalSelector.addGoal(10, new WaterAvoidingRandomStrollGoal(this, 0.8, 1.0000001E-5F)); + this.goalSelector.addGoal(11, new LookAtPlayerGoal(this, Player.class, 10.0F)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Chicken.class, false)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, false, false, Turtle.BABY_ON_LAND_SELECTOR)); + } +diff --git a/net/minecraft/world/entity/animal/fish/AbstractFish.java b/net/minecraft/world/entity/animal/fish/AbstractFish.java +index 7b4215058325812e8dc785277d1ece0fd5dd6ea3..970904ce07ebc6aabc97166284cbb855d2976f09 100644 +--- a/net/minecraft/world/entity/animal/fish/AbstractFish.java ++++ b/net/minecraft/world/entity/animal/fish/AbstractFish.java +@@ -91,6 +91,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { + @Override + protected void registerGoals() { + super.registerGoals(); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(0, new PanicGoal(this, 1.25)); + this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 1.6, 1.4, EntitySelector.NO_SPECTATORS)); + this.goalSelector.addGoal(4, new AbstractFish.FishSwimGoal(this)); +@@ -103,7 +104,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { + + @Override + protected void travelInWater(Vec3 travelVector, double gravity, boolean isFalling, double previousY) { +- this.moveRelative(0.01F, travelVector); ++ this.moveRelative(getRider() != null ? getSpeed() : 0.01F, travelVector); // Purpur - Ridables + this.move(MoverType.SELF, this.getDeltaMovement()); + this.setDeltaMovement(this.getDeltaMovement().scale(0.9)); + if (this.getTarget() == null) { +@@ -160,7 +161,7 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { + protected void playStepSound(BlockPos pos, BlockState block) { + } + +- static class FishMoveControl extends MoveControl { ++ static class FishMoveControl extends org.purpurmc.purpur.controller.WaterMoveControllerWASD { // Purpur - Ridables + private final AbstractFish fish; + + FishMoveControl(AbstractFish mob) { +@@ -168,14 +169,22 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { + this.fish = mob; + } + ++ // Purpur start - Ridables + @Override +- public void tick() { ++ public void purpurTick(Player rider) { ++ super.purpurTick(rider); ++ fish.setDeltaMovement(fish.getDeltaMovement().add(0.0D, 0.005D, 0.0D)); ++ } ++ // Purpur end - Ridables ++ ++ @Override ++ public void vanillaTick() { // Purpur - Ridables + if (this.fish.isEyeInFluid(FluidTags.WATER)) { + this.fish.setDeltaMovement(this.fish.getDeltaMovement().add(0.0, 0.005, 0.0)); + } + + if (this.operation == MoveControl.Operation.MOVE_TO && !this.fish.getNavigation().isDone()) { +- float f = (float)(this.speedModifier * this.fish.getAttributeValue(Attributes.MOVEMENT_SPEED)); ++ float f = (float)(this.getSpeedModifier() * this.fish.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables + this.fish.setSpeed(Mth.lerp(0.125F, this.fish.getSpeed(), f)); + double d = this.wantedX - this.fish.getX(); + double d1 = this.wantedY - this.fish.getY(); +diff --git a/net/minecraft/world/entity/animal/fish/Cod.java b/net/minecraft/world/entity/animal/fish/Cod.java +index 9a473f29931059e36a6fe8fa541c4706ababf59d..f73b3f5ae65f7793ff25145c72fb35e3daec8494 100644 +--- a/net/minecraft/world/entity/animal/fish/Cod.java ++++ b/net/minecraft/world/entity/animal/fish/Cod.java +@@ -13,6 +13,18 @@ public class Cod extends AbstractSchoolingFish { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.codRidable; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.codControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + public ItemStack getBucketItemStack() { + return new ItemStack(Items.COD_BUCKET); +diff --git a/net/minecraft/world/entity/animal/fish/Pufferfish.java b/net/minecraft/world/entity/animal/fish/Pufferfish.java +index d8280671bb36d57b86a5d212d8deae9acc745bd4..1eaa5e5fb65b18e5042d69b5dbfea15a7271c0aa 100644 +--- a/net/minecraft/world/entity/animal/fish/Pufferfish.java ++++ b/net/minecraft/world/entity/animal/fish/Pufferfish.java +@@ -47,6 +47,18 @@ public class Pufferfish extends AbstractFish { + this.refreshDimensions(); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.pufferfishRidable; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.pufferfishControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/fish/Salmon.java b/net/minecraft/world/entity/animal/fish/Salmon.java +index c691912a8b109e7430ffb39bb832983cbf33fc8a..b362ce156765ad45b8c29b5dc2c6d9d99d2e1474 100644 +--- a/net/minecraft/world/entity/animal/fish/Salmon.java ++++ b/net/minecraft/world/entity/animal/fish/Salmon.java +@@ -40,6 +40,18 @@ public class Salmon extends AbstractSchoolingFish { + this.refreshDimensions(); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.salmonRidable; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.salmonControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + public int getMaxSchoolSize() { + return 5; +diff --git a/net/minecraft/world/entity/animal/fish/TropicalFish.java b/net/minecraft/world/entity/animal/fish/TropicalFish.java +index e3961892ffc05bef4947bda75445ca5e255dce11..3281e75c48fb6cafdba088254009e5b4285b3819 100644 +--- a/net/minecraft/world/entity/animal/fish/TropicalFish.java ++++ b/net/minecraft/world/entity/animal/fish/TropicalFish.java +@@ -77,6 +77,18 @@ public class TropicalFish extends AbstractSchoolingFish { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.tropicalFishRidable; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.tropicalFishControllable; ++ } ++ // Purpur end - Ridables ++ + public static String getPredefinedName(int variantId) { + return "entity.minecraft.tropical_fish.predefined." + variantId; + } +diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java +index 6d0eb7e0310b3fdd234dee5b8bf993d1c5ef27f1..bf00cf5e6fd8b9143e1b327ef7b90ae055d264ff 100644 +--- a/net/minecraft/world/entity/animal/fox/Fox.java ++++ b/net/minecraft/world/entity/animal/fox/Fox.java +@@ -151,6 +151,44 @@ public class Fox extends Animal { this.getNavigation().setRequiredPathLength(32.0F); } @@ -1043,7 +1607,7 @@ index 30a781b28fc4c78ca581fba405fae66f5b72251e..1da6563a3a1d85e562b85435bb27cd82 @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -@@ -163,6 +201,7 @@ public class Fox extends Animal { +@@ -170,6 +208,7 @@ public class Fox extends Animal { this, AbstractFish.class, 20, false, false, (entity, level) -> entity instanceof AbstractSchoolingFish ); this.goalSelector.addGoal(0, new Fox.FoxFloatGoal()); @@ -1051,7 +1615,7 @@ index 30a781b28fc4c78ca581fba405fae66f5b72251e..1da6563a3a1d85e562b85435bb27cd82 this.goalSelector.addGoal(0, new ClimbOnTopOfPowderSnowGoal(this, this.level())); this.goalSelector.addGoal(1, new Fox.FaceplantGoal()); this.goalSelector.addGoal(2, new Fox.FoxPanicGoal(2.2)); -@@ -188,6 +227,7 @@ public class Fox extends Animal { +@@ -195,6 +234,7 @@ public class Fox extends Animal { this.goalSelector.addGoal(11, new Fox.FoxSearchForItemsGoal()); this.goalSelector.addGoal(12, new Fox.FoxLookAtPlayerGoal(this, Player.class, 24.0F)); this.goalSelector.addGoal(13, new Fox.PerchAndSearchGoal()); @@ -1059,7 +1623,7 @@ index 30a781b28fc4c78ca581fba405fae66f5b72251e..1da6563a3a1d85e562b85435bb27cd82 this.targetSelector .addGoal( 3, -@@ -1117,15 +1157,15 @@ public class Fox extends Animal { +@@ -1119,15 +1159,15 @@ public class Fox extends Animal { } } @@ -1078,7 +1642,7 @@ index 30a781b28fc4c78ca581fba405fae66f5b72251e..1da6563a3a1d85e562b85435bb27cd82 } } -@@ -1161,15 +1201,15 @@ public class Fox extends Animal { +@@ -1163,15 +1203,15 @@ public class Fox extends Animal { } } @@ -1097,1096 +1661,8 @@ index 30a781b28fc4c78ca581fba405fae66f5b72251e..1da6563a3a1d85e562b85435bb27cd82 } } } -diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java -index aafbbe791f6913748c5aed94b7aef4cd92692c8a..eb14c2c508efd927d4696ac4e7cd420104ccc192 100644 ---- a/net/minecraft/world/entity/animal/HappyGhast.java -+++ b/net/minecraft/world/entity/animal/HappyGhast.java -@@ -125,6 +125,13 @@ public class HappyGhast extends Animal { - this.removeAllGoals(goal -> true); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.happyGhastRidableInWater; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void ageBoundaryReached() { - if (this.isBaby()) { -diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java -index 838cc49d1a8b1b9758121c07de9e483966eef245..250c5b75b9e0d49eb8834ca9e7bbb5f8c029acb2 100644 ---- a/net/minecraft/world/entity/animal/IronGolem.java -+++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -76,9 +76,28 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - } - // Purpur end - Summoner API - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.ironGolemRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.ironGolemRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.ironGolemControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { - if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options -+ if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur - Ridables -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true)); - this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9, 32.0F)); - this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6, false)); -@@ -86,6 +105,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - this.goalSelector.addGoal(5, new OfferFlowerGoal(this)); - this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new DefendVillageTargetGoal(this)); - this.targetSelector.addGoal(2, new HurtByTargetGoal(this)); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -274,12 +294,12 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - protected InteractionResult mobInteract(Player player, InteractionHand hand) { - ItemStack itemInHand = player.getItemInHand(hand); - if (!itemInHand.is(Items.IRON_INGOT)) { -- return InteractionResult.PASS; -+ return tryRide(player, hand); // Purpur - Ridables - } else { - float health = this.getHealth(); - this.heal(25.0F); - if (this.getHealth() == health) { -- return InteractionResult.PASS; -+ return tryRide(player, hand); // Purpur - Ridables - } else { - float f = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; - this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, f); -diff --git a/net/minecraft/world/entity/animal/MushroomCow.java b/net/minecraft/world/entity/animal/MushroomCow.java -index 3ce300a6abc4ee39f010ff5318b64c50e732742b..9de016cb4e1aba2ab8ff4f16827b3450e8155992 100644 ---- a/net/minecraft/world/entity/animal/MushroomCow.java -+++ b/net/minecraft/world/entity/animal/MushroomCow.java -@@ -63,6 +63,23 @@ public class MushroomCow extends AbstractCow implements Shearable { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.mooshroomRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.mooshroomRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.mooshroomControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { - return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); -@@ -123,7 +140,7 @@ public class MushroomCow extends AbstractCow implements Shearable { - java.util.List drops = this.generateDefaultDrops(serverLevel, itemInHand); - org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemInHand, hand, drops); - if (event != null) { -- if (event.isCancelled()) return InteractionResult.PASS; -+ if (event.isCancelled()) return tryRide(player, hand); // Purpur - Ridables - drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); - // Paper end - custom shear drops - } -diff --git a/net/minecraft/world/entity/animal/Ocelot.java b/net/minecraft/world/entity/animal/Ocelot.java -index ae93426d4bd7f82c3beb90b2c7a957ccbf24ddd7..7db9d782a62cfac5f851a6242f4c9a24784648dc 100644 ---- a/net/minecraft/world/entity/animal/Ocelot.java -+++ b/net/minecraft/world/entity/animal/Ocelot.java -@@ -65,6 +65,23 @@ public class Ocelot extends Animal { - this.reassessTrustingGoals(); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.ocelotRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.ocelotRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.ocelotControllable; -+ } -+ // Purpur end - Ridables -+ - public boolean isTrusting() { - return this.entityData.get(DATA_TRUSTING); - } -@@ -96,12 +113,14 @@ public class Ocelot extends Animal { - protected void registerGoals() { - this.temptGoal = new Ocelot.OcelotTemptGoal(this, 0.6, itemStack -> itemStack.is(ItemTags.OCELOT_FOOD), true); - this.goalSelector.addGoal(1, new FloatGoal(this)); -+ this.goalSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(3, this.temptGoal); - this.goalSelector.addGoal(7, new LeapAtTargetGoal(this, 0.3F)); - this.goalSelector.addGoal(8, new OcelotAttackGoal(this)); - this.goalSelector.addGoal(9, new BreedGoal(this, 0.8)); - this.goalSelector.addGoal(10, new WaterAvoidingRandomStrollGoal(this, 0.8, 1.0000001E-5F)); - this.goalSelector.addGoal(11, new LookAtPlayerGoal(this, Player.class, 10.0F)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Chicken.class, false)); - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, false, false, Turtle.BABY_ON_LAND_SELECTOR)); - } -diff --git a/net/minecraft/world/entity/animal/Panda.java b/net/minecraft/world/entity/animal/Panda.java -index 4f4bfcc6b55770d9aed10904f3ac090f596d1741..180d356bf24d20dc8c8534fdb59222e18672f1b4 100644 ---- a/net/minecraft/world/entity/animal/Panda.java -+++ b/net/minecraft/world/entity/animal/Panda.java -@@ -107,6 +107,32 @@ public class Panda extends Animal { - } - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.pandaRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.pandaRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.pandaControllable; -+ } -+ -+ @Override -+ public void onMount(Player rider) { -+ super.onMount(rider); -+ setForwardMot(0.0F); -+ sit(false); -+ eat(false); -+ setOnBack(false); -+ } -+ // Purpur end - Ridables -+ - @Override - protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { - return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); -@@ -260,6 +286,7 @@ public class Panda extends Animal { - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(2, new Panda.PandaPanicGoal(this, 2.0)); - this.goalSelector.addGoal(2, new Panda.PandaBreedGoal(this, 1.0)); - this.goalSelector.addGoal(3, new Panda.PandaAttackGoal(this, 1.2F, true)); -@@ -275,6 +302,7 @@ public class Panda extends Animal { - this.goalSelector.addGoal(12, new Panda.PandaRollGoal(this)); - this.goalSelector.addGoal(13, new FollowParentGoal(this, 1.25)); - this.goalSelector.addGoal(14, new WaterAvoidingRandomStrollGoal(this, 1.0)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new Panda.PandaHurtByTargetGoal(this).setAlertOthers(new Class[0])); - } - -@@ -618,7 +646,7 @@ public class Panda extends Animal { - public InteractionResult mobInteract(Player player, InteractionHand hand) { - ItemStack itemInHand = player.getItemInHand(hand); - if (this.isScared()) { -- return InteractionResult.PASS; -+ return tryRide(player, hand); // Purpur - Ridables - } else if (this.isOnBack()) { - this.setOnBack(false); - return InteractionResult.SUCCESS; -@@ -654,7 +682,7 @@ public class Panda extends Animal { - - return InteractionResult.SUCCESS_SERVER; - } else { -- return InteractionResult.PASS; -+ return tryRide(player, hand); // Purpur - Ridables - } - } - -@@ -962,7 +990,7 @@ public class Panda extends Animal { - } - } - -- static class PandaMoveControl extends MoveControl { -+ static class PandaMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables - private final Panda panda; - - public PandaMoveControl(Panda mob) { -@@ -971,9 +999,9 @@ public class Panda extends Animal { - } - - @Override -- public void tick() { -+ public void vanillaTick() { // Purpur - Ridables - if (this.panda.canPerformAction()) { -- super.tick(); -+ super.vanillaTick(); // Purpur - Ridables - } - } - } -diff --git a/net/minecraft/world/entity/animal/Parrot.java b/net/minecraft/world/entity/animal/Parrot.java -index f5bd84355cd57b7a8c3ccd0f9ed2f714ff21233b..31e5ca2b2e0aaae75f4f2ffc2ada7d0224652608 100644 ---- a/net/minecraft/world/entity/animal/Parrot.java -+++ b/net/minecraft/world/entity/animal/Parrot.java -@@ -132,12 +132,68 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - - public Parrot(EntityType type, Level level) { - super(type, level); -- this.moveControl = new FlyingMoveControl(this, 10, false); -+ // Purpur start - Ridables -+ final org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD flyingController = new org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD(this, 0.3F); -+ class ParrotMoveControl extends FlyingMoveControl { -+ public ParrotMoveControl(Mob entity, int maxPitchChange, boolean noGravity) { -+ super(entity, maxPitchChange, noGravity); -+ } -+ -+ @Override -+ public void tick() { -+ if (mob.getRider() != null && mob.isControllable()) { -+ flyingController.purpurTick(mob.getRider()); -+ } else { -+ super.tick(); -+ } -+ } -+ -+ @Override -+ public boolean hasWanted() { -+ return mob.getRider() != null && mob.isControllable() ? getForwardMot() != 0 || getStrafeMot() != 0 : super.hasWanted(); -+ } -+ } -+ this.moveControl = new ParrotMoveControl(this, 10, false); -+ // Purpur end - Ridables - this.setPathfindingMalus(PathType.DANGER_FIRE, -1.0F); - this.setPathfindingMalus(PathType.DAMAGE_FIRE, -1.0F); - this.setPathfindingMalus(PathType.COCOA, -1.0F); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.parrotRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.parrotRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.parrotControllable; -+ } -+ -+ @Override -+ public double getMaxY() { -+ return level().purpurConfig.parrotMaxY; -+ } -+ -+ @Override -+ public void travel(Vec3 vec3) { -+ super.travel(vec3); -+ if (getRider() != null && this.isControllable() && !onGround) { -+ float speed = (float) getAttributeValue(Attributes.FLYING_SPEED) * 2; -+ setSpeed(speed); -+ Vec3 mot = getDeltaMovement(); -+ move(net.minecraft.world.entity.MoverType.SELF, mot.multiply(speed, 0.25, speed)); -+ setDeltaMovement(mot.scale(0.9D)); -+ } -+ } -+ // Purpur end - Ridables -+ - @Nullable - @Override - public SpawnGroupData finalizeSpawn( -@@ -158,9 +214,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - - @Override - protected void registerGoals() { -- this.goalSelector.addGoal(0, new TamableAnimal.TamableAnimalPanicGoal(1.25)); -+ //this.goalSelector.addGoal(0, new TamableAnimal.TamableAnimalPanicGoal(1.25)); // Purpur - move down - this.goalSelector.addGoal(0, new FloatGoal(this)); - if (this.level().purpurConfig.parrotBreedable) this.goalSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.BreedGoal(this, 1.0D)); // Purpur - Breedable parrots -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -+ this.goalSelector.addGoal(1, new TamableAnimal.TamableAnimalPanicGoal(1.25D)); // Purpur - Ridables - this.goalSelector.addGoal(1, new LookAtPlayerGoal(this, Player.class, 8.0F)); - this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); - this.goalSelector.addGoal(2, new FollowOwnerGoal(this, 1.0, 5.0F, 1.0F)); -diff --git a/net/minecraft/world/entity/animal/Pig.java b/net/minecraft/world/entity/animal/Pig.java -index 8a12ac29e2221c7e91f4935046894fbc77eaf2a1..84afbacfb7f590fa68858816b7c717a92fd03fc2 100644 ---- a/net/minecraft/world/entity/animal/Pig.java -+++ b/net/minecraft/world/entity/animal/Pig.java -@@ -66,9 +66,27 @@ public class Pig extends Animal implements ItemSteerable { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.pigRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.pigRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.pigControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new PanicGoal(this, 1.25)); - this.goalSelector.addGoal(3, new BreedGoal(this, 1.0)); - this.goalSelector.addGoal(4, new TemptGoal(this, 1.2, itemStack -> itemStack.is(Items.CARROT_ON_A_STICK), false)); -diff --git a/net/minecraft/world/entity/animal/PolarBear.java b/net/minecraft/world/entity/animal/PolarBear.java -index 59288cb00951808d3ea7921875c9cbecb2de7f98..6ffb35630bab1303edb2179e4dcf749f9b3c3c28 100644 ---- a/net/minecraft/world/entity/animal/PolarBear.java -+++ b/net/minecraft/world/entity/animal/PolarBear.java -@@ -60,6 +60,7 @@ public class PolarBear extends Animal implements NeutralMob { - private int remainingPersistentAngerTime; - @Nullable - private UUID persistentAngerTarget; -+ private int standTimer = 0; // Purpur - Ridables - - public PolarBear(EntityType type, Level level) { - super(type, level); -@@ -88,6 +89,34 @@ public class PolarBear extends Animal implements NeutralMob { - } - // Purpur end - Breedable Polar Bears - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.polarBearRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.polarBearRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.polarBearControllable; -+ } -+ -+ @Override -+ public boolean onSpacebar() { -+ if (!isStanding()) { -+ if (getRider() != null && getRider().getForwardMot() == 0 && getRider().getStrafeMot() == 0) { -+ setStanding(true); -+ playSound(SoundEvents.POLAR_BEAR_WARNING, 1.0F, 1.0F); -+ } -+ } -+ return false; -+ } -+ // Purpur end - Ridables -+ - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { -@@ -103,6 +132,7 @@ public class PolarBear extends Animal implements NeutralMob { - protected void registerGoals() { - super.registerGoals(); - this.goalSelector.addGoal(0, new FloatGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new PolarBear.PolarBearMeleeAttackGoal()); - this.goalSelector.addGoal(1, new PanicGoal(this, 2.0, mob -> mob.isBaby() ? DamageTypeTags.PANIC_CAUSES : DamageTypeTags.PANIC_ENVIRONMENTAL_CAUSES)); - // Purpur start - Breedable Polar Bears -@@ -115,6 +145,7 @@ public class PolarBear extends Animal implements NeutralMob { - this.goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0)); - this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new PolarBear.PolarBearHurtByTargetGoal()); - this.targetSelector.addGoal(2, new PolarBear.PolarBearAttackPlayersGoal()); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -233,6 +264,12 @@ public class PolarBear extends Animal implements NeutralMob { - if (!this.level().isClientSide()) { - this.updatePersistentAnger((ServerLevel)this.level(), true); - } -+ -+ // Purpur start - Ridables -+ if (isStanding() && --standTimer <= 0) { -+ setStanding(false); -+ } -+ // Purpur end - Ridables - } - - @Override -@@ -252,6 +289,7 @@ public class PolarBear extends Animal implements NeutralMob { - - public void setStanding(boolean standing) { - this.entityData.set(DATA_STANDING_ID, standing); -+ standTimer = standing ? 20 : -1; // Purpur - Ridables - } - - public float getStandingAnimationScale(float partialTick) { -diff --git a/net/minecraft/world/entity/animal/Pufferfish.java b/net/minecraft/world/entity/animal/Pufferfish.java -index e29d2b09490f2b6ce10d6254c6c9a56b79b2374b..77862aea7b2bbc931d34c4e4ebd336bb5d5755d6 100644 ---- a/net/minecraft/world/entity/animal/Pufferfish.java -+++ b/net/minecraft/world/entity/animal/Pufferfish.java -@@ -47,6 +47,18 @@ public class Pufferfish extends AbstractFish { - this.refreshDimensions(); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.pufferfishRidable; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.pufferfishControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java -index aa5bca6c0633cffdbb79ecc50d68e5c4bc2e54cf..f2ae78ccf93dbd7617f04d3d13b8b809fde0d151 100644 ---- a/net/minecraft/world/entity/animal/Rabbit.java -+++ b/net/minecraft/world/entity/animal/Rabbit.java -@@ -93,6 +93,7 @@ public class Rabbit extends Animal { - private boolean wasOnGround; - private int jumpDelayTicks; - public int moreCarrotTicks = 0; -+ private boolean actualJump; // Purpur - Ridables - - public Rabbit(EntityType type, Level level) { - super(type, level); -@@ -101,9 +102,55 @@ public class Rabbit extends Animal { - // this.setSpeedModifier(0.0); // CraftBukkit - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.rabbitRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.rabbitRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.rabbitControllable; -+ } -+ -+ @Override -+ public boolean onSpacebar() { -+ if (onGround) { -+ actualJump = true; -+ jumpFromGround(); -+ actualJump = false; -+ } -+ return true; -+ } -+ -+ private void handleJumping() { -+ if (onGround) { -+ RabbitJumpControl jumpController = (RabbitJumpControl) jumpControl; -+ if (!wasOnGround) { -+ setJumping(false); -+ jumpController.setCanJump(false); -+ } -+ if (!jumpController.wantJump()) { -+ if (moveControl.hasWanted()) { -+ startJumping(); -+ } -+ } else if (!jumpController.canJump()) { -+ jumpController.setCanJump(true); -+ } -+ } -+ wasOnGround = onGround; -+ } -+ // Purpur end - Ridables -+ - @Override - public void registerGoals() { - this.goalSelector.addGoal(1, new FloatGoal(this)); -+ this.goalSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new ClimbOnTopOfPowderSnowGoal(this, this.level())); - this.goalSelector.addGoal(1, new Rabbit.RabbitPanicGoal(this, 2.2)); - this.goalSelector.addGoal(2, new BreedGoal(this, 0.8)); -@@ -118,6 +165,14 @@ public class Rabbit extends Animal { - - @Override - protected float getJumpPower() { -+ // Purpur start - Ridables -+ if (getRider() != null && this.isControllable()) { -+ if (getForwardMot() < 0) { -+ setSpeed(getForwardMot() * 2F); -+ } -+ return actualJump ? 0.5F : 0.3F; -+ } -+ // Purpur end - Ridables - float f = 0.3F; - if (this.moveControl.getSpeedModifier() <= 0.6) { - f = 0.2F; -@@ -185,6 +240,12 @@ public class Rabbit extends Animal { - - @Override - public void customServerAiStep(ServerLevel level) { -+ // Purpur start - Ridables -+ if (getRider() != null && this.isControllable()) { -+ handleJumping(); -+ return; -+ } -+ // Purpur end - Ridables - if (this.jumpDelayTicks > 0) { - this.jumpDelayTicks--; - } -@@ -513,7 +574,7 @@ public class Rabbit extends Animal { - } - } - -- static class RabbitMoveControl extends MoveControl { -+ static class RabbitMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables - private final Rabbit rabbit; - private double nextJumpSpeed; - -@@ -523,14 +584,14 @@ public class Rabbit extends Animal { - } - - @Override -- public void tick() { -+ public void vanillaTick() { // Purpur - Ridables - if (this.rabbit.onGround() && !this.rabbit.jumping && !((Rabbit.RabbitJumpControl)this.rabbit.jumpControl).wantJump()) { - this.rabbit.setSpeedModifier(0.0); - } else if (this.hasWanted() || this.operation == MoveControl.Operation.JUMPING) { - this.rabbit.setSpeedModifier(this.nextJumpSpeed); - } - -- super.tick(); -+ super.vanillaTick(); // Purpur - Ridables - } - - @Override -diff --git a/net/minecraft/world/entity/animal/Salmon.java b/net/minecraft/world/entity/animal/Salmon.java -index e3ace30f12fe3183324ebd3025b411bbb09492e4..a0bd1c1446b81868fdb61a4d3db6140e7887cdb9 100644 ---- a/net/minecraft/world/entity/animal/Salmon.java -+++ b/net/minecraft/world/entity/animal/Salmon.java -@@ -39,6 +39,18 @@ public class Salmon extends AbstractSchoolingFish { - this.refreshDimensions(); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.salmonRidable; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.salmonControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - public int getMaxSchoolSize() { - return 5; -diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index 8fa983d168874ef1497dc38b673295eb76a4e8b4..00af403efafbdd7274524403b2212c15026ee147 100644 ---- a/net/minecraft/world/entity/animal/SnowGolem.java -+++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -63,12 +63,31 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - } - // Purpur end - Summoner API - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.snowGolemRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.snowGolemRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.snowGolemControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new RangedAttackGoal(this, level().purpurConfig.snowGolemAttackDistance, level().purpurConfig.snowGolemSnowBallMin, level().purpurConfig.snowGolemSnowBallMax, level().purpurConfig.snowGolemSnowBallModifier)); // Purpur - Snow Golem rate of fire config - this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.0D, 1.0000001E-5F)); - this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Mob.class, 10, true, false, (entity, level) -> entity instanceof Enemy)); - } - -@@ -113,6 +132,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - return; - } - -+ if (getRider() != null && this.isControllable() && !level().purpurConfig.snowGolemLeaveTrailWhenRidden) return; // Purpur - don't leave snow trail when being ridden - BlockState blockState = Blocks.SNOW.defaultBlockState(); - - for (int i = 0; i < 4; i++) { -@@ -155,7 +175,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemInHand, hand, drops); - if (event != null) { - if (event.isCancelled()) { -- return InteractionResult.PASS; -+ return tryRide(player, hand); // Purpur - Ridables - } - drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); - // Paper end - custom shear drops -@@ -176,7 +196,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - return InteractionResult.SUCCESS; - // Purpur end - Snowman drop and put back pumpkin - } else { -- return InteractionResult.PASS; -+ return tryRide(player, hand); // Purpur - Ridables - } - } - -diff --git a/net/minecraft/world/entity/animal/Squid.java b/net/minecraft/world/entity/animal/Squid.java -index 1f63894c82f39e43a25b9900f8f92f83cc5b6e66..ff12229101aae273e5e887a7761ce1ba1b34e0b9 100644 ---- a/net/minecraft/world/entity/animal/Squid.java -+++ b/net/minecraft/world/entity/animal/Squid.java -@@ -70,9 +70,32 @@ public class Squid extends AgeableWaterCreature { - } - // Purpur end - Flying squids! Oh my! - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.squidRidable; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.squidControllable; -+ } -+ -+ protected static void rotateVectorAroundY(org.bukkit.util.Vector vector, double degrees) { -+ double rad = Math.toRadians(degrees); -+ double cos = Math.cos(rad); -+ double sine = Math.sin(rad); -+ double x = vector.getX(); -+ double z = vector.getZ(); -+ vector.setX(cos * x - sine * z); -+ vector.setZ(sine * x + cos * z); -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new Squid.SquidFleeGoal()); - } - -@@ -326,6 +349,37 @@ public class Squid extends AgeableWaterCreature { - - @Override - public void tick() { -+ // Purpur start - Ridables -+ net.minecraft.world.entity.player.Player rider = squid.getRider(); -+ if (rider != null && squid.isControllable()) { -+ if (rider.jumping) { -+ squid.onSpacebar(); -+ } -+ float forward = rider.getForwardMot(); -+ float strafe = rider.getStrafeMot(); -+ float speed = (float) squid.getAttributeValue(Attributes.MOVEMENT_SPEED) * 10F; -+ if (forward < 0.0F) { -+ speed *= -0.5; -+ } -+ org.bukkit.util.Vector dir = rider.getBukkitEntity().getEyeLocation().getDirection().normalize().multiply(speed / 20.0F); -+ if (strafe != 0.0F) { -+ if (forward == 0.0F) { -+ dir.setY(0); -+ rotateVectorAroundY(dir, strafe > 0.0F ? -90 : 90); -+ } else if (forward < 0.0F) { -+ rotateVectorAroundY(dir, strafe > 0.0F ? 45 : -45); -+ } else { -+ rotateVectorAroundY(dir, strafe > 0.0F ? -45 : 45); -+ } -+ } -+ if (forward != 0.0F || strafe != 0.0F) { -+ squid.movementVector = new Vec3((float) dir.getX(), (float) dir.getY(), (float) dir.getZ()); -+ } else { -+ squid.movementVector = Vec3.ZERO; -+ } -+ return; -+ } -+ // Purpur end - Ridables - int noActionTime = this.squid.getNoActionTime(); - if (noActionTime > 100) { - this.squid.movementVector = Vec3.ZERO; -diff --git a/net/minecraft/world/entity/animal/TropicalFish.java b/net/minecraft/world/entity/animal/TropicalFish.java -index 548751d245acaf901880026a8efd9c8cea699fe5..6c2497ab50dd7ab6d5a7043935b0beeed36bfad8 100644 ---- a/net/minecraft/world/entity/animal/TropicalFish.java -+++ b/net/minecraft/world/entity/animal/TropicalFish.java -@@ -77,6 +77,18 @@ public class TropicalFish extends AbstractSchoolingFish { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.tropicalFishRidable; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.tropicalFishControllable; -+ } -+ // Purpur end - Ridables -+ - public static String getPredefinedName(int variantId) { - return "entity.minecraft.tropical_fish.predefined." + variantId; - } -diff --git a/net/minecraft/world/entity/animal/Turtle.java b/net/minecraft/world/entity/animal/Turtle.java -index 451c9c5bc24f0b7fb6b946a3497ef2d101d59fcd..f10c2e3346fe8102e0b3a93f8b57b8d262172bea 100644 ---- a/net/minecraft/world/entity/animal/Turtle.java -+++ b/net/minecraft/world/entity/animal/Turtle.java -@@ -87,6 +87,23 @@ public class Turtle extends Animal { - this.moveControl = new Turtle.TurtleMoveControl(this); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.turtleRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.turtleRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.turtleControllable; -+ } -+ // Purpur end - Ridables -+ - public void setHomePos(BlockPos homePos) { - this.homePos = homePos; - } -@@ -146,6 +163,7 @@ public class Turtle extends Animal { - - @Override - protected void registerGoals() { -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(0, new Turtle.TurtlePanicGoal(this, 1.2)); - this.goalSelector.addGoal(1, new Turtle.TurtleBreedGoal(this, 1.0)); - this.goalSelector.addGoal(1, new Turtle.TurtleLayEggGoal(this, 1.0)); -@@ -494,12 +512,14 @@ public class Turtle extends Animal { - } - } - -- static class TurtleMoveControl extends MoveControl { -+ static class TurtleMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables - private final Turtle turtle; -+ private final org.purpurmc.purpur.controller.WaterMoveControllerWASD waterController; // Purpur - Ridables - - TurtleMoveControl(Turtle mob) { - super(mob); - this.turtle = mob; -+ waterController = new org.purpurmc.purpur.controller.WaterMoveControllerWASD(turtle, 0.25D); // Purpur - Ridables - } - - private void updateSpeed() { -@@ -518,7 +538,7 @@ public class Turtle extends Animal { - } - - @Override -- public void tick() { -+ public void vanillaTick() { // Purpur - Ridables - this.updateSpeed(); - if (this.operation == MoveControl.Operation.MOVE_TO && !this.turtle.getNavigation().isDone()) { - double d = this.wantedX - this.turtle.getX(); -@@ -532,7 +552,7 @@ public class Turtle extends Animal { - float f = (float)(Mth.atan2(d2, d) * 180.0F / (float)Math.PI) - 90.0F; - this.turtle.setYRot(this.rotlerp(this.turtle.getYRot(), f, 90.0F)); - this.turtle.yBodyRot = this.turtle.getYRot(); -- float f1 = (float)(this.speedModifier * this.turtle.getAttributeValue(Attributes.MOVEMENT_SPEED)); -+ float f1 = (float)(this.getSpeedModifier() * this.turtle.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables - this.turtle.setSpeed(Mth.lerp(0.125F, this.turtle.getSpeed(), f1)); - this.turtle.setDeltaMovement(this.turtle.getDeltaMovement().add(0.0, this.turtle.getSpeed() * d1 * 0.1, 0.0)); - } -diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java -index f0dc6dfa78da497aa9a7a021e71f8be397016a93..1811fed8085b7045003a6cc2731ce8fc6b4d74ea 100644 ---- a/net/minecraft/world/entity/animal/allay/Allay.java -+++ b/net/minecraft/world/entity/animal/allay/Allay.java -@@ -114,10 +114,23 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS - private float spinningAnimationTicks; - private float spinningAnimationTicks0; - public boolean forceDancing = false; // CraftBukkit -+ private org.purpurmc.purpur.controller.FlyingMoveControllerWASD purpurController; // Purpur - Ridables - - public Allay(EntityType type, Level level) { - super(type, level); -- this.moveControl = new FlyingMoveControl(this, 20, true); -+ // Purpur start - Ridables -+ this.purpurController = new org.purpurmc.purpur.controller.FlyingMoveControllerWASD(this, 0.1F, 0.5F); -+ this.moveControl = new FlyingMoveControl(this, 20, true) { -+ @Override -+ public void tick() { -+ if (mob.getRider() != null && mob.isControllable()) { -+ purpurController.purpurTick(mob.getRider()); -+ } else { -+ super.tick(); -+ } -+ } -+ }; -+ // Purpur end - Ridables - this.setCanPickUpLoot(this.canPickUpLoot()); - this.vibrationUser = new Allay.VibrationUser(); - this.vibrationData = new VibrationSystem.Data(); -@@ -133,6 +146,28 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS - } - // CraftBukkit end - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.allayRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.allayRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.allayControllable; -+ } -+ -+ @Override -+ protected void registerGoals() { -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -+ } -+ // Purpur end - Ridables -+ - @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -228,6 +263,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("allayBrain"); -+ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider - this.getBrain().tick(level, this); - profilerFiller.pop(); - profilerFiller.push("allayActivityUpdate"); -diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index b5ce8de41b087812b02f22d538d5ca18eee60694..60abd71799ec3bb61aae1f7933245156fbc1587b 100644 ---- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java -+++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -83,6 +83,23 @@ public class Armadillo extends Animal { - return Animal.createAnimalAttributes().add(Attributes.MAX_HEALTH, 12.0).add(Attributes.MOVEMENT_SPEED, 0.14); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.armadilloRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.armadilloRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.armadilloControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index e40bb3232de7ae3a9b9490ec9eb41256ae25ea12..6614b38726dc1a9778032cbedc22e4343f70774f 100644 ---- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java -+++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -121,6 +121,23 @@ public class Axolotl extends Animal implements Bucketable { - this.lookControl = new Axolotl.AxolotlLookControl(this, 20); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.axolotlRidable; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.axolotlControllable; -+ } -+ -+ @Override -+ protected void registerGoals() { -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -+ } -+ // Purpur end - Ridables -+ - @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { - return 0.0F; -@@ -330,6 +347,7 @@ public class Axolotl extends Animal implements Bucketable { - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("axolotlBrain"); -+ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider - this.getBrain().tick(level, this); - profilerFiller.pop(); - profilerFiller.push("axolotlActivityUpdate"); -@@ -573,23 +591,31 @@ public class Axolotl extends Animal implements Bucketable { - } - - @Override -- public void tick() { -+ public void vanillaTick() { // Purpur - Ridables - if (!Axolotl.this.isPlayingDead()) { -- super.tick(); -+ super.vanillaTick(); // Purpur - Ridables - } - } - } - - static class AxolotlMoveControl extends SmoothSwimmingMoveControl { - private final Axolotl axolotl; -+ private final org.purpurmc.purpur.controller.WaterMoveControllerWASD waterController; // Purpur - Ridables - - public AxolotlMoveControl(Axolotl axolotl) { - super(axolotl, 85, 10, 0.1F, 0.5F, false); - this.axolotl = axolotl; -+ waterController = new org.purpurmc.purpur.controller.WaterMoveControllerWASD(axolotl, 0.5D); // Purpur - Ridables - } - - @Override - public void tick() { -+ // Purpur start - Ridables -+ if (axolotl.getRider() != null && axolotl.isControllable()) { -+ waterController.purpurTick(axolotl.getRider()); -+ return; -+ } -+ // Purpur end - Ridables - if (!this.axolotl.isPlayingDead()) { - super.tick(); - } -diff --git a/net/minecraft/world/entity/animal/camel/Camel.java b/net/minecraft/world/entity/animal/camel/Camel.java -index 314dfd6611b95547a161517be1bf985305e45f41..486974bf7764a6eee37e67acdfc3b7798fa218ef 100644 ---- a/net/minecraft/world/entity/animal/camel/Camel.java -+++ b/net/minecraft/world/entity/animal/camel/Camel.java -@@ -90,6 +90,13 @@ public class Camel extends AbstractHorse { - groundPathNavigation.setCanWalkOverFences(true); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.camelRidableInWater; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void addAdditionalSaveData(ValueOutput output) { - super.addAdditionalSaveData(output); -diff --git a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -index 9de4727596b2fde69f4049734eee0f1d81079b6f..66e0ccdf938023a8df1cf179224b64508646e3e0 100644 ---- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -+++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -@@ -111,6 +111,28 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab - } - // Purpur end - Summoner API - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.copperGolemRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.copperGolemRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.copperGolemControllable; -+ } -+ -+ @Override -+ protected void registerGoals() { -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); -+ } -+ // Purpur end - Ridables -+ - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); - } -@@ -201,6 +223,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("copperGolemBrain"); -+ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider - this.getBrain().tick(level, this); - profilerFiller.pop(); - profilerFiller.push("copperGolemActivityUpdate"); -@@ -240,7 +263,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab - java.util.List drops = this.generateDefaultDrops(serverLevel, itemInHand); - org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemInHand, hand, drops); - if (event != null) { -- if (event.isCancelled()) return InteractionResult.PASS; -+ if (event.isCancelled()) return tryRide(player, hand); // Purpur - Ridables - drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); - } - this.shear(serverLevel, SoundSource.PLAYERS, itemInHand, drops); -@@ -276,6 +299,8 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab - } - } - -+ if (level().purpurConfig.villagerRidable && itemInHand.isEmpty()) return tryRide(player, hand); // Purpur - Ridables -+ - return super.mobInteract(player, hand); - } - } diff --git a/net/minecraft/world/entity/animal/frog/Frog.java b/net/minecraft/world/entity/animal/frog/Frog.java -index f14e79bd8902dc17b63e124cfa44db9e60a42934..4979ae6dc8f6c2361b443b8bbe90738e4a199200 100644 +index 09d817aa34d4a6d8a49d614087f9942d75e673e8..5b4bb6fd100abc569c5da167735a220014bf5d8c 100644 --- a/net/minecraft/world/entity/animal/frog/Frog.java +++ b/net/minecraft/world/entity/animal/frog/Frog.java @@ -105,6 +105,8 @@ public class Frog extends Animal { @@ -2254,7 +1730,7 @@ index f14e79bd8902dc17b63e124cfa44db9e60a42934..4979ae6dc8f6c2361b443b8bbe90738e @Override protected Brain.Provider brainProvider() { -@@ -205,6 +255,7 @@ public class Frog extends Animal { +@@ -204,6 +254,7 @@ public class Frog extends Animal { protected void customServerAiStep(ServerLevel level) { ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("frogBrain"); @@ -2262,7 +1738,7 @@ index f14e79bd8902dc17b63e124cfa44db9e60a42934..4979ae6dc8f6c2361b443b8bbe90738e this.getBrain().tick(level, this); profilerFiller.pop(); profilerFiller.push("frogActivityUpdate"); -@@ -383,7 +434,7 @@ public class Frog extends Animal { +@@ -373,7 +424,7 @@ public class Frog extends Animal { return level.getBlockState(pos.below()).is(BlockTags.FROGS_SPAWNABLE_ON) && isBrightEnoughToSpawn(level, pos); } @@ -2272,7 +1748,7 @@ index f14e79bd8902dc17b63e124cfa44db9e60a42934..4979ae6dc8f6c2361b443b8bbe90738e super(mob); } diff --git a/net/minecraft/world/entity/animal/frog/Tadpole.java b/net/minecraft/world/entity/animal/frog/Tadpole.java -index 3ce172c1bdaf8b8a8ad774dd37498e8e379c68bb..790194e3b618f95a003ba8eb6104f765a7dfddaa 100644 +index f65cfb908aac16e6df4d209c6b5c3ee5065289d3..9b5205d7f481d4cd8fe454ae588dc2a89bc613bf 100644 --- a/net/minecraft/world/entity/animal/frog/Tadpole.java +++ b/net/minecraft/world/entity/animal/frog/Tadpole.java @@ -65,13 +65,50 @@ public class Tadpole extends AbstractFish { @@ -2336,7 +1812,7 @@ index 3ce172c1bdaf8b8a8ad774dd37498e8e379c68bb..790194e3b618f95a003ba8eb6104f765 profilerFiller.pop(); profilerFiller.push("tadpoleActivityUpdate"); diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 4f87e06695e49c09078ab673119e2af9f5158bae..f417e9337a5102d6ec95a934c4126e1ec98a94d8 100644 +index 566390c9258c1132c9ffa2df8ecc3e713963787f..6e4d611c959960e8d13f79704c176b41ea5c12c4 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java @@ -115,6 +115,23 @@ public class Goat extends Animal { @@ -2363,7 +1839,7 @@ index 4f87e06695e49c09078ab673119e2af9f5158bae..f417e9337a5102d6ec95a934c4126e1e @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -192,6 +209,7 @@ public class Goat extends Animal { +@@ -191,6 +208,7 @@ public class Goat extends Animal { protected void customServerAiStep(ServerLevel level) { ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("goatBrain"); @@ -2371,265 +1847,620 @@ index 4f87e06695e49c09078ab673119e2af9f5158bae..f417e9337a5102d6ec95a934c4126e1e this.getBrain().tick(level, this); profilerFiller.pop(); profilerFiller.push("goatActivityUpdate"); -diff --git a/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index c87a1a5e3696e40f9f0d6f4d93e102e73325d4f8..28ea58a154d5a572268004ff9d36a5ae99f291e9 100644 ---- a/net/minecraft/world/entity/animal/horse/AbstractHorse.java -+++ b/net/minecraft/world/entity/animal/horse/AbstractHorse.java -@@ -128,11 +128,21 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory - - protected AbstractHorse(EntityType type, Level level) { - super(type, level); -+ this.moveControl = new net.minecraft.world.entity.ai.control.MoveControl(this); // Purpur - use vanilla controller -+ this.lookControl = new net.minecraft.world.entity.ai.control.LookControl(this); // Purpur - use vanilla controller - this.createInventory(); +diff --git a/net/minecraft/world/entity/animal/golem/CopperGolem.java b/net/minecraft/world/entity/animal/golem/CopperGolem.java +index ad88672368b66ac99f437f8af48b9fd1dcc32c8a..4dc1ce5e07e23134cf3ed68e78a055c3b75fdc83 100644 +--- a/net/minecraft/world/entity/animal/golem/CopperGolem.java ++++ b/net/minecraft/world/entity/animal/golem/CopperGolem.java +@@ -108,6 +108,28 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab } + // Purpur end - Summoner API + // Purpur start - Ridables + @Override + public boolean isRidable() { -+ return false; // vanilla handles ++ return level().purpurConfig.copperGolemRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.copperGolemRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.copperGolemControllable; ++ } ++ ++ @Override ++ protected void registerGoals() { ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); ++ } ++ // Purpur end - Ridables ++ + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); + } +@@ -198,6 +220,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + protected void customServerAiStep(ServerLevel level) { + ProfilerFiller profilerFiller = Profiler.get(); + profilerFiller.push("copperGolemBrain"); ++ if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider + this.getBrain().tick(level, this); + profilerFiller.pop(); + profilerFiller.push("copperGolemActivityUpdate"); +@@ -237,7 +260,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + java.util.List drops = this.generateDefaultDrops(serverLevel, itemInHand); + org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemInHand, hand, drops); + if (event != null) { +- if (event.isCancelled()) return InteractionResult.PASS; ++ if (event.isCancelled()) return tryRide(player, hand); // Purpur - Ridables + drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); + } + this.shear(serverLevel, SoundSource.PLAYERS, itemInHand, drops); +@@ -273,6 +296,8 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + } + } + ++ if (level().purpurConfig.villagerRidable && itemInHand.isEmpty()) return tryRide(player, hand); // Purpur - Ridables ++ + return super.mobInteract(player, hand); + } + } +diff --git a/net/minecraft/world/entity/animal/golem/IronGolem.java b/net/minecraft/world/entity/animal/golem/IronGolem.java +index 32425f0aaa748c7f80f2e5cf95ef27238fe50489..363bf7781c8785bc6fdbc65941794a5a02f8a57a 100644 +--- a/net/minecraft/world/entity/animal/golem/IronGolem.java ++++ b/net/minecraft/world/entity/animal/golem/IronGolem.java +@@ -74,9 +74,28 @@ public class IronGolem extends AbstractGolem implements NeutralMob { + } + // Purpur end - Summoner API + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.ironGolemRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.ironGolemRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.ironGolemControllable; + } + // Purpur end - Ridables + @Override protected void registerGoals() { -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new PanicGoal(this, 1.2)); - this.goalSelector.addGoal(1, new RunAroundLikeCrazyGoal(this, 1.2)); - this.goalSelector.addGoal(2, new BreedGoal(this, 1.0, AbstractHorse.class)); -@@ -143,6 +153,7 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory - if (this.canPerformRearing()) { - this.goalSelector.addGoal(9, new RandomStandGoal(this)); - } -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur - Ridables - - this.addBehaviourGoals(); - } -diff --git a/net/minecraft/world/entity/animal/horse/Donkey.java b/net/minecraft/world/entity/animal/horse/Donkey.java -index eebf910bdae26453f365570b215a7e472ddef67c..88e45b38763992a645e36cccab36f74a2024f671 100644 ---- a/net/minecraft/world/entity/animal/horse/Donkey.java -+++ b/net/minecraft/world/entity/animal/horse/Donkey.java -@@ -16,6 +16,13 @@ public class Donkey extends AbstractChestedHorse { - super(type, level); + if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options ++ if (level().purpurConfig.ironGolemCanSwim) this.goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur - Ridables ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true)); + this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9, 32.0F)); + this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6, false)); +@@ -84,6 +103,7 @@ public class IronGolem extends AbstractGolem implements NeutralMob { + this.goalSelector.addGoal(5, new OfferFlowerGoal(this)); + this.goalSelector.addGoal(7, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new DefendVillageTargetGoal(this)); + this.targetSelector.addGoal(2, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); +@@ -271,12 +291,12 @@ public class IronGolem extends AbstractGolem implements NeutralMob { + protected InteractionResult mobInteract(Player player, InteractionHand hand) { + ItemStack itemInHand = player.getItemInHand(hand); + if (!itemInHand.is(Items.IRON_INGOT)) { +- return InteractionResult.PASS; ++ return tryRide(player, hand); // Purpur - Ridables + } else { + float health = this.getHealth(); + this.heal(25.0F); + if (this.getHealth() == health) { +- return InteractionResult.PASS; ++ return tryRide(player, hand); // Purpur - Ridables + } else { + float f = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; + this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, f); +diff --git a/net/minecraft/world/entity/animal/golem/SnowGolem.java b/net/minecraft/world/entity/animal/golem/SnowGolem.java +index c474b69dd4e2c7893d51627403425e9fd38042ef..d8a3b7d329757bb84ee4d53671c89f211e8581ab 100644 +--- a/net/minecraft/world/entity/animal/golem/SnowGolem.java ++++ b/net/minecraft/world/entity/animal/golem/SnowGolem.java +@@ -62,12 +62,31 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM } + // Purpur end - Summoner API -+ // Purpur start - Ridables -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.donkeyRidableInWater; -+ } -+ // Purpur end - Ridables -+ - @Override - public SoundEvent getAmbientSound() { - return SoundEvents.DONKEY_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/Horse.java b/net/minecraft/world/entity/animal/horse/Horse.java -index f67553098098611573d6194d1b8424d44dc7cf63..e5fc006066a817737110918d047e71abf24bb334 100644 ---- a/net/minecraft/world/entity/animal/horse/Horse.java -+++ b/net/minecraft/world/entity/animal/horse/Horse.java -@@ -47,6 +47,13 @@ public class Horse extends AbstractHorse { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.horseRidableInWater; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void randomizeAttributes(RandomSource random) { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); -diff --git a/net/minecraft/world/entity/animal/horse/Llama.java b/net/minecraft/world/entity/animal/horse/Llama.java -index bcbbcea51261a2f1d6fbe3463e06900a6cd3d0ba..1e76e5c5e046e9e284c42ad5de9430aa489a7b28 100644 ---- a/net/minecraft/world/entity/animal/horse/Llama.java -+++ b/net/minecraft/world/entity/animal/horse/Llama.java -@@ -84,7 +84,58 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { - super(type, level); - this.getNavigation().setRequiredPathLength(40.0F); - this.maxDomestication = 30; // Paper - Missing entity API; configure max temper instead of a hardcoded value -+ // Purpur start - Ridables -+ this.moveControl = new org.purpurmc.purpur.controller.MoveControllerWASD(this) { -+ @Override -+ public void tick() { -+ if (entity.getRider() != null && entity.isControllable() && isSaddled()) { -+ purpurTick(entity.getRider()); -+ } else { -+ vanillaTick(); -+ } -+ } -+ }; -+ this.lookControl = new org.purpurmc.purpur.controller.LookControllerWASD(this) { -+ @Override -+ public void tick() { -+ if (entity.getRider() != null && entity.isControllable() && isSaddled()) { -+ purpurTick(entity.getRider()); -+ } else { -+ vanillaTick(); -+ } -+ } -+ }; -+ // Purpur end - Ridables -+ } -+ + // Purpur start - Ridables + @Override + public boolean isRidable() { -+ return level().purpurConfig.llamaRidable; ++ return level().purpurConfig.snowGolemRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.llamaRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.snowGolemRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level().purpurConfig.llamaControllable; ++ return level().purpurConfig.snowGolemControllable; + } -+ -+ @Override -+ public boolean isSaddled() { -+ return super.isWearingBodyArmor() || this.isTamed(); -+ } -+ -+ @Nullable -+ @Override -+ public LivingEntity getControllingPassenger() { -+ Entity firstPassenger = this.getFirstPassenger(); -+ return !this.isNoAi() && firstPassenger instanceof net.minecraft.world.entity.Mob mob && firstPassenger.canControlVehicle() ? mob : null; - } + // Purpur end - Ridables ++ + @Override + protected void registerGoals() { ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new RangedAttackGoal(this, level().purpurConfig.snowGolemAttackDistance, level().purpurConfig.snowGolemSnowBallMin, level().purpurConfig.snowGolemSnowBallMax, level().purpurConfig.snowGolemSnowBallModifier)); // Purpur - Snow Golem rate of fire config + this.goalSelector.addGoal(2, new WaterAvoidingRandomStrollGoal(this, 1.0D, 1.0000001E-5F)); + this.goalSelector.addGoal(3, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(4, new RandomLookAroundGoal(this)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Mob.class, 10, true, false, (entity, level) -> entity instanceof Enemy)); + } - public boolean isTraderLlama() { - return false; -@@ -122,6 +173,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -112,6 +131,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM + return; + } + ++ if (getRider() != null && this.isControllable() && !level().purpurConfig.snowGolemLeaveTrailWhenRidden) return; // Purpur - don't leave snow trail when being ridden + BlockState blockState = Blocks.SNOW.defaultBlockState(); + + for (int i = 0; i < 4; i++) { +@@ -154,7 +174,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM + org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemInHand, hand, drops); + if (event != null) { + if (event.isCancelled()) { +- return InteractionResult.PASS; ++ return tryRide(player, hand); // Purpur - Ridables + } + drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); + // Paper end - custom shear drops +@@ -175,7 +195,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM + return InteractionResult.SUCCESS; + // Purpur end - Snowman drop and put back pumpkin + } else { +- return InteractionResult.PASS; ++ return tryRide(player, hand); // Purpur - Ridables + } + } + +diff --git a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +index ba31826f81d91d0c2d1a377d4e855a0be4206d7b..805efd86b09b2d1dbb5f2d51f3f5bfe67a1c0387 100644 +--- a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java ++++ b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +@@ -126,6 +126,13 @@ public class HappyGhast extends Animal { + this.removeAllGoals(goal -> true); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.happyGhastRidableInWater; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void ageBoundaryReached() { + if (this.isBaby()) { +diff --git a/net/minecraft/world/entity/animal/panda/Panda.java b/net/minecraft/world/entity/animal/panda/Panda.java +index c5425b36e96e4f41f0ed7d468f53ea3de6b9ef17..93503f6b4eea2cb2ae6c01279e847c307920c35d 100644 +--- a/net/minecraft/world/entity/animal/panda/Panda.java ++++ b/net/minecraft/world/entity/animal/panda/Panda.java +@@ -108,6 +108,32 @@ public class Panda extends Animal { + } + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.pandaRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.pandaRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.pandaControllable; ++ } ++ ++ @Override ++ public void onMount(Player rider) { ++ super.onMount(rider); ++ setForwardMot(0.0F); ++ sit(false); ++ eat(false); ++ setOnBack(false); ++ } ++ // Purpur end - Ridables ++ + @Override + protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { + return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); +@@ -260,6 +286,7 @@ public class Panda extends Animal { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.LlamaHasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new RunAroundLikeCrazyGoal(this, 1.2)); - this.goalSelector.addGoal(2, new LlamaFollowCaravanGoal(this, 2.1F)); - this.goalSelector.addGoal(3, new RangedAttackGoal(this, 1.25, 40, 20.0F)); -@@ -132,6 +184,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { - this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 0.7)); - this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 6.0F)); - this.goalSelector.addGoal(9, new RandomLookAroundGoal(this)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.LlamaHasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new Llama.LlamaHurtByTargetGoal(this)); - this.targetSelector.addGoal(2, new Llama.LlamaAttackWolfGoal(this)); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(2, new Panda.PandaPanicGoal(this, 2.0)); + this.goalSelector.addGoal(2, new Panda.PandaBreedGoal(this, 1.0)); + this.goalSelector.addGoal(3, new Panda.PandaAttackGoal(this, 1.2F, true)); +@@ -275,6 +302,7 @@ public class Panda extends Animal { + this.goalSelector.addGoal(12, new Panda.PandaRollGoal(this)); + this.goalSelector.addGoal(13, new FollowParentGoal(this, 1.25)); + this.goalSelector.addGoal(14, new WaterAvoidingRandomStrollGoal(this, 1.0)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new Panda.PandaHurtByTargetGoal(this).setAlertOthers()); } -diff --git a/net/minecraft/world/entity/animal/horse/Mule.java b/net/minecraft/world/entity/animal/horse/Mule.java -index 9f9485e9e83255615abeffe95a602331e578ea4d..d6c61075321e6005f977be17bbb6d7045f42d7f0 100644 ---- a/net/minecraft/world/entity/animal/horse/Mule.java -+++ b/net/minecraft/world/entity/animal/horse/Mule.java -@@ -15,6 +15,13 @@ public class Mule extends AbstractChestedHorse { + +@@ -617,7 +645,7 @@ public class Panda extends Animal { + public InteractionResult mobInteract(Player player, InteractionHand hand) { + ItemStack itemInHand = player.getItemInHand(hand); + if (this.isScared()) { +- return InteractionResult.PASS; ++ return tryRide(player, hand); // Purpur - Ridables + } else if (this.isOnBack()) { + this.setOnBack(false); + return InteractionResult.SUCCESS; +@@ -653,7 +681,7 @@ public class Panda extends Animal { + + return InteractionResult.SUCCESS_SERVER; + } else { +- return InteractionResult.PASS; ++ return tryRide(player, hand); // Purpur - Ridables + } + } + +@@ -958,7 +986,7 @@ public class Panda extends Animal { + } + } + +- static class PandaMoveControl extends MoveControl { ++ static class PandaMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables + private final Panda panda; + + public PandaMoveControl(Panda mob) { +@@ -967,9 +995,9 @@ public class Panda extends Animal { + } + + @Override +- public void tick() { ++ public void vanillaTick() { // Purpur - Ridables + if (this.panda.canPerformAction()) { +- super.tick(); ++ super.vanillaTick(); // Purpur - Ridables + } + } + } +diff --git a/net/minecraft/world/entity/animal/parrot/Parrot.java b/net/minecraft/world/entity/animal/parrot/Parrot.java +index 0337ddcd664cd0329d98286214d1aa4daf83e1ea..6a4d170cd1e4dde2af30895f9fbac9dd599d0602 100644 +--- a/net/minecraft/world/entity/animal/parrot/Parrot.java ++++ b/net/minecraft/world/entity/animal/parrot/Parrot.java +@@ -137,12 +137,68 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { + + public Parrot(EntityType type, Level level) { super(type, level); +- this.moveControl = new FlyingMoveControl(this, 10, false); ++ // Purpur start - Ridables ++ final org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD flyingController = new org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD(this, 0.3F); ++ class ParrotMoveControl extends FlyingMoveControl { ++ public ParrotMoveControl(Mob entity, int maxPitchChange, boolean noGravity) { ++ super(entity, maxPitchChange, noGravity); ++ } ++ ++ @Override ++ public void tick() { ++ if (mob.getRider() != null && mob.isControllable()) { ++ flyingController.purpurTick(mob.getRider()); ++ } else { ++ super.tick(); ++ } ++ } ++ ++ @Override ++ public boolean hasWanted() { ++ return mob.getRider() != null && mob.isControllable() ? getForwardMot() != 0 || getStrafeMot() != 0 : super.hasWanted(); ++ } ++ } ++ this.moveControl = new ParrotMoveControl(this, 10, false); ++ // Purpur end - Ridables + this.setPathfindingMalus(PathType.DANGER_FIRE, -1.0F); + this.setPathfindingMalus(PathType.DAMAGE_FIRE, -1.0F); + this.setPathfindingMalus(PathType.COCOA, -1.0F); } + // Purpur start - Ridables + @Override ++ public boolean isRidable() { ++ return level().purpurConfig.parrotRidable; ++ } ++ ++ @Override + public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.muleRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.parrotRidableInWater; + } -+ // Purpur end - Ridables + - @Override - public SoundEvent getAmbientSound() { - return SoundEvents.MULE_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -index 3f0b3b38e8135c5534fa5a1d900d499e6091eb73..47b36581d5291e4d223fb39572d62674b8eb68bc 100644 ---- a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -+++ b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -@@ -42,6 +42,13 @@ public class SkeletonHorse extends AbstractHorse { - super(type, level); - } - -+ // Purpur start - Ridables + @Override -+ public boolean isTamed() { -+ return super.isTamed() || this.level().purpurConfig.skeletonHorseRidable; ++ public boolean isControllable() { ++ return level().purpurConfig.parrotControllable; ++ } ++ ++ @Override ++ public double getMaxY() { ++ return level().purpurConfig.parrotMaxY; ++ } ++ ++ @Override ++ public void travel(Vec3 vec3) { ++ super.travel(vec3); ++ if (getRider() != null && this.isControllable() && !onGround) { ++ float speed = (float) getAttributeValue(Attributes.FLYING_SPEED) * 2; ++ setSpeed(speed); ++ Vec3 mot = getDeltaMovement(); ++ move(net.minecraft.world.entity.MoverType.SELF, mot.multiply(speed, 0.25, speed)); ++ setDeltaMovement(mot.scale(0.9D)); ++ } + } + // Purpur end - Ridables + - public static AttributeSupplier.Builder createAttributes() { - return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); - } -@@ -61,6 +68,7 @@ public class SkeletonHorse extends AbstractHorse { + @Override + public @Nullable SpawnGroupData finalizeSpawn( + ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData +@@ -162,9 +218,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { @Override - protected void addBehaviourGoals() { -+ if (level().purpurConfig.skeletonHorseCanSwim) goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur - Ridables - } - - @Override -diff --git a/net/minecraft/world/entity/animal/horse/TraderLlama.java b/net/minecraft/world/entity/animal/horse/TraderLlama.java -index d8c58d747b78bf9aa49dbc0f7685ecbefcb817ce..21211278de627079d7c9e91305e42aa0f8ae34d3 100644 ---- a/net/minecraft/world/entity/animal/horse/TraderLlama.java -+++ b/net/minecraft/world/entity/animal/horse/TraderLlama.java -@@ -31,6 +31,28 @@ public class TraderLlama extends Llama { + protected void registerGoals() { +- this.goalSelector.addGoal(0, new TamableAnimal.TamableAnimalPanicGoal(1.25)); ++ //this.goalSelector.addGoal(0, new TamableAnimal.TamableAnimalPanicGoal(1.25)); // Purpur - move down + this.goalSelector.addGoal(0, new FloatGoal(this)); + if (this.level().purpurConfig.parrotBreedable) this.goalSelector.addGoal(1, new net.minecraft.world.entity.ai.goal.BreedGoal(this, 1.0D)); // Purpur - Breedable parrots ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables ++ this.goalSelector.addGoal(1, new TamableAnimal.TamableAnimalPanicGoal(1.25D)); // Purpur - Ridables + this.goalSelector.addGoal(1, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); + this.goalSelector.addGoal(2, new FollowOwnerGoal(this, 1.0, 5.0F, 1.0F)); +diff --git a/net/minecraft/world/entity/animal/pig/Pig.java b/net/minecraft/world/entity/animal/pig/Pig.java +index 481d365f6f1f60ca0870a8de2ffc25d4fac11059..afae5546eae084bafaa164705d4e6f09af3bc43a 100644 +--- a/net/minecraft/world/entity/animal/pig/Pig.java ++++ b/net/minecraft/world/entity/animal/pig/Pig.java +@@ -67,9 +67,27 @@ public class Pig extends Animal implements ItemSteerable { super(type, level); } + // Purpur start - Ridables + @Override + public boolean isRidable() { -+ return level().purpurConfig.traderLlamaRidable; ++ return level().purpurConfig.pigRidable; + } + + @Override + public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.traderLlamaRidableInWater; ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.pigRidableInWater; + } + + @Override + public boolean isControllable() { -+ return level().purpurConfig.traderLlamaControllable; -+ } -+ -+ @Override -+ public boolean isSaddled() { -+ return super.isSaddled() || isTamed(); ++ return level().purpurConfig.pigControllable; + } + // Purpur end - Ridables + @Override - public boolean isTraderLlama() { - return true; -diff --git a/net/minecraft/world/entity/animal/horse/ZombieHorse.java b/net/minecraft/world/entity/animal/horse/ZombieHorse.java -index c7bc8c41e01f4fe1c49ed79e0e5f3324e2fa0118..c916c28b0d3115588cedf84cf70469b6f6050ec9 100644 ---- a/net/minecraft/world/entity/animal/horse/ZombieHorse.java -+++ b/net/minecraft/world/entity/animal/horse/ZombieHorse.java -@@ -33,6 +33,18 @@ public class ZombieHorse extends AbstractHorse { + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new PanicGoal(this, 1.25)); + this.goalSelector.addGoal(3, new BreedGoal(this, 1.0)); + this.goalSelector.addGoal(4, new TemptGoal(this, 1.2, itemStack -> itemStack.is(Items.CARROT_ON_A_STICK), false)); +diff --git a/net/minecraft/world/entity/animal/polarbear/PolarBear.java b/net/minecraft/world/entity/animal/polarbear/PolarBear.java +index df4b4a4d32019ef3a667841a0ce4485a8325e897..718531a324c36ac65a93af5c12e0c0a3948606cb 100644 +--- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java ++++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java +@@ -61,6 +61,7 @@ public class PolarBear extends Animal implements NeutralMob { + private static final UniformInt PERSISTENT_ANGER_TIME = TimeUtil.rangeOfSeconds(20, 39); + private long persistentAngerEndTime; + private @Nullable EntityReference persistentAngerTarget; ++ private int standTimer = 0; // Purpur - Ridables + + public PolarBear(EntityType type, Level level) { super(type, level); +@@ -89,6 +90,34 @@ public class PolarBear extends Animal implements NeutralMob { + } + // Purpur end - Breedable Polar Bears + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.polarBearRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.polarBearRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.polarBearControllable; ++ } ++ ++ @Override ++ public boolean onSpacebar() { ++ if (!isStanding()) { ++ if (getRider() != null && getRider().getForwardMot() == 0 && getRider().getStrafeMot() == 0) { ++ setStanding(true); ++ playSound(SoundEvents.POLAR_BEAR_WARNING, 1.0F, 1.0F); ++ } ++ } ++ return false; ++ } ++ // Purpur end - Ridables ++ + @Override + public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return EntityType.POLAR_BEAR.create(level, EntitySpawnReason.BREEDING); +@@ -103,6 +132,7 @@ public class PolarBear extends Animal implements NeutralMob { + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(0, new FloatGoal(this)); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new PolarBear.PolarBearMeleeAttackGoal()); + this.goalSelector.addGoal(1, new PanicGoal(this, 2.0, mob -> mob.isBaby() ? DamageTypeTags.PANIC_CAUSES : DamageTypeTags.PANIC_ENVIRONMENTAL_CAUSES)); + // Purpur start - Breedable Polar Bears +@@ -115,6 +145,7 @@ public class PolarBear extends Animal implements NeutralMob { + this.goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); + this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new PolarBear.PolarBearHurtByTargetGoal()); + this.targetSelector.addGoal(2, new PolarBear.PolarBearAttackPlayersGoal()); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); +@@ -232,6 +263,12 @@ public class PolarBear extends Animal implements NeutralMob { + if (!this.level().isClientSide()) { + this.updatePersistentAnger((ServerLevel)this.level(), true); + } ++ ++ // Purpur start - Ridables ++ if (isStanding() && --standTimer <= 0) { ++ setStanding(false); ++ } ++ // Purpur end - Ridables + } + + @Override +@@ -251,6 +288,7 @@ public class PolarBear extends Animal implements NeutralMob { + + public void setStanding(boolean standing) { + this.entityData.set(DATA_STANDING_ID, standing); ++ standTimer = standing ? 20 : -1; // Purpur - Ridables + } + + public float getStandingAnimationScale(float partialTick) { +diff --git a/net/minecraft/world/entity/animal/rabbit/Rabbit.java b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +index d5e7599c23405eb5a4519e2dfd93ddbe2853fa3b..16fbee742f28cf4571effb66265daeee64bae9b7 100644 +--- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java ++++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +@@ -94,6 +94,7 @@ public class Rabbit extends Animal { + private boolean wasOnGround; + private int jumpDelayTicks; + public int moreCarrotTicks = 0; ++ private boolean actualJump; // Purpur - Ridables + + public Rabbit(EntityType type, Level level) { + super(type, level); +@@ -102,9 +103,55 @@ public class Rabbit extends Animal { + // this.setSpeedModifier(0.0); // CraftBukkit } + // Purpur start - Ridables + @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombieHorseRidableInWater; ++ public boolean isRidable() { ++ return level().purpurConfig.rabbitRidable; + } + + @Override -+ public boolean isTamed() { -+ return super.isTamed() || this.level().purpurConfig.zombieHorseRidable; ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.rabbitRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.rabbitControllable; ++ } ++ ++ @Override ++ public boolean onSpacebar() { ++ if (onGround) { ++ actualJump = true; ++ jumpFromGround(); ++ actualJump = false; ++ } ++ return true; ++ } ++ ++ private void handleJumping() { ++ if (onGround) { ++ RabbitJumpControl jumpController = (RabbitJumpControl) jumpControl; ++ if (!wasOnGround) { ++ setJumping(false); ++ jumpController.setCanJump(false); ++ } ++ if (!jumpController.wantJump()) { ++ if (moveControl.hasWanted()) { ++ startJumping(); ++ } ++ } else if (!jumpController.canJump()) { ++ jumpController.setCanJump(true); ++ } ++ } ++ wasOnGround = onGround; + } + // Purpur end - Ridables + - public static AttributeSupplier.Builder createAttributes() { - return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); - } -@@ -78,6 +90,7 @@ public class ZombieHorse extends AbstractHorse { + @Override + public void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); ++ this.goalSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new ClimbOnTopOfPowderSnowGoal(this, this.level())); + this.goalSelector.addGoal(1, new Rabbit.RabbitPanicGoal(this, 2.2)); + this.goalSelector.addGoal(2, new BreedGoal(this, 0.8)); +@@ -119,6 +166,14 @@ public class Rabbit extends Animal { @Override - protected void addBehaviourGoals() { -+ if (level().purpurConfig.zombieHorseCanSwim) goalSelector.addGoal(0, new net.minecraft.world.entity.ai.goal.FloatGoal(this)); // Purpur - Ridables - } + protected float getJumpPower() { ++ // Purpur start - Ridables ++ if (getRider() != null && this.isControllable()) { ++ if (getForwardMot() < 0) { ++ setSpeed(getForwardMot() * 2F); ++ } ++ return actualJump ? 0.5F : 0.3F; ++ } ++ // Purpur end - Ridables + float f = 0.3F; + if (this.moveControl.getSpeedModifier() <= 0.6) { + f = 0.2F; +@@ -186,6 +241,12 @@ public class Rabbit extends Animal { @Override + public void customServerAiStep(ServerLevel level) { ++ // Purpur start - Ridables ++ if (getRider() != null && this.isControllable()) { ++ handleJumping(); ++ return; ++ } ++ // Purpur end - Ridables + if (this.jumpDelayTicks > 0) { + this.jumpDelayTicks--; + } +@@ -511,7 +572,7 @@ public class Rabbit extends Animal { + } + } + +- static class RabbitMoveControl extends MoveControl { ++ static class RabbitMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables + private final Rabbit rabbit; + private double nextJumpSpeed; + +@@ -521,14 +582,14 @@ public class Rabbit extends Animal { + } + + @Override +- public void tick() { ++ public void vanillaTick() { // Purpur - Ridables + if (this.rabbit.onGround() && !this.rabbit.jumping && !((Rabbit.RabbitJumpControl)this.rabbit.jumpControl).wantJump()) { + this.rabbit.setSpeedModifier(0.0); + } else if (this.hasWanted() || this.operation == MoveControl.Operation.JUMPING) { + this.rabbit.setSpeedModifier(this.nextJumpSpeed); + } + +- super.tick(); ++ super.vanillaTick(); // Purpur - Ridables + } + + @Override diff --git a/net/minecraft/world/entity/animal/sheep/Sheep.java b/net/minecraft/world/entity/animal/sheep/Sheep.java -index 7bfac1d56a2236a666115daf2464ce3283a83db6..52cdadd752c7e470a22eaac70143766d0ad46843 100644 +index 8f4e68b1a910cd56d4c57540c0a09a8724d13738..a33800517d5fb5ab008e22b77be2f079901c1a99 100644 --- a/net/minecraft/world/entity/animal/sheep/Sheep.java +++ b/net/minecraft/world/entity/animal/sheep/Sheep.java @@ -63,10 +63,28 @@ public class Sheep extends Animal implements Shearable { @@ -2697,11 +2528,180 @@ index a4d60a0dddabd7981d2db28af6b1d88d64d6e806..3d5cf62bd9bd99a978b7dc535675178d this.getBrain().tick(level, this); profilerFiller.popPush("snifferActivityUpdate"); SnifferAi.updateActivity(this); +diff --git a/net/minecraft/world/entity/animal/squid/GlowSquid.java b/net/minecraft/world/entity/animal/squid/GlowSquid.java +index 2b1ece8ff62376a0851c18c39f43882abf2abaca..c5a8080aa0fa1014602ba76fb4d8ad69b926dbfa 100644 +--- a/net/minecraft/world/entity/animal/squid/GlowSquid.java ++++ b/net/minecraft/world/entity/animal/squid/GlowSquid.java +@@ -37,6 +37,19 @@ public class GlowSquid extends Squid { + } + // Purpur end - Flying squids! Oh my! + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.glowSquidRidable; ++ } ++ ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.glowSquidControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected ParticleOptions getInkParticle() { + return ParticleTypes.GLOW_SQUID_INK; +diff --git a/net/minecraft/world/entity/animal/squid/Squid.java b/net/minecraft/world/entity/animal/squid/Squid.java +index 504573bf4cbdf1debfa9f9bd071fa40d443b860d..69d87bd27a95bb9e92cd24fb7973a9b06714567e 100644 +--- a/net/minecraft/world/entity/animal/squid/Squid.java ++++ b/net/minecraft/world/entity/animal/squid/Squid.java +@@ -71,9 +71,32 @@ public class Squid extends AgeableWaterCreature { + } + // Purpur end - Flying squids! Oh my! + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.squidRidable; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.squidControllable; ++ } ++ ++ protected static void rotateVectorAroundY(org.bukkit.util.Vector vector, double degrees) { ++ double rad = Math.toRadians(degrees); ++ double cos = Math.cos(rad); ++ double sine = Math.sin(rad); ++ double x = vector.getX(); ++ double z = vector.getZ(); ++ vector.setX(cos * x - sine * z); ++ vector.setZ(sine * x + cos * z); ++ } ++ // Purpur end - Ridables ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new Squid.SquidFleeGoal()); + } + +@@ -325,6 +348,37 @@ public class Squid extends AgeableWaterCreature { + + @Override + public void tick() { ++ // Purpur start - Ridables ++ net.minecraft.world.entity.player.Player rider = squid.getRider(); ++ if (rider != null && squid.isControllable()) { ++ if (rider.jumping) { ++ squid.onSpacebar(); ++ } ++ float forward = rider.getForwardMot(); ++ float strafe = rider.getStrafeMot(); ++ float speed = (float) squid.getAttributeValue(Attributes.MOVEMENT_SPEED) * 10F; ++ if (forward < 0.0F) { ++ speed *= -0.5; ++ } ++ org.bukkit.util.Vector dir = rider.getBukkitEntity().getEyeLocation().getDirection().normalize().multiply(speed / 20.0F); ++ if (strafe != 0.0F) { ++ if (forward == 0.0F) { ++ dir.setY(0); ++ rotateVectorAroundY(dir, strafe > 0.0F ? -90 : 90); ++ } else if (forward < 0.0F) { ++ rotateVectorAroundY(dir, strafe > 0.0F ? 45 : -45); ++ } else { ++ rotateVectorAroundY(dir, strafe > 0.0F ? -45 : 45); ++ } ++ } ++ if (forward != 0.0F || strafe != 0.0F) { ++ squid.movementVector = new Vec3((float) dir.getX(), (float) dir.getY(), (float) dir.getZ()); ++ } else { ++ squid.movementVector = Vec3.ZERO; ++ } ++ return; ++ } ++ // Purpur end - Ridables + int noActionTime = this.squid.getNoActionTime(); + if (noActionTime > 100) { + this.squid.movementVector = Vec3.ZERO; +diff --git a/net/minecraft/world/entity/animal/turtle/Turtle.java b/net/minecraft/world/entity/animal/turtle/Turtle.java +index fdbc70322eb653d2cc576090c27d1cb67bfce1f6..7699967db327cf80940bf30d8e0c734b43fd1e8f 100644 +--- a/net/minecraft/world/entity/animal/turtle/Turtle.java ++++ b/net/minecraft/world/entity/animal/turtle/Turtle.java +@@ -87,6 +87,23 @@ public class Turtle extends Animal { + this.moveControl = new Turtle.TurtleMoveControl(this); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.turtleRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.turtleRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.turtleControllable; ++ } ++ // Purpur end - Ridables ++ + public void setHomePos(BlockPos homePos) { + this.homePos = homePos; + } +@@ -145,6 +162,7 @@ public class Turtle extends Animal { + + @Override + protected void registerGoals() { ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(0, new Turtle.TurtlePanicGoal(this, 1.2)); + this.goalSelector.addGoal(1, new Turtle.TurtleBreedGoal(this, 1.0)); + this.goalSelector.addGoal(1, new Turtle.TurtleLayEggGoal(this, 1.0)); +@@ -485,12 +503,14 @@ public class Turtle extends Animal { + } + } + +- static class TurtleMoveControl extends MoveControl { ++ static class TurtleMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables + private final Turtle turtle; ++ private final org.purpurmc.purpur.controller.WaterMoveControllerWASD waterController; // Purpur - Ridables + + TurtleMoveControl(Turtle mob) { + super(mob); + this.turtle = mob; ++ waterController = new org.purpurmc.purpur.controller.WaterMoveControllerWASD(turtle, 0.25D); // Purpur - Ridables + } + + private void updateSpeed() { +@@ -509,7 +529,7 @@ public class Turtle extends Animal { + } + + @Override +- public void tick() { ++ public void vanillaTick() { // Purpur - Ridables + this.updateSpeed(); + if (this.operation == MoveControl.Operation.MOVE_TO && !this.turtle.getNavigation().isDone()) { + double d = this.wantedX - this.turtle.getX(); +@@ -523,7 +543,7 @@ public class Turtle extends Animal { + float f = (float)(Mth.atan2(d2, d) * 180.0F / (float)Math.PI) - 90.0F; + this.turtle.setYRot(this.rotlerp(this.turtle.getYRot(), f, 90.0F)); + this.turtle.yBodyRot = this.turtle.getYRot(); +- float f1 = (float)(this.speedModifier * this.turtle.getAttributeValue(Attributes.MOVEMENT_SPEED)); ++ float f1 = (float)(this.getSpeedModifier() * this.turtle.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables + this.turtle.setSpeed(Mth.lerp(0.125F, this.turtle.getSpeed(), f1)); + this.turtle.setDeltaMovement(this.turtle.getDeltaMovement().add(0.0, this.turtle.getSpeed() * d1 * 0.1, 0.0)); + } diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index 9f79615cda890d5823fda94bad5b8cddde22e14d..b452d7c881f9b90ad429e9a522b17dfdbb480c31 100644 +index 725624f63a2fbf0bd489a92e2c5862c82d72556c..44b650de646ea605e41f39f3d99d8f550c9a8e19 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -187,9 +187,32 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -186,9 +186,32 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Configurable default collar color @@ -2734,7 +2734,7 @@ index 9f79615cda890d5823fda94bad5b8cddde22e14d..b452d7c881f9b90ad429e9a522b17dfd this.goalSelector.addGoal(1, new TamableAnimal.TamableAnimalPanicGoal(1.5, DamageTypeTags.PANIC_ENVIRONMENTAL_CAUSES)); this.goalSelector.addGoal(2, new SitWhenOrderedToGoal(this)); this.goalSelector.addGoal(3, new Wolf.WolfAvoidEntityGoal<>(this, Llama.class, 24.0F, 1.5, 1.5)); -@@ -202,6 +225,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -201,6 +224,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { this.goalSelector.addGoal(9, new BegGoal(this, 8.0F)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Player.class, 8.0F)); this.goalSelector.addGoal(10, new RandomLookAroundGoal(this)); @@ -2742,29 +2742,11 @@ index 9f79615cda890d5823fda94bad5b8cddde22e14d..b452d7c881f9b90ad429e9a522b17dfd this.targetSelector.addGoal(1, new OwnerHurtByTargetGoal(this)); this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); this.targetSelector.addGoal(3, new HurtByTargetGoal(this).setAlertOthers()); -diff --git a/net/minecraft/world/entity/boss/EnderDragonPart.java b/net/minecraft/world/entity/boss/EnderDragonPart.java -index c9443cbde85109b19e6c84274c562d83a229c763..ec82bd00f7be253beac1dfbe00a36d25daa11775 100644 ---- a/net/minecraft/world/entity/boss/EnderDragonPart.java -+++ b/net/minecraft/world/entity/boss/EnderDragonPart.java -@@ -28,6 +28,13 @@ public class EnderDragonPart extends Entity { - this.name = name; - } - -+ // Purpur start - Ridables -+ @Override -+ public net.minecraft.world.InteractionResult interact(net.minecraft.world.entity.player.Player player, net.minecraft.world.InteractionHand hand) { -+ return parentMob.isAlive() ? parentMob.tryRide(player, hand) : net.minecraft.world.InteractionResult.PASS; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - } diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 14216ad9e1182dd9c380c79b1f1f3926ad6f458b..743abfe1eceaa8e9530790abdc787d3765c1191e 100644 +index b7b76dd193820c9a3f22349572ba443619114d58..b8ddcc460ff1ae1cbfde70d3d8c16486bb2d3f8c 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -93,6 +93,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -90,6 +90,7 @@ public class EnderDragon extends Mob implements Enemy { private final net.minecraft.world.level.Explosion explosionSource; // Paper - reusable source for CraftTNTPrimed.getSource() @Nullable private BlockPos podium; // Paper end @@ -2772,7 +2754,7 @@ index 14216ad9e1182dd9c380c79b1f1f3926ad6f458b..743abfe1eceaa8e9530790abdc787d37 public EnderDragon(EntityType type, Level level) { super(EntityType.ENDER_DRAGON, level); -@@ -109,6 +110,37 @@ public class EnderDragon extends Mob implements Enemy { +@@ -106,6 +107,37 @@ public class EnderDragon extends Mob implements Enemy { this.noPhysics = true; this.phaseManager = new EnderDragonPhaseManager(this); this.explosionSource = new net.minecraft.world.level.ServerExplosion(level.getMinecraftWorld(), this, null, null, new Vec3(Double.NaN, Double.NaN, Double.NaN), Float.NaN, true, net.minecraft.world.level.Explosion.BlockInteraction.DESTROY); // Paper @@ -2810,7 +2792,7 @@ index 14216ad9e1182dd9c380c79b1f1f3926ad6f458b..743abfe1eceaa8e9530790abdc787d37 } public void setDragonFight(EndDragonFight dragonFight) { -@@ -123,6 +155,17 @@ public class EnderDragon extends Mob implements Enemy { +@@ -120,6 +152,17 @@ public class EnderDragon extends Mob implements Enemy { return this.fightOrigin; } @@ -2828,7 +2810,7 @@ index 14216ad9e1182dd9c380c79b1f1f3926ad6f458b..743abfe1eceaa8e9530790abdc787d37 public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 200.0).add(Attributes.CAMERA_DISTANCE, 16.0); } -@@ -172,6 +215,37 @@ public class EnderDragon extends Mob implements Enemy { +@@ -169,6 +212,37 @@ public class EnderDragon extends Mob implements Enemy { @Override public void aiStep() { @@ -2866,7 +2848,7 @@ index 14216ad9e1182dd9c380c79b1f1f3926ad6f458b..743abfe1eceaa8e9530790abdc787d37 this.processFlappingMovement(); if (this.level().isClientSide()) { this.setHealth(this.getHealth()); -@@ -200,6 +274,8 @@ public class EnderDragon extends Mob implements Enemy { +@@ -197,6 +271,8 @@ public class EnderDragon extends Mob implements Enemy { this.oFlapTime = this.flapTime; if (this.isDeadOrDying()) { @@ -2875,7 +2857,7 @@ index 14216ad9e1182dd9c380c79b1f1f3926ad6f458b..743abfe1eceaa8e9530790abdc787d37 float f = (this.random.nextFloat() - 0.5F) * 8.0F; float f1 = (this.random.nextFloat() - 0.5F) * 4.0F; float f2 = (this.random.nextFloat() - 0.5F) * 8.0F; -@@ -209,9 +285,9 @@ public class EnderDragon extends Mob implements Enemy { +@@ -206,9 +282,9 @@ public class EnderDragon extends Mob implements Enemy { Vec3 deltaMovement = this.getDeltaMovement(); float f1 = 0.2F / ((float)deltaMovement.horizontalDistance() * 10.0F + 1.0F); f1 *= (float)Math.pow(2.0, deltaMovement.y); @@ -2887,7 +2869,7 @@ index 14216ad9e1182dd9c380c79b1f1f3926ad6f458b..743abfe1eceaa8e9530790abdc787d37 this.flapTime += f1 * 0.5F; } else { this.flapTime += f1; -@@ -222,7 +298,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -219,7 +295,7 @@ public class EnderDragon extends Mob implements Enemy { this.flapTime = 0.5F; } else { this.flightHistory.record(this.getY(), this.getYRot()); @@ -2896,7 +2878,7 @@ index 14216ad9e1182dd9c380c79b1f1f3926ad6f458b..743abfe1eceaa8e9530790abdc787d37 DragonPhaseInstance currentPhase = this.phaseManager.getCurrentPhase(); currentPhase.doServerTick(serverLevel1); if (this.phaseManager.getCurrentPhase() != currentPhase) { -@@ -297,7 +373,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -294,7 +370,7 @@ public class EnderDragon extends Mob implements Enemy { this.tickPart(this.body, sin1 * 0.5F, 0.0, -cos1 * 0.5F); this.tickPart(this.wing1, cos1 * 4.5F, 2.0, sin1 * 4.5F); this.tickPart(this.wing2, cos1 * -4.5F, 2.0, sin1 * -4.5F); @@ -2905,7 +2887,7 @@ index 14216ad9e1182dd9c380c79b1f1f3926ad6f458b..743abfe1eceaa8e9530790abdc787d37 this.knockBack( serverLevel2, serverLevel2.getEntities( -@@ -347,9 +423,9 @@ public class EnderDragon extends Mob implements Enemy { +@@ -344,9 +420,9 @@ public class EnderDragon extends Mob implements Enemy { } if (this.level() instanceof ServerLevel serverLevel3) { @@ -2917,8 +2899,26 @@ index 14216ad9e1182dd9c380c79b1f1f3926ad6f458b..743abfe1eceaa8e9530790abdc787d37 if (this.dragonFight != null) { this.dragonFight.updateDragon(this); } +diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragonPart.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragonPart.java +index 41200efbaa29ee487c0383b261122e0701413865..871adbd10f49a4d59820c089da149a47de424656 100644 +--- a/net/minecraft/world/entity/boss/enderdragon/EnderDragonPart.java ++++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragonPart.java +@@ -27,6 +27,13 @@ public class EnderDragonPart extends Entity { + this.name = name; + } + ++ // Purpur start - Ridables ++ @Override ++ public net.minecraft.world.InteractionResult interact(net.minecraft.world.entity.player.Player player, net.minecraft.world.InteractionHand hand) { ++ return parentMob.isAlive() ? parentMob.tryRide(player, hand) : net.minecraft.world.InteractionResult.PASS; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + } diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index d94d1d673dbb69742203119d1ef6bf0404efaada..03167b61a9f2886d31881af809d7bca7be325872 100644 +index f170db52921583050786050cf7fdaee439117bb8..dbf3c7049fae08dc5c4ac491a5fc8141ab177a22 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java @@ -72,6 +72,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { @@ -2932,7 +2932,7 @@ index d94d1d673dbb69742203119d1ef6bf0404efaada..03167b61a9f2886d31881af809d7bca7 @@ -81,9 +82,23 @@ public class WitherBoss extends Monster implements RangedAttackMob { && entity.attackable(); private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0).selector(LIVING_ENTITY_SELECTOR); - @Nullable private java.util.UUID summoner; // Purpur - Summoner API + private java.util.@Nullable UUID summoner; // Purpur - Summoner API + private org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD purpurController; // Purpur - Ridables public WitherBoss(EntityType type, Level level) { @@ -2953,7 +2953,7 @@ index d94d1d673dbb69742203119d1ef6bf0404efaada..03167b61a9f2886d31881af809d7bca7 this.moveControl = new FlyingMoveControl(this, 10, false); this.setHealth(this.getMaxHealth()); this.xpReward = 50; -@@ -100,6 +115,105 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -99,6 +114,105 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Summoner API @@ -3059,7 +3059,7 @@ index d94d1d673dbb69742203119d1ef6bf0404efaada..03167b61a9f2886d31881af809d7bca7 @Override protected PathNavigation createNavigation(Level level) { FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); -@@ -110,11 +224,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -109,11 +223,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { @Override protected void registerGoals() { @@ -3073,7 +3073,7 @@ index d94d1d673dbb69742203119d1ef6bf0404efaada..03167b61a9f2886d31881af809d7bca7 this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 0, false, false, LIVING_ENTITY_SELECTOR)); } -@@ -274,6 +390,15 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -273,6 +389,15 @@ public class WitherBoss extends Monster implements RangedAttackMob { @Override protected void customServerAiStep(ServerLevel level) { @@ -3089,7 +3089,7 @@ index d94d1d673dbb69742203119d1ef6bf0404efaada..03167b61a9f2886d31881af809d7bca7 if (this.getInvulnerableTicks() > 0) { int i = this.getInvulnerableTicks() - 1; this.bossEvent.setProgress(1.0F - i / 220.0F); -@@ -580,11 +705,11 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -579,11 +704,11 @@ public class WitherBoss extends Monster implements RangedAttackMob { } public int getAlternativeTarget(int head) { @@ -3103,27 +3103,8 @@ index d94d1d673dbb69742203119d1ef6bf0404efaada..03167b61a9f2886d31881af809d7bca7 } public boolean isPowered() { -diff --git a/net/minecraft/world/entity/monster/AbstractSkeleton.java b/net/minecraft/world/entity/monster/AbstractSkeleton.java -index 3d2fcdc99cea6981c8d516853ba28f51bd114dbd..7e43dd4b44335989127cc1b6e2c59d771876887a 100644 ---- a/net/minecraft/world/entity/monster/AbstractSkeleton.java -+++ b/net/minecraft/world/entity/monster/AbstractSkeleton.java -@@ -73,12 +73,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo - - @Override - protected void registerGoals() { -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(2, new RestrictSunGoal(this)); - this.goalSelector.addGoal(3, new FleeSunGoal(this, 1.0)); - this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Wolf.class, 6.0F, 1.0, 1.2)); - this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0)); - this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); - this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); diff --git a/net/minecraft/world/entity/monster/Blaze.java b/net/minecraft/world/entity/monster/Blaze.java -index db5d01f3868423c023ad317df84e9ab9a634876d..1571709d83b8e01707dac274447419413ef82a43 100644 +index f5539b27261755380312b392fee836cbaaff2e56..1febee23188d91e2a27c182b97502e8c7ab696a2 100644 --- a/net/minecraft/world/entity/monster/Blaze.java +++ b/net/minecraft/world/entity/monster/Blaze.java @@ -34,6 +34,7 @@ public class Blaze extends Monster { @@ -3205,64 +3186,8 @@ index db5d01f3868423c023ad317df84e9ab9a634876d..1571709d83b8e01707dac27444741941 this.nextHeightOffsetChangeTick--; if (this.nextHeightOffsetChangeTick <= 0) { this.nextHeightOffsetChangeTick = 100; -diff --git a/net/minecraft/world/entity/monster/Bogged.java b/net/minecraft/world/entity/monster/Bogged.java -index c216f7c388b1d7003609177bb1a0be12a3c8053f..71a8bf118babb1fd7985caac087855c1da85025c 100644 ---- a/net/minecraft/world/entity/monster/Bogged.java -+++ b/net/minecraft/world/entity/monster/Bogged.java -@@ -43,6 +43,23 @@ public class Bogged extends AbstractSkeleton implements Shearable { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.boggedRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.boggedRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.boggedControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/monster/CaveSpider.java b/net/minecraft/world/entity/monster/CaveSpider.java -index f033b7c5934a97baafa2434ad82516c2a1e76d76..e528e85dfb080c6fa28c01536d8fd0a29662651e 100644 ---- a/net/minecraft/world/entity/monster/CaveSpider.java -+++ b/net/minecraft/world/entity/monster/CaveSpider.java -@@ -26,6 +26,23 @@ public class CaveSpider extends Spider { - return Spider.createAttributes().add(Attributes.MAX_HEALTH, 12.0); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.caveSpiderRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.caveSpiderRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.caveSpiderControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - public boolean doHurtTarget(ServerLevel level, Entity target) { - if (super.doHurtTarget(level, target)) { diff --git a/net/minecraft/world/entity/monster/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index c3386bd6028a9391d2eb00567b711f89b4585608..c3e2677a817da764577acc7298ad5fe52d7d5b2e 100644 +index 168003b7159b5e9ea3e3ca19d0b939ed1cfd2311..cfd09a5ff326cf4ecc248901696ce1f623a8e7c0 100644 --- a/net/minecraft/world/entity/monster/Creeper.java +++ b/net/minecraft/world/entity/monster/Creeper.java @@ -57,21 +57,98 @@ public class Creeper extends Monster { @@ -3372,70 +3297,6 @@ index c3386bd6028a9391d2eb00567b711f89b4585608..c3e2677a817da764577acc7298ad5fe5 } } } -diff --git a/net/minecraft/world/entity/monster/Drowned.java b/net/minecraft/world/entity/monster/Drowned.java -index 6c51ecee06538de51ce02ea73e173a766ce8515c..8ab6c0f67ac25c1229850ae01abd01d878827d0c 100644 ---- a/net/minecraft/world/entity/monster/Drowned.java -+++ b/net/minecraft/world/entity/monster/Drowned.java -@@ -71,6 +71,23 @@ public class Drowned extends Zombie implements RangedAttackMob { - return Zombie.createAttributes().add(Attributes.STEP_HEIGHT, 1.0); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.drownedRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.drownedRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.drownedControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected PathNavigation createNavigation(Level level) { - return new AmphibiousPathNavigation(this, level); -@@ -400,7 +417,7 @@ public class Drowned extends Zombie implements RangedAttackMob { - } - } - -- static class DrownedMoveControl extends MoveControl { -+ static class DrownedMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables - private final Drowned drowned; - - public DrownedMoveControl(Drowned mob) { -@@ -409,7 +426,7 @@ public class Drowned extends Zombie implements RangedAttackMob { - } - - @Override -- public void tick() { -+ public void vanillaTick() { // Purpur - Ridables - LivingEntity target = this.drowned.getTarget(); - if (this.drowned.wantsToSwim() && this.drowned.isInWater()) { - if (target != null && target.getY() > this.drowned.getY() || this.drowned.searchingForLand) { -@@ -429,7 +446,7 @@ public class Drowned extends Zombie implements RangedAttackMob { - float f = (float)(Mth.atan2(d2, d) * 180.0F / (float)Math.PI) - 90.0F; - this.drowned.setYRot(this.rotlerp(this.drowned.getYRot(), f, 90.0F)); - this.drowned.yBodyRot = this.drowned.getYRot(); -- float f1 = (float)(this.speedModifier * this.drowned.getAttributeValue(Attributes.MOVEMENT_SPEED)); -+ float f1 = (float)(this.getSpeedModifier() * this.drowned.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables - float f2 = Mth.lerp(0.125F, this.drowned.getSpeed(), f1); - this.drowned.setSpeed(f2); - this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(f2 * d * 0.005, f2 * d1 * 0.1, f2 * d2 * 0.005)); -@@ -438,7 +455,7 @@ public class Drowned extends Zombie implements RangedAttackMob { - this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(0.0, -0.008, 0.0)); - } - -- super.tick(); -+ super.vanillaTick(); // Purpur - Ridables - } - } - } diff --git a/net/minecraft/world/entity/monster/ElderGuardian.java b/net/minecraft/world/entity/monster/ElderGuardian.java index 3a16eb269b733fcf1db5dbc2dfae13009e2278b5..e5d16ca14a40d520dce43dd3d9b6347aefbd25d7 100644 --- a/net/minecraft/world/entity/monster/ElderGuardian.java @@ -3460,10 +3321,10 @@ index 3a16eb269b733fcf1db5dbc2dfae13009e2278b5..e5d16ca14a40d520dce43dd3d9b6347a return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.3F).add(Attributes.ATTACK_DAMAGE, 8.0).add(Attributes.MAX_HEALTH, 80.0); } diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index 87aaa6cd478d8d635b625d1a98bce23d577fb33a..6ded7dfa381d0041dffb914a85c2e835c0b4a493 100644 +index 2d903c77017ae356eb309df3c2c43b91c4e52f2f..bd78d8c3e8c1d9b581c751d336322fbfe20dacef 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -90,9 +90,27 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -89,9 +89,27 @@ public class EnderMan extends Monster implements NeutralMob { this.setPathfindingMalus(PathType.WATER, -1.0F); } @@ -3491,7 +3352,7 @@ index 87aaa6cd478d8d635b625d1a98bce23d577fb33a..6ded7dfa381d0041dffb914a85c2e835 this.goalSelector.addGoal(1, new EnderMan.EndermanFreezeWhenLookedAt(this)); this.goalSelector.addGoal(2, new MeleeAttackGoal(this, 1.0, false)); this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0, 0.0F)); -@@ -100,6 +118,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -99,6 +117,7 @@ public class EnderMan extends Monster implements NeutralMob { this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); this.goalSelector.addGoal(10, new EnderMan.EndermanLeaveBlockGoal(this)); this.goalSelector.addGoal(11, new EnderMan.EndermanTakeBlockGoal(this)); @@ -3499,7 +3360,7 @@ index 87aaa6cd478d8d635b625d1a98bce23d577fb33a..6ded7dfa381d0041dffb914a85c2e835 this.targetSelector.addGoal(1, new EnderMan.EndermanLookForPlayerGoal(this, this::isAngryAt)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Endermite.class, 10, true, false, (entityliving, ignored) -> entityliving.level().purpurConfig.endermanAggroEndermites && entityliving instanceof Endermite endermite && (!entityliving.level().purpurConfig.endermanAggroEndermitesOnlyIfPlayerSpawned || endermite.isPlayerSpawned()))); // Purpur -@@ -265,7 +284,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -263,7 +282,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override protected void customServerAiStep(ServerLevel level) { @@ -3508,7 +3369,7 @@ index 87aaa6cd478d8d635b625d1a98bce23d577fb33a..6ded7dfa381d0041dffb914a85c2e835 float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue(); if (lightLevelDependentMagicValue > 0.5F && level.canSeeSky(this.blockPosition()) -@@ -378,6 +397,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -375,6 +394,7 @@ public class EnderMan extends Monster implements NeutralMob { public boolean hurtServer(ServerLevel level, DamageSource damageSource, float amount) { if (this.isInvulnerableTo(level, damageSource)) { return false; @@ -3554,49 +3415,8 @@ index 980ec0e45581812c027bb2ce8cd25d74e5f10663..844ba943a2a752f9b25506b644a4b4ab this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers()); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); } -diff --git a/net/minecraft/world/entity/monster/Evoker.java b/net/minecraft/world/entity/monster/Evoker.java -index 9fb7b3e4cbbde0f1d45d9fffb648240fbd2f3d49..70cf903d95d35b539e9a299a4035c8ddde5e4b97 100644 ---- a/net/minecraft/world/entity/monster/Evoker.java -+++ b/net/minecraft/world/entity/monster/Evoker.java -@@ -48,10 +48,28 @@ public class Evoker extends SpellcasterIllager { - this.xpReward = 10; - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.evokerRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.evokerRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.evokerControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { - super.registerGoals(); - this.goalSelector.addGoal(0, new FloatGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new Evoker.EvokerCastingSpellGoal()); - this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 0.6, 1.0)); - this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Creaking.class, 8.0F, 0.6, 1.0)); -@@ -61,6 +79,7 @@ public class Evoker extends SpellcasterIllager { - this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6)); - this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); - this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true).setUnseenMemoryTicks(300)); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false).setUnseenMemoryTicks(300)); diff --git a/net/minecraft/world/entity/monster/Ghast.java b/net/minecraft/world/entity/monster/Ghast.java -index 9954f5173c427d8c61e283d9bb2dac42c296f357..89319696240f0f58fdac19b7faff29546f0ba0de 100644 +index b8774eb91d21e9f154cc70c5d3bd26de25be41c4..451627153610f2c8db2403f73545c9af6dfd2e4b 100644 --- a/net/minecraft/world/entity/monster/Ghast.java +++ b/net/minecraft/world/entity/monster/Ghast.java @@ -53,11 +53,35 @@ public class Ghast extends Mob implements Enemy { @@ -3704,10 +3524,10 @@ index 0de6a20a3fed53bd11a0152de6953bfaecc85289..dcbe6bbce0baa4fad7fe180944beeb6c return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 100.0) diff --git a/net/minecraft/world/entity/monster/Guardian.java b/net/minecraft/world/entity/monster/Guardian.java -index cd802866af8ed2d0ebd5f8dabe170848cbf4638a..8e5990d581dec09dccb1c05c636b9b617b289aac 100644 +index 9c91fbfd39af513668bd94578810cef7e283abd9..4cf54e55de1ecc57061ad0c09e7966d6104f1cc2 100644 --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java -@@ -67,14 +67,35 @@ public class Guardian extends Monster { +@@ -65,14 +65,35 @@ public class Guardian extends Monster { this.xpReward = 10; this.setPathfindingMalus(PathType.WATER, 0.0F); this.moveControl = new Guardian.GuardianMoveControl(this); @@ -3743,7 +3563,7 @@ index cd802866af8ed2d0ebd5f8dabe170848cbf4638a..8e5990d581dec09dccb1c05c636b9b61 this.goalSelector.addGoal(4, this.guardianAttackGoal = new Guardian.GuardianAttackGoal(this)); // CraftBukkit - assign field this.goalSelector.addGoal(5, moveTowardsRestrictionGoal); this.goalSelector.addGoal(7, this.randomStrollGoal); -@@ -83,6 +104,7 @@ public class Guardian extends Monster { +@@ -81,6 +102,7 @@ public class Guardian extends Monster { this.goalSelector.addGoal(9, new RandomLookAroundGoal(this)); this.randomStrollGoal.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); moveTowardsRestrictionGoal.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); @@ -3751,16 +3571,16 @@ index cd802866af8ed2d0ebd5f8dabe170848cbf4638a..8e5990d581dec09dccb1c05c636b9b61 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new Guardian.GuardianAttackSelector(this))); } -@@ -350,7 +372,7 @@ public class Guardian extends Monster { +@@ -346,7 +368,7 @@ public class Guardian extends Monster { + @Override - public void travel(Vec3 travelVector) { - if (this.isInWater()) { -- this.moveRelative(0.1F, travelVector); -+ this.moveRelative(getRider() != null && this.isControllable() ? getSpeed() : 0.1F, travelVector); // Purpur - Ridables - this.move(MoverType.SELF, this.getDeltaMovement()); - this.setDeltaMovement(this.getDeltaMovement().scale(0.9)); - if (!this.isMoving() && this.getTarget() == null) { -@@ -458,7 +480,7 @@ public class Guardian extends Monster { + protected void travelInWater(Vec3 travelVector, double gravity, boolean isFalling, double previousY) { +- this.moveRelative(0.1F, travelVector); ++ this.moveRelative(getRider() != null && this.isControllable() ? getSpeed() : 0.1F, travelVector); // Purpur - Ridables + this.move(MoverType.SELF, this.getDeltaMovement()); + this.setDeltaMovement(this.getDeltaMovement().scale(0.9)); + if (!this.isMoving() && this.getTarget() == null) { +@@ -451,7 +473,7 @@ public class Guardian extends Monster { } } @@ -3769,7 +3589,7 @@ index cd802866af8ed2d0ebd5f8dabe170848cbf4638a..8e5990d581dec09dccb1c05c636b9b61 private final Guardian guardian; public GuardianMoveControl(Guardian mob) { -@@ -466,8 +488,17 @@ public class Guardian extends Monster { +@@ -459,8 +481,17 @@ public class Guardian extends Monster { this.guardian = mob; } @@ -3788,7 +3608,7 @@ index cd802866af8ed2d0ebd5f8dabe170848cbf4638a..8e5990d581dec09dccb1c05c636b9b61 if (this.operation == MoveControl.Operation.MOVE_TO && !this.guardian.getNavigation().isDone()) { Vec3 vec3 = new Vec3(this.wantedX - this.guardian.getX(), this.wantedY - this.guardian.getY(), this.wantedZ - this.guardian.getZ()); double len = vec3.length(); -@@ -477,7 +508,7 @@ public class Guardian extends Monster { +@@ -470,7 +501,7 @@ public class Guardian extends Monster { float f = (float)(Mth.atan2(vec3.z, vec3.x) * 180.0F / (float)Math.PI) - 90.0F; this.guardian.setYRot(this.rotlerp(this.guardian.getYRot(), f, 90.0F)); this.guardian.yBodyRot = this.guardian.getYRot(); @@ -3797,77 +3617,8 @@ index cd802866af8ed2d0ebd5f8dabe170848cbf4638a..8e5990d581dec09dccb1c05c636b9b61 float f2 = Mth.lerp(0.125F, this.guardian.getSpeed(), f1); this.guardian.setSpeed(f2); double d3 = Math.sin((this.guardian.tickCount + this.guardian.getId()) * 0.5) * 0.05; -diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java -index 296103a0dbe3ee87451a538b1aa50702a91beaa1..671796f230bec419c3c40ff89c410babd4a31628 100644 ---- a/net/minecraft/world/entity/monster/Husk.java -+++ b/net/minecraft/world/entity/monster/Husk.java -@@ -21,6 +21,23 @@ public class Husk extends Zombie { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.huskRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.huskRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.huskControllable; -+ } -+ // Purpur end - Ridables -+ - public static boolean checkHuskSpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { -diff --git a/net/minecraft/world/entity/monster/Illusioner.java b/net/minecraft/world/entity/monster/Illusioner.java -index 53e4a9b99bbaac7438e6d8380fbcd9d5ffe61fb9..162986914c6718438b7e1d5408bdbe5a4d3e3a68 100644 ---- a/net/minecraft/world/entity/monster/Illusioner.java -+++ b/net/minecraft/world/entity/monster/Illusioner.java -@@ -57,10 +57,28 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - } - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.illusionerRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.illusionerRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.illusionerControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { - super.registerGoals(); - this.goalSelector.addGoal(0, new FloatGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new SpellcasterIllager.SpellcasterCastingSpellGoal()); - this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Creaking.class, 8.0F, 1.0, 1.2)); - this.goalSelector.addGoal(4, new Illusioner.IllusionerMirrorSpellGoal()); -@@ -69,6 +87,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6)); - this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); - this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true).setUnseenMemoryTicks(300)); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false).setUnseenMemoryTicks(300)); diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java -index 2323a7315878e38710f8f31f7806ebda94077067..8b58e0a76c9651cacacb503391ef9b6a53a3ddbc 100644 +index 969736a46c85b2fcaa641c2863e6000b51611df5..a3cd6d4b999fc49893794838c73370c19c6a66b6 100644 --- a/net/minecraft/world/entity/monster/MagmaCube.java +++ b/net/minecraft/world/entity/monster/MagmaCube.java @@ -24,6 +24,28 @@ public class MagmaCube extends Slime { @@ -3902,16 +3653,16 @@ index 2323a7315878e38710f8f31f7806ebda94077067..8b58e0a76c9651cacacb503391ef9b6a @@ -76,6 +98,7 @@ public class MagmaCube extends Slime { float f = this.getSize() * 0.1F; this.setDeltaMovement(deltaMovement.x, this.getJumpPower() + f, deltaMovement.z); - this.hasImpulse = true; + this.needsSync = true; + this.actualJump = false; // Purpur - Ridables } @Override diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index 7da7dfaf400e69434417f6f85d5d021235d11162..cf297cb029ea2226f876eaec0dc0875b00abb281 100644 +index d26b7970490a2a108affee11c3fb74e38509d92b..64e55d48bc81d6237970e86e6e1cc719831902fd 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -63,6 +63,52 @@ public class Phantom extends Mob implements Enemy { +@@ -61,6 +61,52 @@ public class Phantom extends Mob implements Enemy { this.lookControl = new Phantom.PhantomLookControl(this); } @@ -3964,7 +3715,7 @@ index 7da7dfaf400e69434417f6f85d5d021235d11162..cf297cb029ea2226f876eaec0dc0875b @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; -@@ -75,9 +121,11 @@ public class Phantom extends Mob implements Enemy { +@@ -73,9 +119,11 @@ public class Phantom extends Mob implements Enemy { @Override protected void registerGoals() { @@ -3976,7 +3727,7 @@ index 7da7dfaf400e69434417f6f85d5d021235d11162..cf297cb029ea2226f876eaec0dc0875b this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -93,6 +141,7 @@ public class Phantom extends Mob implements Enemy { +@@ -91,6 +139,7 @@ public class Phantom extends Mob implements Enemy { private void updatePhantomSizeInfo() { this.refreshDimensions(); @@ -3984,15 +3735,7 @@ index 7da7dfaf400e69434417f6f85d5d021235d11162..cf297cb029ea2226f876eaec0dc0875b this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(6 + this.getPhantomSize()); } -@@ -145,6 +194,7 @@ public class Phantom extends Mob implements Enemy { - @Override - public void aiStep() { - if (this.isAlive() && this.shouldBurnInDay && this.isSunBurnTick()) { // Paper - shouldBurnInDay API -+ if (getRider() == null || !this.isControllable()) // Purpur - Ridables - this.igniteForSeconds(8.0F); - } - -@@ -163,6 +213,15 @@ public class Phantom extends Mob implements Enemy { +@@ -159,6 +208,15 @@ public class Phantom extends Mob implements Enemy { @Override public void travel(Vec3 travelVector) { this.travelFlying(travelVector, 0.2F); @@ -4008,7 +3751,7 @@ index 7da7dfaf400e69434417f6f85d5d021235d11162..cf297cb029ea2226f876eaec0dc0875b } @Override -@@ -416,25 +475,42 @@ public class Phantom extends Mob implements Enemy { +@@ -412,25 +470,42 @@ public class Phantom extends Mob implements Enemy { } } @@ -4055,51 +3798,11 @@ index 7da7dfaf400e69434417f6f85d5d021235d11162..cf297cb029ea2226f876eaec0dc0875b if (Phantom.this.horizontalCollision) { Phantom.this.setYRot(Phantom.this.getYRot() + 180.0F); this.speed = 0.1F; -diff --git a/net/minecraft/world/entity/monster/Pillager.java b/net/minecraft/world/entity/monster/Pillager.java -index e871f4b7c53894eab0d8a9593b500c7c9998ee66..f75eab4f895c0ed381b65717dc106dc13325428a 100644 ---- a/net/minecraft/world/entity/monster/Pillager.java -+++ b/net/minecraft/world/entity/monster/Pillager.java -@@ -64,16 +64,35 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.pillagerRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.pillagerRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.pillagerControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { - super.registerGoals(); - this.goalSelector.addGoal(0, new FloatGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new AvoidEntityGoal<>(this, Creaking.class, 8.0F, 1.0, 1.2)); - this.goalSelector.addGoal(2, new Raider.HoldGroundAttackGoal(this, 10.0F)); - this.goalSelector.addGoal(3, new RangedCrossbowAttackGoal<>(this, 1.0, 8.0F)); - this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6)); - this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 15.0F, 1.0F)); - this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 15.0F)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index da20eb6eaadd9468fcc96f022d67d4583371d717..34a20b3d482b98c4fca961e5fd930b283b68dc41 100644 +index ab40d05ed4c5099c57a62c5dbaa45308b2bae1c3..6fa5fc86cfb2493a8bcd0dae92be635b7c1f6fe0 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -71,15 +71,40 @@ public class Ravager extends Raider { +@@ -72,15 +72,40 @@ public class Ravager extends Raider { this.setPathfindingMalus(PathType.LEAVES, 0.0F); } @@ -4140,7 +3843,7 @@ index da20eb6eaadd9468fcc96f022d67d4583371d717..34a20b3d482b98c4fca961e5fd930b28 this.targetSelector.addGoal(2, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, true)); this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true, (entity, level) -> !entity.isBaby())); -@@ -136,7 +161,7 @@ public class Ravager extends Raider { +@@ -137,7 +162,7 @@ public class Ravager extends Raider { @Override public void aiStep() { super.aiStep(); @@ -4150,10 +3853,10 @@ index da20eb6eaadd9468fcc96f022d67d4583371d717..34a20b3d482b98c4fca961e5fd930b28 this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.0); } else { diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index d0bcd2d1f7afd4a01c9a0f7d66082df38db50edd..d9401842948fed8edd6d31fcf08da2747f1a3921 100644 +index 6e8400c4d523da8799d586c5c9019ae78710fbcb..9647741b67e1b4b7bbff0df22fc1bf3fb26afa73 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -109,12 +109,31 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -108,12 +108,31 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Shulker change color with dye @@ -4185,7 +3888,7 @@ index d0bcd2d1f7afd4a01c9a0f7d66082df38db50edd..d9401842948fed8edd6d31fcf08da274 this.targetSelector.addGoal(1, new HurtByTargetGoal(this, this.getClass()).setAlertOthers()); this.targetSelector.addGoal(2, new Shulker.ShulkerNearestAttackGoal(this)); this.targetSelector.addGoal(3, new Shulker.ShulkerDefenseAttackGoal(this)); -@@ -714,7 +733,7 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -708,7 +727,7 @@ public class Shulker extends AbstractGolem implements Enemy { } } @@ -4195,10 +3898,10 @@ index d0bcd2d1f7afd4a01c9a0f7d66082df38db50edd..d9401842948fed8edd6d31fcf08da274 super(mob); } diff --git a/net/minecraft/world/entity/monster/Silverfish.java b/net/minecraft/world/entity/monster/Silverfish.java -index 6a32d26779fa6d5ea3792c3046cc0646f678e6f4..2fb89fffb425afb0b0267fc45f8198b7b120d10c 100644 +index 93b46d52d8019aef91798b796ab2f490f886a3e9..cf305d4a0a71f91caa31757dcd8ca5be84fc3f03 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java -@@ -39,14 +39,33 @@ public class Silverfish extends Monster { +@@ -38,14 +38,33 @@ public class Silverfish extends Monster { super(type, level); } @@ -4232,39 +3935,11 @@ index 6a32d26779fa6d5ea3792c3046cc0646f678e6f4..2fb89fffb425afb0b0267fc45f8198b7 this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers()); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); } -diff --git a/net/minecraft/world/entity/monster/Skeleton.java b/net/minecraft/world/entity/monster/Skeleton.java -index fb0aa6f0713f6ab1d26711d3fce920de91deb980..d225d9cd41bdb3b6e998f3ca38394d1d3fe8b64b 100644 ---- a/net/minecraft/world/entity/monster/Skeleton.java -+++ b/net/minecraft/world/entity/monster/Skeleton.java -@@ -26,6 +26,23 @@ public class Skeleton extends AbstractSkeleton { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.skeletonRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.skeletonRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.skeletonControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java -index 7abd42fa34c80e868875f0ff3986a85d1a6dcb8c..e46fd8c9f9966dab8b27004db0bc7028e95dedf2 100644 +index e433eacd865f620a9c336a1976fd017b8053cf6a..0c56f9ae47b9263ac65fd3593911e2c8479fc157 100644 --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java -@@ -59,6 +59,7 @@ public class Slime extends Mob implements Enemy { +@@ -60,6 +60,7 @@ public class Slime extends Mob implements Enemy { public float oSquish; private boolean wasOnGround = false; private boolean canWander = true; // Paper - Slime pathfinder events @@ -4272,7 +3947,7 @@ index 7abd42fa34c80e868875f0ff3986a85d1a6dcb8c..e46fd8c9f9966dab8b27004db0bc7028 public Slime(EntityType type, Level level) { super(type, level); -@@ -66,12 +67,48 @@ public class Slime extends Mob implements Enemy { +@@ -67,12 +68,48 @@ public class Slime extends Mob implements Enemy { this.moveControl = new Slime.SlimeMoveControl(this); } @@ -4321,15 +3996,15 @@ index 7abd42fa34c80e868875f0ff3986a85d1a6dcb8c..e46fd8c9f9966dab8b27004db0bc7028 this.targetSelector .addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entity, level) -> Math.abs(entity.getY() - this.getY()) <= 4.0)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); -@@ -360,6 +397,7 @@ public class Slime extends Mob implements Enemy { +@@ -359,6 +396,7 @@ public class Slime extends Mob implements Enemy { Vec3 deltaMovement = this.getDeltaMovement(); this.setDeltaMovement(deltaMovement.x, this.getJumpPower(), deltaMovement.z); - this.hasImpulse = true; + this.needsSync = true; + this.actualJump = false; // Purpur - Ridables } - @Nullable -@@ -524,7 +562,7 @@ public class Slime extends Mob implements Enemy { + @Override +@@ -522,7 +560,7 @@ public class Slime extends Mob implements Enemy { } } @@ -4338,7 +4013,7 @@ index 7abd42fa34c80e868875f0ff3986a85d1a6dcb8c..e46fd8c9f9966dab8b27004db0bc7028 private float yRot; private int jumpDelay; private final Slime slime; -@@ -542,21 +580,33 @@ public class Slime extends Mob implements Enemy { +@@ -540,21 +578,33 @@ public class Slime extends Mob implements Enemy { } public void setWantedMovement(double speedModifier) { @@ -4375,7 +4050,7 @@ index 7abd42fa34c80e868875f0ff3986a85d1a6dcb8c..e46fd8c9f9966dab8b27004db0bc7028 if (this.jumpDelay-- <= 0) { this.jumpDelay = this.slime.getJumpDelay(); if (this.isAggressive) { -@@ -573,7 +623,7 @@ public class Slime extends Mob implements Enemy { +@@ -571,7 +621,7 @@ public class Slime extends Mob implements Enemy { this.mob.setSpeed(0.0F); } } else { @@ -4384,75 +4059,8 @@ index 7abd42fa34c80e868875f0ff3986a85d1a6dcb8c..e46fd8c9f9966dab8b27004db0bc7028 } } } -diff --git a/net/minecraft/world/entity/monster/Spider.java b/net/minecraft/world/entity/monster/Spider.java -index a0008c2c5338d442040598ee79a667060a649695..6237bbbed2aa643755e8e58a5fdd2f6d75f717ac 100644 ---- a/net/minecraft/world/entity/monster/Spider.java -+++ b/net/minecraft/world/entity/monster/Spider.java -@@ -50,15 +50,34 @@ public class Spider extends Monster { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.spiderRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.spiderRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.spiderControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(1, new FloatGoal(this)); -+ this.goalSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Armadillo.class, 6.0F, 1.0, 1.2, livingEntity -> !((Armadillo)livingEntity).isScared())); - this.goalSelector.addGoal(3, new LeapAtTargetGoal(this, 0.4F)); - this.goalSelector.addGoal(4, new Spider.SpiderAttackGoal(this)); - this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 0.8)); - this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); - this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); - this.targetSelector.addGoal(2, new Spider.SpiderTargetGoal<>(this, Player.class)); - this.targetSelector.addGoal(3, new Spider.SpiderTargetGoal<>(this, IronGolem.class)); -diff --git a/net/minecraft/world/entity/monster/Stray.java b/net/minecraft/world/entity/monster/Stray.java -index 10f1ad8b65a655fcfb2f6b9124d7d2d70f1d8e45..b1013db104186ba079a51c6c30bb7f89b92da3d7 100644 ---- a/net/minecraft/world/entity/monster/Stray.java -+++ b/net/minecraft/world/entity/monster/Stray.java -@@ -22,6 +22,23 @@ public class Stray extends AbstractSkeleton { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.strayRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.strayRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.strayControllable; -+ } -+ // Purpur end - Ridables -+ - public static boolean checkStraySpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index 312564fcaf91280d70e379994bd9d8fcb54b0a40..f03ec1e8985f2c81ad2ec13d136e4c0362be4fff 100644 +index beaffb771e6c8d4b992437997ab27be218425c5a..46121b018c5dd87d888a3724df12a9af0d007772 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -92,6 +92,23 @@ public class Strider extends Animal implements ItemSteerable { @@ -4487,7 +4095,7 @@ index 312564fcaf91280d70e379994bd9d8fcb54b0a40..f03ec1e8985f2c81ad2ec13d136e4c03 this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); this.temptGoal = new TemptGoal(this, 1.4, itemStack -> itemStack.is(ItemTags.STRIDER_TEMPT_ITEMS), false); this.goalSelector.addGoal(3, this.temptGoal); -@@ -417,7 +435,7 @@ public class Strider extends Animal implements ItemSteerable { +@@ -414,7 +432,7 @@ public class Strider extends Animal implements ItemSteerable { ItemStack itemInHand = player.getItemInHand(hand); return (InteractionResult)(this.isEquippableInSlot(itemInHand, EquipmentSlot.SADDLE) ? itemInHand.interactLivingEntity(player, this, hand) @@ -4497,10 +4105,10 @@ index 312564fcaf91280d70e379994bd9d8fcb54b0a40..f03ec1e8985f2c81ad2ec13d136e4c03 if (isFood && !this.isSilent()) { this.level() diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index a2dc0ee7044c964d424cf551c4cef3b6c9839057..99fe282067a2aa54d8fdb72c226d27cab6966b6c 100644 +index a6bfb39305732068c50ae99a28114b58b76d2cf7..d567e2b9843606c36a61c83a3a4e2d181f3eefd9 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -60,6 +60,50 @@ public class Vex extends Monster implements TraceableEntity { +@@ -58,6 +58,50 @@ public class Vex extends Monster implements TraceableEntity { this.xpReward = 3; } @@ -4551,7 +4159,7 @@ index a2dc0ee7044c964d424cf551c4cef3b6c9839057..99fe282067a2aa54d8fdb72c226d27ca @Override public boolean isFlapping() { return this.tickCount % TICKS_PER_FLAP == 0; -@@ -72,7 +116,7 @@ public class Vex extends Monster implements TraceableEntity { +@@ -70,7 +114,7 @@ public class Vex extends Monster implements TraceableEntity { @Override public void tick() { @@ -4560,7 +4168,7 @@ index a2dc0ee7044c964d424cf551c4cef3b6c9839057..99fe282067a2aa54d8fdb72c226d27ca super.tick(); this.noPhysics = false; this.setNoGravity(true); -@@ -86,17 +130,19 @@ public class Vex extends Monster implements TraceableEntity { +@@ -84,17 +128,19 @@ public class Vex extends Monster implements TraceableEntity { protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -4581,7 +4189,7 @@ index a2dc0ee7044c964d424cf551c4cef3b6c9839057..99fe282067a2aa54d8fdb72c226d27ca } @Override -@@ -298,13 +344,13 @@ public class Vex extends Monster implements TraceableEntity { +@@ -293,13 +339,13 @@ public class Vex extends Monster implements TraceableEntity { } } @@ -4597,7 +4205,7 @@ index a2dc0ee7044c964d424cf551c4cef3b6c9839057..99fe282067a2aa54d8fdb72c226d27ca if (this.operation == MoveControl.Operation.MOVE_TO) { Vec3 vec3 = new Vec3(this.wantedX - Vex.this.getX(), this.wantedY - Vex.this.getY(), this.wantedZ - Vex.this.getZ()); double len = vec3.length(); -@@ -312,7 +358,7 @@ public class Vex extends Monster implements TraceableEntity { +@@ -307,7 +353,7 @@ public class Vex extends Monster implements TraceableEntity { this.operation = MoveControl.Operation.WAIT; Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().scale(0.5)); } else { @@ -4606,47 +4214,8 @@ index a2dc0ee7044c964d424cf551c4cef3b6c9839057..99fe282067a2aa54d8fdb72c226d27ca if (Vex.this.getTarget() == null) { Vec3 deltaMovement = Vex.this.getDeltaMovement(); Vex.this.setYRot(-((float)Mth.atan2(deltaMovement.x, deltaMovement.z)) * (180.0F / (float)Math.PI)); -diff --git a/net/minecraft/world/entity/monster/Vindicator.java b/net/minecraft/world/entity/monster/Vindicator.java -index 29482ed26387e5d6f04d59deda5990d24b7a07a9..c584a404838d5f8a916a27a74b4f4e8e3d5c1b1d 100644 ---- a/net/minecraft/world/entity/monster/Vindicator.java -+++ b/net/minecraft/world/entity/monster/Vindicator.java -@@ -56,15 +56,34 @@ public class Vindicator extends AbstractIllager { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.vindicatorRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.vindicatorRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.vindicatorControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { - super.registerGoals(); - this.goalSelector.addGoal(0, new FloatGoal(this)); -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.goalSelector.addGoal(1, new AvoidEntityGoal<>(this, Creaking.class, 8.0F, 1.0, 1.2)); - this.goalSelector.addGoal(2, new Vindicator.VindicatorBreakDoorGoal(this)); - this.goalSelector.addGoal(3, new AbstractIllager.RaiderOpenDoorGoal(this)); - this.goalSelector.addGoal(4, new Raider.HoldGroundAttackGoal(this, 10.0F)); - this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1.0, false)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); - this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true)); diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java -index 70918eb0932be1c2db28025536ddd76653d63c46..8c88c5a719d15a90ba449eccf9fd568e1d2c4e8d 100644 +index 38991c0c17554c0b58980759eaeb3e9fee774420..bcb136e71db2272dc107304b52be41f83d6772b7 100644 --- a/net/minecraft/world/entity/monster/Witch.java +++ b/net/minecraft/world/entity/monster/Witch.java @@ -57,6 +57,23 @@ public class Witch extends Raider implements RangedAttackMob { @@ -4686,36 +4255,8 @@ index 70918eb0932be1c2db28025536ddd76653d63c46..8c88c5a719d15a90ba449eccf9fd568e this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class)); this.targetSelector.addGoal(2, this.healRaidersGoal); this.targetSelector.addGoal(3, this.attackPlayersGoal); -diff --git a/net/minecraft/world/entity/monster/WitherSkeleton.java b/net/minecraft/world/entity/monster/WitherSkeleton.java -index 188836285862e13a9eae6d92920b0ae7d9e33a17..7061a0ae68ed28ea72335bb5eab013a6554abc07 100644 ---- a/net/minecraft/world/entity/monster/WitherSkeleton.java -+++ b/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -34,6 +34,23 @@ public class WitherSkeleton extends AbstractSkeleton { - this.setPathfindingMalus(PathType.LAVA, 8.0F); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.witherSkeletonRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.witherSkeletonRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.witherSkeletonControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index 43c727f3cef0fe8e4c1266c50b9b0389c6747d52..cab7d33f40eacdb0ba8a7058699eb2548e364524 100644 +index 201ccf4f20bd9e48ed8c1d59d70f843c74e5287f..c4f009357e416ed4052e058d8bf3b8c3e9dfd4ae 100644 --- a/net/minecraft/world/entity/monster/Zoglin.java +++ b/net/minecraft/world/entity/monster/Zoglin.java @@ -87,6 +87,23 @@ public class Zoglin extends Monster implements HoglinBase { @@ -4742,7 +4283,7 @@ index 43c727f3cef0fe8e4c1266c50b9b0389c6747d52..cab7d33f40eacdb0ba8a7058699eb254 @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -252,6 +269,7 @@ public class Zoglin extends Monster implements HoglinBase { +@@ -251,6 +268,7 @@ public class Zoglin extends Monster implements HoglinBase { protected void customServerAiStep(ServerLevel level) { ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("zoglinBrain"); @@ -4750,99 +4291,8 @@ index 43c727f3cef0fe8e4c1266c50b9b0389c6747d52..cab7d33f40eacdb0ba8a7058699eb254 this.getBrain().tick(level, this); profilerFiller.pop(); this.updateActivity(); -diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index 81e9e2d87e8ea4645ee95559a08c765c1d96a65a..a2ee621ba8b242a4e4e68c3a0a1d8e63c1421c3f 100644 ---- a/net/minecraft/world/entity/monster/Zombie.java -+++ b/net/minecraft/world/entity/monster/Zombie.java -@@ -103,11 +103,30 @@ public class Zombie extends Monster { - this(EntityType.ZOMBIE, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.zombieRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombieRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.zombieControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void registerGoals() { -+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - if (this.level().paperConfig().entities.behavior.zombiesTargetTurtleEggs) this.goalSelector.addGoal(4, new Zombie.ZombieAttackTurtleEggGoal(this, 1.0, 3)); // Paper - Add zombie targets turtle egg config - this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F)); - this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); -+ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables - this.addBehaviourGoals(); - } - -diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index e9cf8809fffaba98e352c6d47719a816aad4cce4..f460df654393c0bd2e27b9fd96786d2e3fa5669e 100644 ---- a/net/minecraft/world/entity/monster/ZombieVillager.java -+++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -75,6 +75,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - super(type, level); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.zombieVillagerRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombieVillagerRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.zombieVillagerControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 08997d05ff75f68cd36c90eb8730dc44a052d5b8..d4f036c7d4b6652c5585f1ce5af9b26f9ed5b856 100644 ---- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java -+++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -64,6 +64,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - this.setPathfindingMalus(PathType.LAVA, 8.0F); - } - -+ // Purpur start - Ridables -+ @Override -+ public boolean isRidable() { -+ return level().purpurConfig.zombifiedPiglinRidable; -+ } -+ -+ @Override -+ public boolean dismountsUnderwater() { -+ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombifiedPiglinRidableInWater; -+ } -+ -+ @Override -+ public boolean isControllable() { -+ return level().purpurConfig.zombifiedPiglinControllable; -+ } -+ // Purpur end - Ridables -+ - @Override - public void setPersistentAngerTarget(@Nullable UUID target) { - this.persistentAngerTarget = target; diff --git a/net/minecraft/world/entity/monster/breeze/Breeze.java b/net/minecraft/world/entity/monster/breeze/Breeze.java -index f02e5f09416dea33a170c43347aac7a6664c663f..405eb5f041bf3a611f8111fd58864ffec30ab0c0 100644 +index d0019ebf0469f4070d323d03dbe54375b8d2ce73..6f22312d0a5ab38be4a07b93fdb29b7f36f67c71 100644 --- a/net/minecraft/world/entity/monster/breeze/Breeze.java +++ b/net/minecraft/world/entity/monster/breeze/Breeze.java @@ -236,6 +236,7 @@ public class Breeze extends Monster { @@ -4854,7 +4304,7 @@ index f02e5f09416dea33a170c43347aac7a6664c663f..405eb5f041bf3a611f8111fd58864ffe profilerFiller.popPush("breezeActivityUpdate"); BreezeAi.updateActivity(this); diff --git a/net/minecraft/world/entity/monster/creaking/Creaking.java b/net/minecraft/world/entity/monster/creaking/Creaking.java -index 591eb14eec427d6f92c0bf4eb083d05df811449d..86379fce8045722584736f1b39707f3d9a1fc4f4 100644 +index 6775e62ae5b133bc44d730924b4821e0c0b8497c..01d3d638e194ec5e812eea0ab96b100f4752ea18 100644 --- a/net/minecraft/world/entity/monster/creaking/Creaking.java +++ b/net/minecraft/world/entity/monster/creaking/Creaking.java @@ -103,6 +103,29 @@ public class Creaking extends Monster { @@ -4887,7 +4337,7 @@ index 591eb14eec427d6f92c0bf4eb083d05df811449d..86379fce8045722584736f1b39707f3d @Override protected BodyRotationControl createBodyControl() { return new Creaking.CreakingBodyRotationControl(this); -@@ -566,28 +589,28 @@ public class Creaking extends Monster { +@@ -547,28 +570,28 @@ public class Creaking extends Monster { } } @@ -4923,10 +4373,10 @@ index 591eb14eec427d6f92c0bf4eb083d05df811449d..86379fce8045722584736f1b39707f3d } } diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 56a1e933b4b135890bec5104ef9f3cdf21ac2ff6..9f4ef9292e89565c3de0d96bcc3c4c48d3c53dff 100644 +index d1749ac82cdbd73422e6229e98eb034978f50fc2..c84f009cb0498e9c1898e310f19cff80ec6989ea 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -96,6 +96,23 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -97,6 +97,23 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { this.xpReward = 5; } @@ -4950,7 +4400,7 @@ index 56a1e933b4b135890bec5104ef9f3cdf21ac2ff6..9f4ef9292e89565c3de0d96bcc3c4c48 @VisibleForTesting public void setTimeInOverworld(int timeInOverworld) { this.timeInOverworld = timeInOverworld; -@@ -164,6 +181,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -165,6 +182,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { protected void customServerAiStep(ServerLevel level) { ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("hoglinBrain"); @@ -4958,11 +4408,172 @@ index 56a1e933b4b135890bec5104ef9f3cdf21ac2ff6..9f4ef9292e89565c3de0d96bcc3c4c48 this.getBrain().tick(level, this); profilerFiller.pop(); HoglinAi.updateActivity(this); +diff --git a/net/minecraft/world/entity/monster/illager/Evoker.java b/net/minecraft/world/entity/monster/illager/Evoker.java +index f291887c07fee2ad8d00bc79822e709777dc3fc3..e40434d24c7a9ffe76c3410601942d0c8a963e30 100644 +--- a/net/minecraft/world/entity/monster/illager/Evoker.java ++++ b/net/minecraft/world/entity/monster/illager/Evoker.java +@@ -49,10 +49,28 @@ public class Evoker extends SpellcasterIllager { + this.xpReward = 10; + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.evokerRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.evokerRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.evokerControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(0, new FloatGoal(this)); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new Evoker.EvokerCastingSpellGoal()); + this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Player.class, 8.0F, 0.6, 1.0)); + this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Creaking.class, 8.0F, 0.6, 1.0)); +@@ -62,6 +80,7 @@ public class Evoker extends SpellcasterIllager { + this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6)); + this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); + this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true).setUnseenMemoryTicks(300)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false).setUnseenMemoryTicks(300)); +diff --git a/net/minecraft/world/entity/monster/illager/Illusioner.java b/net/minecraft/world/entity/monster/illager/Illusioner.java +index 1f80b1732ae809ce9ea26b0e8ddd507d0a96dbef..8a80c202752f56ba174c00531993795a4e621910 100644 +--- a/net/minecraft/world/entity/monster/illager/Illusioner.java ++++ b/net/minecraft/world/entity/monster/illager/Illusioner.java +@@ -59,10 +59,28 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { + } + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.illusionerRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.illusionerRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.illusionerControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(0, new FloatGoal(this)); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new SpellcasterIllager.SpellcasterCastingSpellGoal()); + this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Creaking.class, 8.0F, 1.0, 1.2)); + this.goalSelector.addGoal(4, new Illusioner.IllusionerMirrorSpellGoal()); +@@ -71,6 +89,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { + this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6)); + this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); + this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true).setUnseenMemoryTicks(300)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false).setUnseenMemoryTicks(300)); +diff --git a/net/minecraft/world/entity/monster/illager/Pillager.java b/net/minecraft/world/entity/monster/illager/Pillager.java +index e9207ed52cdf28bffcc6e6d9fc550285e1ee6294..0b97c4fe89c8549841cbb79ecb9383a9be7a44af 100644 +--- a/net/minecraft/world/entity/monster/illager/Pillager.java ++++ b/net/minecraft/world/entity/monster/illager/Pillager.java +@@ -65,16 +65,35 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.pillagerRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.pillagerRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.pillagerControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(0, new FloatGoal(this)); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new AvoidEntityGoal<>(this, Creaking.class, 8.0F, 1.0, 1.2)); + this.goalSelector.addGoal(2, new Raider.HoldGroundAttackGoal(this, 10.0F)); + this.goalSelector.addGoal(3, new RangedCrossbowAttackGoal<>(this, 1.0, 8.0F)); + this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6)); + this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 15.0F, 1.0F)); + this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 15.0F)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false)); +diff --git a/net/minecraft/world/entity/monster/illager/Vindicator.java b/net/minecraft/world/entity/monster/illager/Vindicator.java +index 0cdc52cf3b1bb9c00e6ca8c8e564de60e195d6fc..4162e7ee482829f0c5276a31d44ed4c5ee24c3cf 100644 +--- a/net/minecraft/world/entity/monster/illager/Vindicator.java ++++ b/net/minecraft/world/entity/monster/illager/Vindicator.java +@@ -57,15 +57,34 @@ public class Vindicator extends AbstractIllager { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.vindicatorRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.vindicatorRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.vindicatorControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void registerGoals() { + super.registerGoals(); + this.goalSelector.addGoal(0, new FloatGoal(this)); ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(1, new AvoidEntityGoal<>(this, Creaking.class, 8.0F, 1.0, 1.2)); + this.goalSelector.addGoal(2, new Vindicator.VindicatorBreakDoorGoal(this)); + this.goalSelector.addGoal(3, new AbstractIllager.RaiderOpenDoorGoal(this)); + this.goalSelector.addGoal(4, new Raider.HoldGroundAttackGoal(this, 10.0F)); + this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1.0, false)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new HurtByTargetGoal(this, Raider.class).setAlertOthers()); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true)); diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index 072358efcc92f510d5281b7f37f8c36df85c2e4c..a74268846a160aa2e2e8688b1562216c2e248726 100644 +index fb2ff2b9712f95429bde04d35baddc2da3e3fb52..a42b84611836b970d0d7ddb602bd04d9ec850712 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -136,6 +136,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -141,6 +141,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento this.xpReward = 5; } @@ -4986,7 +4597,7 @@ index 072358efcc92f510d5281b7f37f8c36df85c2e4c..a74268846a160aa2e2e8688b1562216c @Override protected void addAdditionalSaveData(ValueOutput output) { super.addAdditionalSaveData(output); -@@ -315,6 +332,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -319,6 +336,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento protected void customServerAiStep(ServerLevel level) { ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("piglinBrain"); @@ -4995,7 +4606,7 @@ index 072358efcc92f510d5281b7f37f8c36df85c2e4c..a74268846a160aa2e2e8688b1562216c profilerFiller.pop(); PiglinAi.updateActivity(this); diff --git a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index b692d989d71dc2d9ff9fe0d998b2524020d12c63..e1b1a909c7e92c5fa5e8f9c155bc57290ef6667b 100644 +index d33c4d32c99b0b4553ce89746b443820f586ce73..e33809e9ccc4a65909f1c12ec4b0fdc4050aeee7 100644 --- a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java @@ -65,6 +65,23 @@ public class PiglinBrute extends AbstractPiglin { @@ -5022,7 +4633,7 @@ index b692d989d71dc2d9ff9fe0d998b2524020d12c63..e1b1a909c7e92c5fa5e8f9c155bc5729 public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) -@@ -117,6 +134,7 @@ public class PiglinBrute extends AbstractPiglin { +@@ -116,6 +133,7 @@ public class PiglinBrute extends AbstractPiglin { protected void customServerAiStep(ServerLevel level) { ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("piglinBruteBrain"); @@ -5030,8 +4641,206 @@ index b692d989d71dc2d9ff9fe0d998b2524020d12c63..e1b1a909c7e92c5fa5e8f9c155bc5729 this.getBrain().tick(level, this); profilerFiller.pop(); PiglinBruteAi.updateActivity(this); +diff --git a/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java b/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java +index 1ba7777164c7fd8516c97e1bd964183df37c029f..1ab860be69bcc1ab5cc07418c2d7e733afdc482b 100644 +--- a/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java ++++ b/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java +@@ -75,12 +75,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo + + @Override + protected void registerGoals() { ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(2, new RestrictSunGoal(this)); + this.goalSelector.addGoal(3, new FleeSunGoal(this, 1.0)); + this.goalSelector.addGoal(3, new AvoidEntityGoal<>(this, Wolf.class, 6.0F, 1.0, 1.2)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); +diff --git a/net/minecraft/world/entity/monster/skeleton/Bogged.java b/net/minecraft/world/entity/monster/skeleton/Bogged.java +index c54ad2d6a271d70cc9eeb284f13e5d143f81a084..10e66643a918184d858a4e6c9de7a6c2664fbcaf 100644 +--- a/net/minecraft/world/entity/monster/skeleton/Bogged.java ++++ b/net/minecraft/world/entity/monster/skeleton/Bogged.java +@@ -41,6 +41,23 @@ public class Bogged extends AbstractSkeleton implements Shearable { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.boggedRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.boggedRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.boggedControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java +index d995572427844540a98d76b2926eb15a018230fa..7f8298892565b073373ad68f9c1399a9c565c29a 100644 +--- a/net/minecraft/world/entity/monster/skeleton/Skeleton.java ++++ b/net/minecraft/world/entity/monster/skeleton/Skeleton.java +@@ -26,6 +26,23 @@ public class Skeleton extends AbstractSkeleton { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.skeletonRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.skeletonRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.skeletonControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java +index 24ae7263b2661899e7824ab5877f9b1c9f04d80f..23ceecffe8f1b758433e02b61cae421c518cc841 100644 +--- a/net/minecraft/world/entity/monster/skeleton/Stray.java ++++ b/net/minecraft/world/entity/monster/skeleton/Stray.java +@@ -23,6 +23,23 @@ public class Stray extends AbstractSkeleton { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.strayRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.strayRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.strayControllable; ++ } ++ // Purpur end - Ridables ++ + public static boolean checkStraySpawnRules( + EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { +diff --git a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java +index 79326303fc1adf5a35343847a2401d193368b64f..d49200718e7fab29ce5e55278b7584458bfb10e7 100644 +--- a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java ++++ b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java +@@ -34,6 +34,23 @@ public class WitherSkeleton extends AbstractSkeleton { + this.setPathfindingMalus(PathType.LAVA, 8.0F); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.witherSkeletonRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.witherSkeletonRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.witherSkeletonControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void registerGoals() { + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); +diff --git a/net/minecraft/world/entity/monster/spider/CaveSpider.java b/net/minecraft/world/entity/monster/spider/CaveSpider.java +index 6a1714d093fc35e6ca840b769723f7bffaea7ba6..17a9b046ccd8de37aa79501f7556a5a816dfa90f 100644 +--- a/net/minecraft/world/entity/monster/spider/CaveSpider.java ++++ b/net/minecraft/world/entity/monster/spider/CaveSpider.java +@@ -26,6 +26,23 @@ public class CaveSpider extends Spider { + return Spider.createAttributes().add(Attributes.MAX_HEALTH, 12.0); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.caveSpiderRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.caveSpiderRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.caveSpiderControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + public boolean doHurtTarget(ServerLevel level, Entity target) { + if (super.doHurtTarget(level, target)) { +diff --git a/net/minecraft/world/entity/monster/spider/Spider.java b/net/minecraft/world/entity/monster/spider/Spider.java +index 64a84f73d48deb254345a5c25f3fe650591e64a1..7a8b9c83490a05629e4996844a575ba4c7e9f156 100644 +--- a/net/minecraft/world/entity/monster/spider/Spider.java ++++ b/net/minecraft/world/entity/monster/spider/Spider.java +@@ -52,15 +52,34 @@ public class Spider extends Monster { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.spiderRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.spiderRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.spiderControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); ++ this.goalSelector.addGoal(1, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.goalSelector.addGoal(2, new AvoidEntityGoal<>(this, Armadillo.class, 6.0F, 1.0, 1.2, livingEntity -> !((Armadillo)livingEntity).isScared())); + this.goalSelector.addGoal(3, new LeapAtTargetGoal(this, 0.4F)); + this.goalSelector.addGoal(4, new Spider.SpiderAttackGoal(this)); + this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 0.8)); + this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(6, new RandomLookAroundGoal(this)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); + this.targetSelector.addGoal(2, new Spider.SpiderTargetGoal<>(this, Player.class)); + this.targetSelector.addGoal(3, new Spider.SpiderTargetGoal<>(this, IronGolem.class)); diff --git a/net/minecraft/world/entity/monster/warden/Warden.java b/net/minecraft/world/entity/monster/warden/Warden.java -index 2383f3fbe06f6b9a663798deb75ee75eacacf788..dede88234fd2b0f55863021446c4c9273f3a14d8 100644 +index 3b931c6105ea14add0d2a60dc19cc3601a092a3b..4f4bf16cfa1390f19a7e8745d86e42e24ffb3bbc 100644 --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java @@ -124,8 +124,32 @@ public class Warden extends Monster implements VibrationSystem { @@ -5067,7 +4876,7 @@ index 2383f3fbe06f6b9a663798deb75ee75eacacf788..dede88234fd2b0f55863021446c4c927 @Override public Packet getAddEntityPacket(ServerEntity entity) { return new ClientboundAddEntityPacket(this, entity, this.hasPose(Pose.EMERGING) ? 1 : 0); -@@ -281,6 +305,7 @@ public class Warden extends Monster implements VibrationSystem { +@@ -280,6 +304,7 @@ public class Warden extends Monster implements VibrationSystem { protected void customServerAiStep(ServerLevel level) { ProfilerFiller profilerFiller = Profiler.get(); profilerFiller.push("wardenBrain"); @@ -5075,7 +4884,7 @@ index 2383f3fbe06f6b9a663798deb75ee75eacacf788..dede88234fd2b0f55863021446c4c927 this.getBrain().tick(level, this); profilerFiller.pop(); super.customServerAiStep(level); -@@ -383,6 +408,7 @@ public class Warden extends Monster implements VibrationSystem { +@@ -382,6 +407,7 @@ public class Warden extends Monster implements VibrationSystem { @Contract("null->false") public boolean canTargetEntity(@Nullable Entity entity) { @@ -5083,10 +4892,193 @@ index 2383f3fbe06f6b9a663798deb75ee75eacacf788..dede88234fd2b0f55863021446c4c927 return entity instanceof LivingEntity livingEntity && this.level() == entity.level() && EntitySelector.NO_CREATIVE_OR_SPECTATOR.test(entity) -diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index be8200024a766d338705ece9a7fe0cced53a299a..7f9bd5695c960e88b9f59af4b67849db9c4ba10b 100644 ---- a/net/minecraft/world/entity/npc/Villager.java -+++ b/net/minecraft/world/entity/npc/Villager.java +diff --git a/net/minecraft/world/entity/monster/zombie/Drowned.java b/net/minecraft/world/entity/monster/zombie/Drowned.java +index b189d8aaea16d977aef05a443b82eeabdb51715d..2c637796399a9b33e03e6e99618a28bf55f36110 100644 +--- a/net/minecraft/world/entity/monster/zombie/Drowned.java ++++ b/net/minecraft/world/entity/monster/zombie/Drowned.java +@@ -74,6 +74,23 @@ public class Drowned extends Zombie implements RangedAttackMob { + return Zombie.createAttributes().add(Attributes.STEP_HEIGHT, 1.0); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.drownedRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.drownedRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.drownedControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected PathNavigation createNavigation(Level level) { + return new AmphibiousPathNavigation(this, level); +@@ -429,7 +446,7 @@ public class Drowned extends Zombie implements RangedAttackMob { + } + } + +- static class DrownedMoveControl extends MoveControl { ++ static class DrownedMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables + private final Drowned drowned; + + public DrownedMoveControl(Drowned mob) { +@@ -438,7 +455,7 @@ public class Drowned extends Zombie implements RangedAttackMob { + } + + @Override +- public void tick() { ++ public void vanillaTick() { // Purpur - Ridables + LivingEntity target = this.drowned.getTarget(); + if (this.drowned.wantsToSwim() && this.drowned.isInWater()) { + if (target != null && target.getY() > this.drowned.getY() || this.drowned.searchingForLand) { +@@ -458,7 +475,7 @@ public class Drowned extends Zombie implements RangedAttackMob { + float f = (float)(Mth.atan2(d2, d) * 180.0F / (float)Math.PI) - 90.0F; + this.drowned.setYRot(this.rotlerp(this.drowned.getYRot(), f, 90.0F)); + this.drowned.yBodyRot = this.drowned.getYRot(); +- float f1 = (float)(this.speedModifier * this.drowned.getAttributeValue(Attributes.MOVEMENT_SPEED)); ++ float f1 = (float)(this.getSpeedModifier() * this.drowned.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables + float f2 = Mth.lerp(0.125F, this.drowned.getSpeed(), f1); + this.drowned.setSpeed(f2); + this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(f2 * d * 0.005, f2 * d1 * 0.1, f2 * d2 * 0.005)); +@@ -467,7 +484,7 @@ public class Drowned extends Zombie implements RangedAttackMob { + this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(0.0, -0.008, 0.0)); + } + +- super.tick(); ++ super.vanillaTick(); // Purpur - Ridables + } + } + } +diff --git a/net/minecraft/world/entity/monster/zombie/Husk.java b/net/minecraft/world/entity/monster/zombie/Husk.java +index f36d92f0f62354be5f4e39e768aabb1369cfe18c..f18ac33d31ae23db02654658840b89ba03736bf3 100644 +--- a/net/minecraft/world/entity/monster/zombie/Husk.java ++++ b/net/minecraft/world/entity/monster/zombie/Husk.java +@@ -29,6 +29,23 @@ public class Husk extends Zombie { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.huskRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.huskRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.huskControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + public boolean isSunSensitive() { + return false; +diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java +index c86fb77485a038b600877432c828dc7940cf26f4..b2d322bee9343079c0c21cc7b47493df9cfd861e 100644 +--- a/net/minecraft/world/entity/monster/zombie/Zombie.java ++++ b/net/minecraft/world/entity/monster/zombie/Zombie.java +@@ -103,11 +103,30 @@ public class Zombie extends Monster { + this(EntityType.ZOMBIE, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.zombieRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombieRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.zombieControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void registerGoals() { ++ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + if (this.level().paperConfig().entities.behavior.zombiesTargetTurtleEggs) this.goalSelector.addGoal(4, new Zombie.ZombieAttackTurtleEggGoal(this, 1.0, 3)); // Paper - Add zombie targets turtle egg config + this.goalSelector.addGoal(8, new LookAtPlayerGoal(this, Player.class, 8.0F)); + this.goalSelector.addGoal(8, new RandomLookAroundGoal(this)); ++ this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables + this.addBehaviourGoals(); + } + +diff --git a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +index ffcf14288d40b9bbff7f1d1d4c2e19a88e248365..65fa64cc24b6968c6f09a78d5f00750587bf9ef0 100644 +--- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java ++++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +@@ -72,6 +72,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { + super(type, level); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.zombieVillagerRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombieVillagerRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.zombieVillagerControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +index ef6a4aff03c1a85535b15e653714751e79f61090..e2c5301a465e28cea057f9afec7e9d78090e1c9e 100644 +--- a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java ++++ b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +@@ -64,6 +64,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + this.setPathfindingMalus(PathType.LAVA, 8.0F); + } + ++ // Purpur start - Ridables ++ @Override ++ public boolean isRidable() { ++ return level().purpurConfig.zombifiedPiglinRidable; ++ } ++ ++ @Override ++ public boolean dismountsUnderwater() { ++ return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.zombifiedPiglinRidableInWater; ++ } ++ ++ @Override ++ public boolean isControllable() { ++ return level().purpurConfig.zombifiedPiglinControllable; ++ } ++ // Purpur end - Ridables ++ + @Override + protected void addBehaviourGoals() { + this.goalSelector.addGoal(1, new SpearUseGoal<>(this, 1.0, 1.0, 10.0F, 2.0F)); +diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java +index 9d28818f885c9fb6cbd78073c779e46ab8a5abe2..4b4acd05ab94d5beadd20989b39b267ecb56ad8b 100644 +--- a/net/minecraft/world/entity/npc/villager/Villager.java ++++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -250,6 +250,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } // Purpur end - Lobotomize stuck villagers @@ -5147,11 +5139,11 @@ index be8200024a766d338705ece9a7fe0cced53a299a..7f9bd5695c960e88b9f59af4b67849db if (this.level().purpurConfig.villagerAllowTrading) // Purpur - Add config for villager trading this.startTrading(player); } -diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java -index 4032215d5907b926d1a8e08a8b0852c1388b51c5..5372f9cef4667a11b4e4447b1bacd7c232b6b0ad 100644 ---- a/net/minecraft/world/entity/npc/WanderingTrader.java -+++ b/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -67,6 +67,23 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +index aceeb9919473f5ff1b84efe950d10aa4dbc10121..5c7da654ef967356173a9d85a8675a7dc61ef395 100644 +--- a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java ++++ b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +@@ -68,6 +68,23 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over } // Purpur end - Allow leashing villagers @@ -5187,10 +5179,10 @@ index 4032215d5907b926d1a8e08a8b0852c1388b51c5..5372f9cef4667a11b4e4447b1bacd7c2 if (this.level().purpurConfig.wanderingTraderAllowTrading) { // Purpur - Add config for villager trading this.setTradingPlayer(player); diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 45fe132e78147bb33d986d8098b6b12567b5398a..f279a628d6627080743d9f4c49ff8bfd13494fed 100644 +index 15ff99dba0214721e781751731ea7f68482706cf..4bf98783e7199bc5c7c05c953729523b0b75b2b5 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -201,6 +201,19 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -199,6 +199,19 @@ public abstract class Player extends Avatar implements ContainerUser { } // CraftBukkit end @@ -5211,7 +5203,7 @@ index 45fe132e78147bb33d986d8098b6b12567b5398a..f279a628d6627080743d9f4c49ff8bfd super(EntityType.PLAYER, level); this.setUUID(gameProfile.id()); diff --git a/net/minecraft/world/entity/projectile/LlamaSpit.java b/net/minecraft/world/entity/projectile/LlamaSpit.java -index 68322dec4f658c40437bfd43f78b045e0df36e8b..47fa648f7a3a081be1b1d44c1e75e066a18c896b 100644 +index b8e3616de5f07e49a8bbab314329157e4268fb1e..56d78249c3fd7da0ff963712fe3a5c722b907c09 100644 --- a/net/minecraft/world/entity/projectile/LlamaSpit.java +++ b/net/minecraft/world/entity/projectile/LlamaSpit.java @@ -33,6 +33,12 @@ public class LlamaSpit extends Projectile { @@ -5227,10 +5219,10 @@ index 68322dec4f658c40437bfd43f78b045e0df36e8b..47fa648f7a3a081be1b1d44c1e75e066 @Override protected double getDefaultGravity() { return 0.06; -diff --git a/net/minecraft/world/entity/projectile/WitherSkull.java b/net/minecraft/world/entity/projectile/WitherSkull.java -index 6787a48f8e06e95caa83e0aa7a6695cedfd6aca4..c21cb4dfbe75fa9ac8dbc9d6dbc3f10d1cabe9b5 100644 ---- a/net/minecraft/world/entity/projectile/WitherSkull.java -+++ b/net/minecraft/world/entity/projectile/WitherSkull.java +diff --git a/net/minecraft/world/entity/projectile/hurtingprojectile/WitherSkull.java b/net/minecraft/world/entity/projectile/hurtingprojectile/WitherSkull.java +index 1020e835f24bc25e032335f739d526bc0bd4ecc4..fced6e9df3239ffff9f297706c764cb9675c0ebb 100644 +--- a/net/minecraft/world/entity/projectile/hurtingprojectile/WitherSkull.java ++++ b/net/minecraft/world/entity/projectile/hurtingprojectile/WitherSkull.java @@ -110,6 +110,14 @@ public class WitherSkull extends AbstractHurtingProjectile { } // Purpur end - Add canSaveToDisk to Entity diff --git a/purpur-server/minecraft-patches/unapplied-features/0002-Configurable-entity-base-attributes.patch b/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch similarity index 74% rename from purpur-server/minecraft-patches/unapplied-features/0002-Configurable-entity-base-attributes.patch rename to purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch index 9d2a66e29..9e41ad901 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0002-Configurable-entity-base-attributes.patch +++ b/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch @@ -4,29 +4,11 @@ Date: Thu, 10 Dec 2020 16:44:54 -0600 Subject: [PATCH] Configurable entity base attributes -diff --git a/net/minecraft/world/entity/GlowSquid.java b/net/minecraft/world/entity/GlowSquid.java -index 8a10da9409e19b03b559d14c6f5238b5393545c7..cbb7e0591dc761d0566ac99dc6e5697b3ba4eeda 100644 ---- a/net/minecraft/world/entity/GlowSquid.java -+++ b/net/minecraft/world/entity/GlowSquid.java -@@ -47,6 +47,13 @@ public class GlowSquid extends Squid { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.glowSquidMaxHealth); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected ParticleOptions getInkParticle() { - return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 28a6316996fe44228539bd54b019ef40f016f967..aeaf62b438fccc628ae3e8316d7965cdbea75731 100644 +index 63e847182bb030322e1e4b17b5f886ef58d975bb..a2879705bf847dfc1453206746377895beac5b4b 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -292,6 +292,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -295,6 +295,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin protected LivingEntity(EntityType type, Level level) { super(type, level); this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type), this); // Purpur - Ridables @@ -44,10 +26,10 @@ index 28a6316996fe44228539bd54b019ef40f016f967..aeaf62b438fccc628ae3e8316d7965cd return this.brain; } diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index 0720d331eaae7c9f12d654cef278ffcf7510597b..4624aca3dc3054ce7558023033fc953aedd33d88 100644 +index 2cfcf1f7473d8612777ca0752f6d1521c231ef42..a09b5035e91d50e12f613a7a1211c6869fbbf4df 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java -@@ -97,6 +97,21 @@ public class Bat extends AmbientCreature { +@@ -94,6 +94,21 @@ public class Bat extends AmbientCreature { } // Purpur end - Ridables @@ -69,452 +51,11 @@ index 0720d331eaae7c9f12d654cef278ffcf7510597b..4624aca3dc3054ce7558023033fc953a @Override public boolean isFlapping() { return !this.isResting() && this.tickCount % 10.0F == 0.0F; -diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index 345f10125d80ead9341d285ed8d3faa3013e5b40..b8dda3956152af17ce731d337ceb157d94bfb07b 100644 ---- a/net/minecraft/world/entity/animal/Bee.java -+++ b/net/minecraft/world/entity/animal/Bee.java -@@ -474,6 +474,14 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - return beehiveBlockEntity != null && beehiveBlockEntity.isFireNearby(); - } - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.beeMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.beeScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - public int getRemainingPersistentAngerTime() { - return this.entityData.get(DATA_REMAINING_ANGER_TIME); -diff --git a/net/minecraft/world/entity/animal/Cat.java b/net/minecraft/world/entity/animal/Cat.java -index dc207012d233de1fa056bb318e3e143496743ebb..7550a645d7814bc97243088e2d0f366adb081c76 100644 ---- a/net/minecraft/world/entity/animal/Cat.java -+++ b/net/minecraft/world/entity/animal/Cat.java -@@ -118,6 +118,14 @@ public class Cat extends TamableAnimal { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.catMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.catScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); -diff --git a/net/minecraft/world/entity/animal/Chicken.java b/net/minecraft/world/entity/animal/Chicken.java -index bb261f049e28dd5fec00d92a844a1eaa4e8e0ca3..123527a051ec53f5cec886948bbb4da289d00270 100644 ---- a/net/minecraft/world/entity/animal/Chicken.java -+++ b/net/minecraft/world/entity/animal/Chicken.java -@@ -89,6 +89,14 @@ public class Chicken extends Animal { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.chickenMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.chickenScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/Cod.java b/net/minecraft/world/entity/animal/Cod.java -index 4bbe60e47cd3710c2dd31a418de38b894eb8247d..9b9a237a20d8e39ac11a39a4d5782084f97ea674 100644 ---- a/net/minecraft/world/entity/animal/Cod.java -+++ b/net/minecraft/world/entity/animal/Cod.java -@@ -25,6 +25,13 @@ public class Cod extends AbstractSchoolingFish { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.codMaxHealth); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - public ItemStack getBucketItemStack() { - return new ItemStack(Items.COD_BUCKET); -diff --git a/net/minecraft/world/entity/animal/Cow.java b/net/minecraft/world/entity/animal/Cow.java -index 380c8e3c9c790d626cd9f8d4b1f13838d0b756ec..e7100834ce813e9814139c6d6e957fce15861ab7 100644 ---- a/net/minecraft/world/entity/animal/Cow.java -+++ b/net/minecraft/world/entity/animal/Cow.java -@@ -46,6 +46,14 @@ public class Cow extends AbstractCow { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.cowMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.cowScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/Dolphin.java b/net/minecraft/world/entity/animal/Dolphin.java -index 703bb05c293b3ae13745c014cbd5f12864dec003..caf0f3c0690344fafb9a52a55f81b25ea6aa91a9 100644 ---- a/net/minecraft/world/entity/animal/Dolphin.java -+++ b/net/minecraft/world/entity/animal/Dolphin.java -@@ -152,6 +152,14 @@ public class Dolphin extends AgeableWaterCreature { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.dolphinMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.dolphinScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Nullable - @Override - public SpawnGroupData finalizeSpawn( -diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java -index 1da6563a3a1d85e562b85435bb27cd82bbc05faf..375ce5de2c041a7e61578c233ca0dc2ef3a588ca 100644 ---- a/net/minecraft/world/entity/animal/Fox.java -+++ b/net/minecraft/world/entity/animal/Fox.java -@@ -182,6 +182,14 @@ public class Fox extends Animal { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.foxMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.foxScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java -index eb14c2c508efd927d4696ac4e7cd420104ccc192..c5a126718c93d01376b73eb1337cfa63d9acd99e 100644 ---- a/net/minecraft/world/entity/animal/HappyGhast.java -+++ b/net/minecraft/world/entity/animal/HappyGhast.java -@@ -132,6 +132,19 @@ public class HappyGhast extends Animal { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.happyGhastMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.happyGhastScale); -+ this.getAttribute(Attributes.TEMPT_RANGE).setBaseValue(this.level().purpurConfig.happyGhastTemptRange); -+ this.getAttribute(Attributes.FLYING_SPEED).setBaseValue(this.level().purpurConfig.happyGhastFlyingSpeed); -+ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.happyGhastMovementSpeed); -+ this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level().purpurConfig.happyGhastFollowRange); -+ this.getAttribute(Attributes.CAMERA_DISTANCE).setBaseValue(this.level().purpurConfig.happyGhastCameraDistance); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void ageBoundaryReached() { - if (this.isBaby()) { -@@ -155,7 +168,7 @@ public class HappyGhast extends Animal { - - @Override - protected float sanitizeScale(float scale) { -- return Math.min(scale, 1.0F); -+ return Math.min(scale, 1.0F); // Purpur - Configurable entity base attributes - } - - @Override -diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java -index 250c5b75b9e0d49eb8834ca9e7bbb5f8c029acb2..a8ae43ab84d746e8f046b52410602607e759761e 100644 ---- a/net/minecraft/world/entity/animal/IronGolem.java -+++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -93,6 +93,14 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ironGolemMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.ironGolemScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options -diff --git a/net/minecraft/world/entity/animal/MushroomCow.java b/net/minecraft/world/entity/animal/MushroomCow.java -index 9de016cb4e1aba2ab8ff4f16827b3450e8155992..743faa77525d68181ee38415399bc6078f9360f8 100644 ---- a/net/minecraft/world/entity/animal/MushroomCow.java -+++ b/net/minecraft/world/entity/animal/MushroomCow.java -@@ -80,6 +80,13 @@ public class MushroomCow extends AbstractCow implements Shearable { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.mooshroomMaxHealth); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { - return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); -diff --git a/net/minecraft/world/entity/animal/Ocelot.java b/net/minecraft/world/entity/animal/Ocelot.java -index 7db9d782a62cfac5f851a6242f4c9a24784648dc..947c4d4a9f93c3da36ab5912ef362a60bdf75596 100644 ---- a/net/minecraft/world/entity/animal/Ocelot.java -+++ b/net/minecraft/world/entity/animal/Ocelot.java -@@ -82,6 +82,14 @@ public class Ocelot extends Animal { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ocelotMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.ocelotScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - public boolean isTrusting() { - return this.entityData.get(DATA_TRUSTING); - } -diff --git a/net/minecraft/world/entity/animal/Panda.java b/net/minecraft/world/entity/animal/Panda.java -index 180d356bf24d20dc8c8534fdb59222e18672f1b4..53e4d1d35be13f04267151e1e8f808c5ad796ef5 100644 ---- a/net/minecraft/world/entity/animal/Panda.java -+++ b/net/minecraft/world/entity/animal/Panda.java -@@ -133,6 +133,15 @@ public class Panda extends Animal { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pandaMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.pandaScale); -+ setAttributes(); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { - return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); -@@ -626,7 +635,11 @@ public class Panda extends Animal { - - public void setAttributes() { - if (this.isWeak()) { -- this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(10.0); -+ // Purpur start - Configurable entity base attributes -+ net.minecraft.world.entity.ai.attributes.AttributeInstance maxHealth = this.getAttribute(Attributes.MAX_HEALTH); -+ maxHealth.setBaseValue(maxHealth.getValue() / 2); -+ // Purpur end - Configurable entity base attributes -+ - } - - if (this.isLazy()) { -diff --git a/net/minecraft/world/entity/animal/Parrot.java b/net/minecraft/world/entity/animal/Parrot.java -index 31e5ca2b2e0aaae75f4f2ffc2ada7d0224652608..01e2f610e8f0c54917899b54625b17fb0629df67 100644 ---- a/net/minecraft/world/entity/animal/Parrot.java -+++ b/net/minecraft/world/entity/animal/Parrot.java -@@ -194,6 +194,14 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.parrotMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.parrotScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Nullable - @Override - public SpawnGroupData finalizeSpawn( -diff --git a/net/minecraft/world/entity/animal/Pig.java b/net/minecraft/world/entity/animal/Pig.java -index 84afbacfb7f590fa68858816b7c717a92fd03fc2..8a8c796377254d47e68d0d8b1c9bdac7d4b99360 100644 ---- a/net/minecraft/world/entity/animal/Pig.java -+++ b/net/minecraft/world/entity/animal/Pig.java -@@ -83,6 +83,14 @@ public class Pig extends Animal implements ItemSteerable { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pigMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.pigScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/PolarBear.java b/net/minecraft/world/entity/animal/PolarBear.java -index 6ffb35630bab1303edb2179e4dcf749f9b3c3c28..2cf417f3bcf338a3edc4a2f71d8a700aca2e52dc 100644 ---- a/net/minecraft/world/entity/animal/PolarBear.java -+++ b/net/minecraft/world/entity/animal/PolarBear.java -@@ -117,6 +117,14 @@ public class PolarBear extends Animal implements NeutralMob { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.polarBearMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.polarBearScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { -diff --git a/net/minecraft/world/entity/animal/Pufferfish.java b/net/minecraft/world/entity/animal/Pufferfish.java -index 77862aea7b2bbc931d34c4e4ebd336bb5d5755d6..7ce2f0397b05e98a1d5721b6f5674cfbe7d19333 100644 ---- a/net/minecraft/world/entity/animal/Pufferfish.java -+++ b/net/minecraft/world/entity/animal/Pufferfish.java -@@ -59,6 +59,13 @@ public class Pufferfish extends AbstractFish { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pufferfishMaxHealth); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java -index f2ae78ccf93dbd7617f04d3d13b8b809fde0d151..7a2a95bb2fc1b7d2103da8ce7dd7f820af284f4f 100644 ---- a/net/minecraft/world/entity/animal/Rabbit.java -+++ b/net/minecraft/world/entity/animal/Rabbit.java -@@ -147,6 +147,14 @@ public class Rabbit extends Animal { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.rabbitMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.rabbitScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - public void registerGoals() { - this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/Salmon.java b/net/minecraft/world/entity/animal/Salmon.java -index a0bd1c1446b81868fdb61a4d3db6140e7887cdb9..e5790db0472fa97471b828cf6d817697389c3a8c 100644 ---- a/net/minecraft/world/entity/animal/Salmon.java -+++ b/net/minecraft/world/entity/animal/Salmon.java -@@ -51,6 +51,13 @@ public class Salmon extends AbstractSchoolingFish { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.salmonMaxHealth); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - public int getMaxSchoolSize() { - return 5; -diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index 00af403efafbdd7274524403b2212c15026ee147..d6f2a04cf04090e3cb68f5111d47bff9f1243568 100644 ---- a/net/minecraft/world/entity/animal/SnowGolem.java -+++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -80,6 +80,14 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.snowGolemMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.snowGolemScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -diff --git a/net/minecraft/world/entity/animal/Squid.java b/net/minecraft/world/entity/animal/Squid.java -index ff12229101aae273e5e887a7761ce1ba1b34e0b9..4f8a5d0d6c3d302ebf8fcb3268f8e40b63686125 100644 ---- a/net/minecraft/world/entity/animal/Squid.java -+++ b/net/minecraft/world/entity/animal/Squid.java -@@ -92,6 +92,14 @@ public class Squid extends AgeableWaterCreature { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.squidMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.squidScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); -diff --git a/net/minecraft/world/entity/animal/TropicalFish.java b/net/minecraft/world/entity/animal/TropicalFish.java -index 6c2497ab50dd7ab6d5a7043935b0beeed36bfad8..95368fd534c77e7d89ed6219f1f3948c428c256c 100644 ---- a/net/minecraft/world/entity/animal/TropicalFish.java -+++ b/net/minecraft/world/entity/animal/TropicalFish.java -@@ -89,6 +89,13 @@ public class TropicalFish extends AbstractSchoolingFish { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.tropicalFishMaxHealth); -+ } -+ // Purpur end - Configurable entity base attributes -+ - public static String getPredefinedName(int variantId) { - return "entity.minecraft.tropical_fish.predefined." + variantId; - } -diff --git a/net/minecraft/world/entity/animal/Turtle.java b/net/minecraft/world/entity/animal/Turtle.java -index f10c2e3346fe8102e0b3a93f8b57b8d262172bea..047a1b27d4af3d050784241c8a34fdebbd8e1f49 100644 ---- a/net/minecraft/world/entity/animal/Turtle.java -+++ b/net/minecraft/world/entity/animal/Turtle.java -@@ -104,6 +104,14 @@ public class Turtle extends Animal { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.turtleMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.turtleScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - public void setHomePos(BlockPos homePos) { - this.homePos = homePos; - } diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java -index 1811fed8085b7045003a6cc2731ce8fc6b4d74ea..bbe59d6ab90f1b1274289ef20811f914afa55fd3 100644 +index 6ab6305f0b25f7c860673c70d9ce911688ecf1e6..ea7666cc10aee49e13dbdd6e3367fabaa0dcbc17 100644 --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java -@@ -168,6 +168,14 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -167,6 +167,14 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS } // Purpur end - Ridables @@ -530,10 +71,10 @@ index 1811fed8085b7045003a6cc2731ce8fc6b4d74ea..bbe59d6ab90f1b1274289ef20811f914 protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index 60abd71799ec3bb61aae1f7933245156fbc1587b..17d1a3d7ad33d99a57ea11be467e746b3dc99cbe 100644 +index 767a730baa8a7694ed7d5f05b70118da1f4288cc..1f6b28531127ea2e5b291583f6bb6a236868fbf0 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -100,6 +100,14 @@ public class Armadillo extends Animal { +@@ -99,6 +99,14 @@ public class Armadillo extends Animal { } // Purpur end - Ridables @@ -549,7 +90,7 @@ index 60abd71799ec3bb61aae1f7933245156fbc1587b..17d1a3d7ad33d99a57ea11be467e746b protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 6614b38726dc1a9778032cbedc22e4343f70774f..330caf84f0a8e0edff764d4bd34b85b54b9f057f 100644 +index 3837397563bf3d568c120ae4e4e38d1a6dc7a8b2..3f9e15685ba52a5b9bd4282ba6de6751296975bf 100644 --- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -138,6 +138,14 @@ public class Axolotl extends Animal implements Bucketable { @@ -567,11 +108,30 @@ index 6614b38726dc1a9778032cbedc22e4343f70774f..330caf84f0a8e0edff764d4bd34b85b5 @Override public float getWalkTargetValue(BlockPos pos, LevelReader level) { return 0.0F; +diff --git a/net/minecraft/world/entity/animal/bee/Bee.java b/net/minecraft/world/entity/animal/bee/Bee.java +index d1e23e50bb6b023ecf4475406e23e14d43e89aad..b7d6dc9c2e12a51b1e63947d7b32d592a8c84ebb 100644 +--- a/net/minecraft/world/entity/animal/bee/Bee.java ++++ b/net/minecraft/world/entity/animal/bee/Bee.java +@@ -471,6 +471,14 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + return beehiveBlockEntity != null && beehiveBlockEntity.isFireNearby(); + } + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.beeMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.beeScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + public long getPersistentAngerEndTime() { + return this.entityData.get(DATA_ANGER_END_TIME); diff --git a/net/minecraft/world/entity/animal/camel/Camel.java b/net/minecraft/world/entity/animal/camel/Camel.java -index 486974bf7764a6eee37e67acdfc3b7798fa218ef..78df0eb0a0b6765406bd0dc041a02b099d86dd60 100644 +index a6a66084323435697b3185d7b86acaf5c7453719..95e86330e1e973c43e50bd4ac310212b8a057430 100644 --- a/net/minecraft/world/entity/animal/camel/Camel.java +++ b/net/minecraft/world/entity/animal/camel/Camel.java -@@ -335,6 +335,23 @@ public class Camel extends AbstractHorse { +@@ -343,6 +343,23 @@ public class Camel extends AbstractHorse { return this.dashCooldown; } @@ -595,31 +155,85 @@ index 486974bf7764a6eee37e67acdfc3b7798fa218ef..78df0eb0a0b6765406bd0dc041a02b09 @Override public SoundEvent getAmbientSound() { return SoundEvents.CAMEL_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -index 66e0ccdf938023a8df1cf179224b64508646e3e0..cfe0bb8983dd1633085e03a6c2a57d99a0d822b8 100644 ---- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -+++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -@@ -133,6 +133,16 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab +diff --git a/net/minecraft/world/entity/animal/chicken/Chicken.java b/net/minecraft/world/entity/animal/chicken/Chicken.java +index 4961bb85b91f68075cf0d22440d6377d9fcb7721..bfc5c6639ef1005d2752d5164f3613ddacc46bf1 100644 +--- a/net/minecraft/world/entity/animal/chicken/Chicken.java ++++ b/net/minecraft/world/entity/animal/chicken/Chicken.java +@@ -90,6 +90,14 @@ public class Chicken extends Animal { } // Purpur end - Ridables + // Purpur start - Configurable entity base attributes + @Override + public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.copperGolemMaxHealth); -+ this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(this.level().purpurConfig.copperGolemStepHeight); -+ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.copperGolemMovementSpeed); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.copperGolemScale); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.chickenMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.chickenScale); + } + // Purpur end - Configurable entity base attributes + - public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/cow/Cow.java b/net/minecraft/world/entity/animal/cow/Cow.java +index 0268063bb0db8c30c594a7d75d0d11f7236c3a68..5e5b239ebc774ae66f8c35a725ea917993239ef2 100644 +--- a/net/minecraft/world/entity/animal/cow/Cow.java ++++ b/net/minecraft/world/entity/animal/cow/Cow.java +@@ -46,6 +46,14 @@ public class Cow extends AbstractCow { } -diff --git a/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/net/minecraft/world/entity/animal/horse/AbstractHorse.java -index 28ea58a154d5a572268004ff9d36a5ae99f291e9..1692abcd9162f37beac489f1c704e0b8d3a6482a 100644 ---- a/net/minecraft/world/entity/animal/horse/AbstractHorse.java -+++ b/net/minecraft/world/entity/animal/horse/AbstractHorse.java + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.cowMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.cowScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/cow/MushroomCow.java b/net/minecraft/world/entity/animal/cow/MushroomCow.java +index 1a9f5f17e46af831bc6621c83c57e5436397dbc2..85ad44eb3e64232cf1ea326257078c46288a613a 100644 +--- a/net/minecraft/world/entity/animal/cow/MushroomCow.java ++++ b/net/minecraft/world/entity/animal/cow/MushroomCow.java +@@ -78,6 +78,13 @@ public class MushroomCow extends AbstractCow implements Shearable { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.mooshroomMaxHealth); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + public float getWalkTargetValue(BlockPos pos, LevelReader level) { + return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); +diff --git a/net/minecraft/world/entity/animal/dolphin/Dolphin.java b/net/minecraft/world/entity/animal/dolphin/Dolphin.java +index 656335a3bd021efc538ab407673c09a83178ed7c..94f92080de46f2af67e1d28753208691da534ddf 100644 +--- a/net/minecraft/world/entity/animal/dolphin/Dolphin.java ++++ b/net/minecraft/world/entity/animal/dolphin/Dolphin.java +@@ -152,6 +152,14 @@ public class Dolphin extends AgeableWaterCreature { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.dolphinMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.dolphinScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + public @Nullable SpawnGroupData finalizeSpawn( + ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData +diff --git a/net/minecraft/world/entity/animal/equine/AbstractHorse.java b/net/minecraft/world/entity/animal/equine/AbstractHorse.java +index a1dce0a5ce1fcd0a2ff7104b3592ffd5c948db34..5bd1e0f20a9553ae20db1d72d0b2a88bd92db723 100644 +--- a/net/minecraft/world/entity/animal/equine/AbstractHorse.java ++++ b/net/minecraft/world/entity/animal/equine/AbstractHorse.java @@ -140,6 +140,46 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory } // Purpur end - Ridables @@ -667,7 +281,7 @@ index 28ea58a154d5a572268004ff9d36a5ae99f291e9..1692abcd9162f37beac489f1c704e0b8 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur - Ridables -@@ -1058,7 +1098,7 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory +@@ -1050,7 +1090,7 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory spawnGroupData = new AgeableMob.AgeableMobGroupData(0.2F); } @@ -676,10 +290,10 @@ index 28ea58a154d5a572268004ff9d36a5ae99f291e9..1692abcd9162f37beac489f1c704e0b8 return super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData); } -diff --git a/net/minecraft/world/entity/animal/horse/Donkey.java b/net/minecraft/world/entity/animal/horse/Donkey.java -index 88e45b38763992a645e36cccab36f74a2024f671..65470905a29f1ae0ea7ac1d29ee108adcbc499c7 100644 ---- a/net/minecraft/world/entity/animal/horse/Donkey.java -+++ b/net/minecraft/world/entity/animal/horse/Donkey.java +diff --git a/net/minecraft/world/entity/animal/equine/Donkey.java b/net/minecraft/world/entity/animal/equine/Donkey.java +index 8aec9f254c82993632e68368d37b8c9bee7869cc..b85d967c7c809683e4576be30ed855941c6e68cc 100644 +--- a/net/minecraft/world/entity/animal/equine/Donkey.java ++++ b/net/minecraft/world/entity/animal/equine/Donkey.java @@ -23,6 +23,23 @@ public class Donkey extends AbstractChestedHorse { } // Purpur end - Ridables @@ -704,11 +318,11 @@ index 88e45b38763992a645e36cccab36f74a2024f671..65470905a29f1ae0ea7ac1d29ee108ad @Override public SoundEvent getAmbientSound() { return SoundEvents.DONKEY_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/Horse.java b/net/minecraft/world/entity/animal/horse/Horse.java -index e5fc006066a817737110918d047e71abf24bb334..78b68881357f1bc1111478bb7c9e4f1ba55e055e 100644 ---- a/net/minecraft/world/entity/animal/horse/Horse.java -+++ b/net/minecraft/world/entity/animal/horse/Horse.java -@@ -54,6 +54,23 @@ public class Horse extends AbstractHorse { +diff --git a/net/minecraft/world/entity/animal/equine/Horse.java b/net/minecraft/world/entity/animal/equine/Horse.java +index cc50151ce6e6daffc1ecd41eb89a0d2f159f651e..9a97cd588fb2dc0f393b2c8768f4e45066a34850 100644 +--- a/net/minecraft/world/entity/animal/equine/Horse.java ++++ b/net/minecraft/world/entity/animal/equine/Horse.java +@@ -57,6 +57,23 @@ public class Horse extends AbstractHorse { } // Purpur end - Ridables @@ -732,11 +346,11 @@ index e5fc006066a817737110918d047e71abf24bb334..78b68881357f1bc1111478bb7c9e4f1b @Override protected void randomizeAttributes(RandomSource random) { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); -diff --git a/net/minecraft/world/entity/animal/horse/Llama.java b/net/minecraft/world/entity/animal/horse/Llama.java -index 1e76e5c5e046e9e284c42ad5de9430aa489a7b28..d1f1f30486ea5c4785e5c4c0104fa31a2e27521a 100644 ---- a/net/minecraft/world/entity/animal/horse/Llama.java -+++ b/net/minecraft/world/entity/animal/horse/Llama.java -@@ -137,6 +137,23 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +diff --git a/net/minecraft/world/entity/animal/equine/Llama.java b/net/minecraft/world/entity/animal/equine/Llama.java +index bba6493eee2f605faac0d49d665117d2f2c41213..b54a535add643390a6164ab3f4a2fdd475d60162 100644 +--- a/net/minecraft/world/entity/animal/equine/Llama.java ++++ b/net/minecraft/world/entity/animal/equine/Llama.java +@@ -135,6 +135,23 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { } // Purpur end - Ridables @@ -760,10 +374,10 @@ index 1e76e5c5e046e9e284c42ad5de9430aa489a7b28..d1f1f30486ea5c4785e5c4c0104fa31a public boolean isTraderLlama() { return false; } -diff --git a/net/minecraft/world/entity/animal/horse/Mule.java b/net/minecraft/world/entity/animal/horse/Mule.java -index d6c61075321e6005f977be17bbb6d7045f42d7f0..dc3723c5a0bca9e1023629657f668c7e5f6df4a4 100644 ---- a/net/minecraft/world/entity/animal/horse/Mule.java -+++ b/net/minecraft/world/entity/animal/horse/Mule.java +diff --git a/net/minecraft/world/entity/animal/equine/Mule.java b/net/minecraft/world/entity/animal/equine/Mule.java +index 60c151af9e51ba1dd1063344a3f5c021b6a48440..f49c8a61ac3883f7ff8ad8193ae9ea9136f54c45 100644 +--- a/net/minecraft/world/entity/animal/equine/Mule.java ++++ b/net/minecraft/world/entity/animal/equine/Mule.java @@ -22,6 +22,23 @@ public class Mule extends AbstractChestedHorse { } // Purpur end - Ridables @@ -788,11 +402,11 @@ index d6c61075321e6005f977be17bbb6d7045f42d7f0..dc3723c5a0bca9e1023629657f668c7e @Override public SoundEvent getAmbientSound() { return SoundEvents.MULE_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -index 47b36581d5291e4d223fb39572d62674b8eb68bc..557e06b9002217b7ba5a07399bd71491cb0236c6 100644 ---- a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -+++ b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -@@ -49,6 +49,23 @@ public class SkeletonHorse extends AbstractHorse { +diff --git a/net/minecraft/world/entity/animal/equine/SkeletonHorse.java b/net/minecraft/world/entity/animal/equine/SkeletonHorse.java +index 3d98259439c3bdb97ab2c66734daf90a56b290ef..d8b7b787b98b86d16578abe1cd19321ad2c176c0 100644 +--- a/net/minecraft/world/entity/animal/equine/SkeletonHorse.java ++++ b/net/minecraft/world/entity/animal/equine/SkeletonHorse.java +@@ -50,6 +50,23 @@ public class SkeletonHorse extends AbstractHorse { } // Purpur end - Ridables @@ -816,10 +430,10 @@ index 47b36581d5291e4d223fb39572d62674b8eb68bc..557e06b9002217b7ba5a07399bd71491 public static AttributeSupplier.Builder createAttributes() { return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); } -diff --git a/net/minecraft/world/entity/animal/horse/TraderLlama.java b/net/minecraft/world/entity/animal/horse/TraderLlama.java -index 21211278de627079d7c9e91305e42aa0f8ae34d3..a566336bb088286a29eeeca1703addc98922f6e6 100644 ---- a/net/minecraft/world/entity/animal/horse/TraderLlama.java -+++ b/net/minecraft/world/entity/animal/horse/TraderLlama.java +diff --git a/net/minecraft/world/entity/animal/equine/TraderLlama.java b/net/minecraft/world/entity/animal/equine/TraderLlama.java +index 68b72c18a3880dead3b32b646a2f6a09d4b98c44..deb0a1eb867daec57a644ce698fe50d79fd8960e 100644 +--- a/net/minecraft/world/entity/animal/equine/TraderLlama.java ++++ b/net/minecraft/world/entity/animal/equine/TraderLlama.java @@ -53,6 +53,23 @@ public class TraderLlama extends Llama { } // Purpur end - Ridables @@ -844,11 +458,11 @@ index 21211278de627079d7c9e91305e42aa0f8ae34d3..a566336bb088286a29eeeca1703addc9 @Override public boolean isTraderLlama() { return true; -diff --git a/net/minecraft/world/entity/animal/horse/ZombieHorse.java b/net/minecraft/world/entity/animal/horse/ZombieHorse.java -index c916c28b0d3115588cedf84cf70469b6f6050ec9..6684f5dfb7dec101bad15b7ede3d9fd377aacd45 100644 ---- a/net/minecraft/world/entity/animal/horse/ZombieHorse.java -+++ b/net/minecraft/world/entity/animal/horse/ZombieHorse.java -@@ -45,6 +45,23 @@ public class ZombieHorse extends AbstractHorse { +diff --git a/net/minecraft/world/entity/animal/equine/ZombieHorse.java b/net/minecraft/world/entity/animal/equine/ZombieHorse.java +index c1a13047c673cafc5de873215dd368eae6ac8b5e..8b8580f8c082a40f958ec61adf32dc7d1485ea68 100644 +--- a/net/minecraft/world/entity/animal/equine/ZombieHorse.java ++++ b/net/minecraft/world/entity/animal/equine/ZombieHorse.java +@@ -64,6 +64,23 @@ public class ZombieHorse extends AbstractHorse { } // Purpur end - Ridables @@ -870,10 +484,340 @@ index c916c28b0d3115588cedf84cf70469b6f6050ec9..6684f5dfb7dec101bad15b7ede3d9fd3 + // Purpur end - Configurable entity base attributes + public static AttributeSupplier.Builder createAttributes() { - return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); + return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 25.0); } +diff --git a/net/minecraft/world/entity/animal/feline/Cat.java b/net/minecraft/world/entity/animal/feline/Cat.java +index 2fe8b8382b7cb4056f4d430cf632ecf413e8e25b..b7c17aed96dce39cb03780ff251e0e38c3c6adb1 100644 +--- a/net/minecraft/world/entity/animal/feline/Cat.java ++++ b/net/minecraft/world/entity/animal/feline/Cat.java +@@ -120,6 +120,14 @@ public class Cat extends TamableAnimal { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.catMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.catScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); +diff --git a/net/minecraft/world/entity/animal/feline/Ocelot.java b/net/minecraft/world/entity/animal/feline/Ocelot.java +index 22fa29aa785eda8fb4a895d36413626da8a49a0e..c9a8dcfd1e46f97dee0393db3205049c0db1cefb 100644 +--- a/net/minecraft/world/entity/animal/feline/Ocelot.java ++++ b/net/minecraft/world/entity/animal/feline/Ocelot.java +@@ -83,6 +83,14 @@ public class Ocelot extends Animal { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ocelotMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.ocelotScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + public boolean isTrusting() { + return this.entityData.get(DATA_TRUSTING); + } +diff --git a/net/minecraft/world/entity/animal/fish/Cod.java b/net/minecraft/world/entity/animal/fish/Cod.java +index f73b3f5ae65f7793ff25145c72fb35e3daec8494..e00e623d7df9e179d8bb5ee4812538578c5f4c08 100644 +--- a/net/minecraft/world/entity/animal/fish/Cod.java ++++ b/net/minecraft/world/entity/animal/fish/Cod.java +@@ -25,6 +25,13 @@ public class Cod extends AbstractSchoolingFish { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.codMaxHealth); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + public ItemStack getBucketItemStack() { + return new ItemStack(Items.COD_BUCKET); +diff --git a/net/minecraft/world/entity/animal/fish/Pufferfish.java b/net/minecraft/world/entity/animal/fish/Pufferfish.java +index 1eaa5e5fb65b18e5042d69b5dbfea15a7271c0aa..b2932aeb6000a4e268db12cb7b05be746788569c 100644 +--- a/net/minecraft/world/entity/animal/fish/Pufferfish.java ++++ b/net/minecraft/world/entity/animal/fish/Pufferfish.java +@@ -59,6 +59,13 @@ public class Pufferfish extends AbstractFish { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pufferfishMaxHealth); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/fish/Salmon.java b/net/minecraft/world/entity/animal/fish/Salmon.java +index b362ce156765ad45b8c29b5dc2c6d9d99d2e1474..97194d5c844bf96ba431c12ccc1a82cb8944c52b 100644 +--- a/net/minecraft/world/entity/animal/fish/Salmon.java ++++ b/net/minecraft/world/entity/animal/fish/Salmon.java +@@ -52,6 +52,13 @@ public class Salmon extends AbstractSchoolingFish { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.salmonMaxHealth); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + public int getMaxSchoolSize() { + return 5; +diff --git a/net/minecraft/world/entity/animal/fish/TropicalFish.java b/net/minecraft/world/entity/animal/fish/TropicalFish.java +index 3281e75c48fb6cafdba088254009e5b4285b3819..8ffb253c114d882c9459f74a27bd8a086ae82f01 100644 +--- a/net/minecraft/world/entity/animal/fish/TropicalFish.java ++++ b/net/minecraft/world/entity/animal/fish/TropicalFish.java +@@ -89,6 +89,13 @@ public class TropicalFish extends AbstractSchoolingFish { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.tropicalFishMaxHealth); ++ } ++ // Purpur end - Configurable entity base attributes ++ + public static String getPredefinedName(int variantId) { + return "entity.minecraft.tropical_fish.predefined." + variantId; + } +diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java +index bf00cf5e6fd8b9143e1b327ef7b90ae055d264ff..6819bcb15ad6c85f41a098a9fdb73ce5a7987d8f 100644 +--- a/net/minecraft/world/entity/animal/fox/Fox.java ++++ b/net/minecraft/world/entity/animal/fox/Fox.java +@@ -189,6 +189,14 @@ public class Fox extends Animal { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.foxMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.foxScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/golem/CopperGolem.java b/net/minecraft/world/entity/animal/golem/CopperGolem.java +index 4dc1ce5e07e23134cf3ed68e78a055c3b75fdc83..e3c5b6fe7d6cdb674fbf5ac22001c3d917bf91ec 100644 +--- a/net/minecraft/world/entity/animal/golem/CopperGolem.java ++++ b/net/minecraft/world/entity/animal/golem/CopperGolem.java +@@ -130,6 +130,16 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.copperGolemMaxHealth); ++ this.getAttribute(Attributes.STEP_HEIGHT).setBaseValue(this.level().purpurConfig.copperGolemStepHeight); ++ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.copperGolemMovementSpeed); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.copperGolemScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + public static AttributeSupplier.Builder createAttributes() { + return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); + } +diff --git a/net/minecraft/world/entity/animal/golem/IronGolem.java b/net/minecraft/world/entity/animal/golem/IronGolem.java +index 363bf7781c8785bc6fdbc65941794a5a02f8a57a..677f584b38aeb6805db0bb867f62d5617e309f5e 100644 +--- a/net/minecraft/world/entity/animal/golem/IronGolem.java ++++ b/net/minecraft/world/entity/animal/golem/IronGolem.java +@@ -91,6 +91,14 @@ public class IronGolem extends AbstractGolem implements NeutralMob { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.ironGolemMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.ironGolemScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options +diff --git a/net/minecraft/world/entity/animal/golem/SnowGolem.java b/net/minecraft/world/entity/animal/golem/SnowGolem.java +index d8a3b7d329757bb84ee4d53671c89f211e8581ab..ab44bc401438d589696d9f25ebaca0fc39648bed 100644 +--- a/net/minecraft/world/entity/animal/golem/SnowGolem.java ++++ b/net/minecraft/world/entity/animal/golem/SnowGolem.java +@@ -79,6 +79,14 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.snowGolemMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.snowGolemScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables +diff --git a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +index 805efd86b09b2d1dbb5f2d51f3f5bfe67a1c0387..7f45de1bbabc711eaf9d9c33afac47687b75da45 100644 +--- a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java ++++ b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +@@ -133,6 +133,19 @@ public class HappyGhast extends Animal { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.happyGhastMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.happyGhastScale); ++ this.getAttribute(Attributes.TEMPT_RANGE).setBaseValue(this.level().purpurConfig.happyGhastTemptRange); ++ this.getAttribute(Attributes.FLYING_SPEED).setBaseValue(this.level().purpurConfig.happyGhastFlyingSpeed); ++ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.happyGhastMovementSpeed); ++ this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level().purpurConfig.happyGhastFollowRange); ++ this.getAttribute(Attributes.CAMERA_DISTANCE).setBaseValue(this.level().purpurConfig.happyGhastCameraDistance); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void ageBoundaryReached() { + if (this.isBaby()) { +@@ -156,7 +169,7 @@ public class HappyGhast extends Animal { + + @Override + protected float sanitizeScale(float scale) { +- return Math.min(scale, 1.0F); ++ return Math.min(scale, 1.0F); // Purpur - Configurable entity base attributes + } + + @Override +diff --git a/net/minecraft/world/entity/animal/panda/Panda.java b/net/minecraft/world/entity/animal/panda/Panda.java +index 93503f6b4eea2cb2ae6c01279e847c307920c35d..d5060fb8e9a711e6230f2c4950521d8b4f5c01d2 100644 +--- a/net/minecraft/world/entity/animal/panda/Panda.java ++++ b/net/minecraft/world/entity/animal/panda/Panda.java +@@ -134,6 +134,15 @@ public class Panda extends Animal { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pandaMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.pandaScale); ++ setAttributes(); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { + return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); +@@ -625,7 +634,11 @@ public class Panda extends Animal { + + public void setAttributes() { + if (this.isWeak()) { +- this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(10.0); ++ // Purpur start - Configurable entity base attributes ++ net.minecraft.world.entity.ai.attributes.AttributeInstance maxHealth = this.getAttribute(Attributes.MAX_HEALTH); ++ maxHealth.setBaseValue(maxHealth.getValue() / 2); ++ // Purpur end - Configurable entity base attributes ++ + } + + if (this.isLazy()) { +diff --git a/net/minecraft/world/entity/animal/parrot/Parrot.java b/net/minecraft/world/entity/animal/parrot/Parrot.java +index 6a4d170cd1e4dde2af30895f9fbac9dd599d0602..7480a491533a47882eaf4b36c320adf45ebfb190 100644 +--- a/net/minecraft/world/entity/animal/parrot/Parrot.java ++++ b/net/minecraft/world/entity/animal/parrot/Parrot.java +@@ -199,6 +199,14 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.parrotMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.parrotScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + public @Nullable SpawnGroupData finalizeSpawn( + ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData +diff --git a/net/minecraft/world/entity/animal/pig/Pig.java b/net/minecraft/world/entity/animal/pig/Pig.java +index afae5546eae084bafaa164705d4e6f09af3bc43a..55a862844907d7663323fb9c8de823aff5109c30 100644 +--- a/net/minecraft/world/entity/animal/pig/Pig.java ++++ b/net/minecraft/world/entity/animal/pig/Pig.java +@@ -84,6 +84,14 @@ public class Pig extends Animal implements ItemSteerable { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pigMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.pigScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/polarbear/PolarBear.java b/net/minecraft/world/entity/animal/polarbear/PolarBear.java +index 718531a324c36ac65a93af5c12e0c0a3948606cb..904e4c641f1892220f263528c65f6f81708399cd 100644 +--- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java ++++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java +@@ -118,6 +118,14 @@ public class PolarBear extends Animal implements NeutralMob { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.polarBearMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.polarBearScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return EntityType.POLAR_BEAR.create(level, EntitySpawnReason.BREEDING); +diff --git a/net/minecraft/world/entity/animal/rabbit/Rabbit.java b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +index 16fbee742f28cf4571effb66265daeee64bae9b7..cfbab57dd0527c5e2f17718f3974059eb881c2ea 100644 +--- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java ++++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +@@ -148,6 +148,14 @@ public class Rabbit extends Animal { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.rabbitMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.rabbitScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + public void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/animal/sheep/Sheep.java b/net/minecraft/world/entity/animal/sheep/Sheep.java -index 52cdadd752c7e470a22eaac70143766d0ad46843..e479dd9e94ee931b6e9001f89dc36406c3dde209 100644 +index a33800517d5fb5ab008e22b77be2f079901c1a99..1d60d35c1330418009f7d1d0b60d263559b68b7f 100644 --- a/net/minecraft/world/entity/animal/sheep/Sheep.java +++ b/net/minecraft/world/entity/animal/sheep/Sheep.java @@ -80,6 +80,14 @@ public class Sheep extends Animal implements Shearable { @@ -910,11 +854,67 @@ index 3d5cf62bd9bd99a978b7dc535675178deb695af0..eb6675394ecc5bba67e0f8bb0220ad92 @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/squid/GlowSquid.java b/net/minecraft/world/entity/animal/squid/GlowSquid.java +index c5a8080aa0fa1014602ba76fb4d8ad69b926dbfa..7d41aaa0546a9ca02e46ce46e61ecc57120bfca9 100644 +--- a/net/minecraft/world/entity/animal/squid/GlowSquid.java ++++ b/net/minecraft/world/entity/animal/squid/GlowSquid.java +@@ -50,6 +50,13 @@ public class GlowSquid extends Squid { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.glowSquidMaxHealth); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected ParticleOptions getInkParticle() { + return ParticleTypes.GLOW_SQUID_INK; +diff --git a/net/minecraft/world/entity/animal/squid/Squid.java b/net/minecraft/world/entity/animal/squid/Squid.java +index 69d87bd27a95bb9e92cd24fb7973a9b06714567e..5e4181f95711c6b0299f28de14d95da421dda373 100644 +--- a/net/minecraft/world/entity/animal/squid/Squid.java ++++ b/net/minecraft/world/entity/animal/squid/Squid.java +@@ -93,6 +93,14 @@ public class Squid extends AgeableWaterCreature { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.squidMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.squidScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); +diff --git a/net/minecraft/world/entity/animal/turtle/Turtle.java b/net/minecraft/world/entity/animal/turtle/Turtle.java +index 7699967db327cf80940bf30d8e0c734b43fd1e8f..8d9a1fe887c39588e43e4ccfc46151a033c8ccb7 100644 +--- a/net/minecraft/world/entity/animal/turtle/Turtle.java ++++ b/net/minecraft/world/entity/animal/turtle/Turtle.java +@@ -104,6 +104,14 @@ public class Turtle extends Animal { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.turtleMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.turtleScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + public void setHomePos(BlockPos homePos) { + this.homePos = homePos; + } diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index b452d7c881f9b90ad429e9a522b17dfdbb480c31..826c56281f1452fd1f4f9fba12a1fd169532e8cf 100644 +index 44b650de646ea605e41f39f3d99d8f550c9a8e19..7bccee8b5dd689bbff18f34d3afac52bfe34aa42 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -209,6 +209,14 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -208,6 +208,14 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Ridables @@ -930,10 +930,10 @@ index b452d7c881f9b90ad429e9a522b17dfdbb480c31..826c56281f1452fd1f4f9fba12a1fd16 protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 743abfe1eceaa8e9530790abdc787d3765c1191e..52c959961a13bd3b85a262128b0950c60f96dc2f 100644 +index b8ddcc460ff1ae1cbfde70d3d8c16486bb2d3f8c..844c989fc4e0d131d823bf8a59951f35f30b7641 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -166,6 +166,13 @@ public class EnderDragon extends Mob implements Enemy { +@@ -163,6 +163,13 @@ public class EnderDragon extends Mob implements Enemy { } // Purpur end - Ridables @@ -947,7 +947,7 @@ index 743abfe1eceaa8e9530790abdc787d3765c1191e..52c959961a13bd3b85a262128b0950c6 public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 200.0).add(Attributes.CAMERA_DISTANCE, 16.0); } -@@ -1064,7 +1071,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -1059,7 +1066,7 @@ public class EnderDragon extends Mob implements Enemy { @Override protected float sanitizeScale(float scale) { @@ -957,10 +957,10 @@ index 743abfe1eceaa8e9530790abdc787d3765c1191e..52c959961a13bd3b85a262128b0950c6 // CraftBukkit start - SPIGOT-2420: Special case, the ender dragon drops 12000 xp for the first kill and 500 xp for every other kill and this over time. diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 03167b61a9f2886d31881af809d7bca7be325872..3b037d2565fb30f68384d2b391f6d8219fdc9732 100644 +index dbf3c7049fae08dc5c4ac491a5fc8141ab177a22..612df8799b80f1793ab9781212442098633e9d65 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -214,6 +214,14 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -213,6 +213,14 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Ridables @@ -975,7 +975,7 @@ index 03167b61a9f2886d31881af809d7bca7be325872..3b037d2565fb30f68384d2b391f6d821 @Override protected PathNavigation createNavigation(Level level) { FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); -@@ -436,7 +444,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -435,7 +443,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { this.setInvulnerableTicks(i); if (this.tickCount % 10 == 0) { @@ -985,7 +985,7 @@ index 03167b61a9f2886d31881af809d7bca7be325872..3b037d2565fb30f68384d2b391f6d821 } else { super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/monster/Blaze.java b/net/minecraft/world/entity/monster/Blaze.java -index 1571709d83b8e01707dac274447419413ef82a43..cb536ec921c837b86c2c1dfbe1d6b08a9b18bf0f 100644 +index 1febee23188d91e2a27c182b97502e8c7ab696a2..4cd7975a8e9e55d6b6ded0b7e13d8da436e49c6c 100644 --- a/net/minecraft/world/entity/monster/Blaze.java +++ b/net/minecraft/world/entity/monster/Blaze.java @@ -76,6 +76,14 @@ public class Blaze extends Monster { @@ -1003,46 +1003,8 @@ index 1571709d83b8e01707dac274447419413ef82a43..cb536ec921c837b86c2c1dfbe1d6b08a @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -diff --git a/net/minecraft/world/entity/monster/Bogged.java b/net/minecraft/world/entity/monster/Bogged.java -index 71a8bf118babb1fd7985caac087855c1da85025c..2ec4e1cc570ebdbaa8a0f3fc681026a4b89f53ed 100644 ---- a/net/minecraft/world/entity/monster/Bogged.java -+++ b/net/minecraft/world/entity/monster/Bogged.java -@@ -60,6 +60,14 @@ public class Bogged extends AbstractSkeleton implements Shearable { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.boggedMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.boggedScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/monster/CaveSpider.java b/net/minecraft/world/entity/monster/CaveSpider.java -index e528e85dfb080c6fa28c01536d8fd0a29662651e..ca8e92447eb5f58e2bd855ac6fa1d580425218f9 100644 ---- a/net/minecraft/world/entity/monster/CaveSpider.java -+++ b/net/minecraft/world/entity/monster/CaveSpider.java -@@ -43,6 +43,14 @@ public class CaveSpider extends Spider { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.caveSpiderMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.caveSpiderScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - public boolean doHurtTarget(ServerLevel level, Entity target) { - if (super.doHurtTarget(level, target)) { diff --git a/net/minecraft/world/entity/monster/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index c3e2677a817da764577acc7298ad5fe52d7d5b2e..6259636b9856be5b03af83ee515e70cbf1eb51d8 100644 +index cfd09a5ff326cf4ecc248901696ce1f623a8e7c0..ed1ccd712a2fe00740beeee4fe615976258f5c6c 100644 --- a/net/minecraft/world/entity/monster/Creeper.java +++ b/net/minecraft/world/entity/monster/Creeper.java @@ -137,6 +137,14 @@ public class Creeper extends Monster { @@ -1060,30 +1022,6 @@ index c3e2677a817da764577acc7298ad5fe52d7d5b2e..6259636b9856be5b03af83ee515e70cb @Override protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/monster/Drowned.java b/net/minecraft/world/entity/monster/Drowned.java -index 8ab6c0f67ac25c1229850ae01abd01d878827d0c..4037f13778d21461c862c26a0fcc3c08e6d472ae 100644 ---- a/net/minecraft/world/entity/monster/Drowned.java -+++ b/net/minecraft/world/entity/monster/Drowned.java -@@ -93,6 +93,19 @@ public class Drowned extends Zombie implements RangedAttackMob { - return new AmphibiousPathNavigation(this, level); - } - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.drownedMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.drownedScale); -+ } -+ -+ @Override -+ protected void randomizeReinforcementsChance() { -+ this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.drownedSpawnReinforcements); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void addBehaviourGoals() { - this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0)); diff --git a/net/minecraft/world/entity/monster/ElderGuardian.java b/net/minecraft/world/entity/monster/ElderGuardian.java index e5d16ca14a40d520dce43dd3d9b6347aefbd25d7..57fb334f670d35aa181b13e12fa2c5f36da1dda6 100644 --- a/net/minecraft/world/entity/monster/ElderGuardian.java @@ -1104,10 +1042,10 @@ index e5d16ca14a40d520dce43dd3d9b6347aefbd25d7..57fb334f670d35aa181b13e12fa2c5f3 return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.3F).add(Attributes.ATTACK_DAMAGE, 8.0).add(Attributes.MAX_HEALTH, 80.0); } diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index 6ded7dfa381d0041dffb914a85c2e835c0b4a493..ae532c1b5f838223d416564eab626a71b2d423e7 100644 +index bd78d8c3e8c1d9b581c751d336322fbfe20dacef..29570047bfc78a8993b0bbd7168cb4fe318a6be6 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -107,6 +107,14 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -106,6 +106,14 @@ public class EnderMan extends Monster implements NeutralMob { } // Purpur end - Ridables @@ -1141,27 +1079,8 @@ index 844ba943a2a752f9b25506b644a4b4abc981b4cb..c6ae00f6ab83743b9ce43d9e55f04ba2 @Override protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/monster/Evoker.java b/net/minecraft/world/entity/monster/Evoker.java -index 70cf903d95d35b539e9a299a4035c8ddde5e4b97..a5243b7969fec5d60b94368caf5e962c348c4135 100644 ---- a/net/minecraft/world/entity/monster/Evoker.java -+++ b/net/minecraft/world/entity/monster/Evoker.java -@@ -65,6 +65,14 @@ public class Evoker extends SpellcasterIllager { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.evokerMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.evokerScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Ghast.java b/net/minecraft/world/entity/monster/Ghast.java -index 89319696240f0f58fdac19b7faff29546f0ba0de..30b75f7e7a79aaa602083eb07f125a3a5e5f19f9 100644 +index 451627153610f2c8db2403f73545c9af6dfd2e4b..7d97c00ae49629b97104631317aa6174741cdd5e 100644 --- a/net/minecraft/world/entity/monster/Ghast.java +++ b/net/minecraft/world/entity/monster/Ghast.java @@ -75,6 +75,14 @@ public class Ghast extends Mob implements Enemy { @@ -1201,10 +1120,10 @@ index dcbe6bbce0baa4fad7fe180944beeb6ca4026f7d..416bb85fc87b5f9e372f33df8fe27f12 return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 100.0) diff --git a/net/minecraft/world/entity/monster/Guardian.java b/net/minecraft/world/entity/monster/Guardian.java -index 8e5990d581dec09dccb1c05c636b9b617b289aac..d206d9b8563dfd38c0ff4c8b4abe00aa064a2305 100644 +index 4cf54e55de1ecc57061ad0c09e7966d6104f1cc2..1eaa4f255b01eddc93ddbc5615ad05e7d8273581 100644 --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java -@@ -91,6 +91,14 @@ public class Guardian extends Monster { +@@ -89,6 +89,14 @@ public class Guardian extends Monster { } // Purpur end - Ridables @@ -1219,52 +1138,8 @@ index 8e5990d581dec09dccb1c05c636b9b617b289aac..d206d9b8563dfd38c0ff4c8b4abe00aa @Override protected void registerGoals() { MoveTowardsRestrictionGoal moveTowardsRestrictionGoal = new MoveTowardsRestrictionGoal(this, 1.0); -diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java -index 671796f230bec419c3c40ff89c410babd4a31628..18fde06fce29973871547db5f638ba05638a8b18 100644 ---- a/net/minecraft/world/entity/monster/Husk.java -+++ b/net/minecraft/world/entity/monster/Husk.java -@@ -38,6 +38,18 @@ public class Husk extends Zombie { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.huskMaxHealth); -+ } -+ -+ @Override -+ protected void randomizeReinforcementsChance() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.huskSpawnReinforcements); -+ } -+ // Purpur end - Configurable entity base attributes -+ - public static boolean checkHuskSpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { -diff --git a/net/minecraft/world/entity/monster/Illusioner.java b/net/minecraft/world/entity/monster/Illusioner.java -index 162986914c6718438b7e1d5408bdbe5a4d3e3a68..b6872c94d769346ed2a8bb2406fc2b39ef64a67c 100644 ---- a/net/minecraft/world/entity/monster/Illusioner.java -+++ b/net/minecraft/world/entity/monster/Illusioner.java -@@ -74,6 +74,16 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ protected void initAttributes() { -+ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.illusionerMovementSpeed); -+ this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level().purpurConfig.illusionerFollowRange); -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.illusionerMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.illusionerScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java -index 8b58e0a76c9651cacacb503391ef9b6a53a3ddbc..db9e4dff83640b1e499db944a0c1cf3b869bc314 100644 +index a3cd6d4b999fc49893794838c73370c19c6a66b6..e0fda9a975e00c49ba09db65d7b3fba8fa434757 100644 --- a/net/minecraft/world/entity/monster/MagmaCube.java +++ b/net/minecraft/world/entity/monster/MagmaCube.java @@ -46,6 +46,28 @@ public class MagmaCube extends Slime { @@ -1297,10 +1172,10 @@ index 8b58e0a76c9651cacacb503391ef9b6a53a3ddbc..db9e4dff83640b1e499db944a0c1cf3b return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F); } diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index cf297cb029ea2226f876eaec0dc0875b00abb281..f2af9bd8265d66711c7dcc8ef16893edfe8d918a 100644 +index 64e55d48bc81d6237970e86e6e1cc719831902fd..046d6d3b665d0dbb5403ebe91d18503ec7613936 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -142,7 +142,10 @@ public class Phantom extends Mob implements Enemy { +@@ -140,7 +140,10 @@ public class Phantom extends Mob implements Enemy { private void updatePhantomSizeInfo() { this.refreshDimensions(); if (level().purpurConfig.phantomFlamesOnSwoop && attackPhase == AttackPhase.SWOOP) shoot(); // Purpur - Ridables - Phantom flames on swoop @@ -1312,7 +1187,7 @@ index cf297cb029ea2226f876eaec0dc0875b00abb281..f2af9bd8265d66711c7dcc8ef16893ed } public int getPhantomSize() { -@@ -162,6 +165,23 @@ public class Phantom extends Mob implements Enemy { +@@ -160,6 +163,23 @@ public class Phantom extends Mob implements Enemy { return this.getId() * 3; } @@ -1336,30 +1211,11 @@ index cf297cb029ea2226f876eaec0dc0875b00abb281..f2af9bd8265d66711c7dcc8ef16893ed @Override public void tick() { super.tick(); -diff --git a/net/minecraft/world/entity/monster/Pillager.java b/net/minecraft/world/entity/monster/Pillager.java -index f75eab4f895c0ed381b65717dc106dc13325428a..748233be6bdfd735aa3ccc02a7ba21a45603ffa4 100644 ---- a/net/minecraft/world/entity/monster/Pillager.java -+++ b/net/minecraft/world/entity/monster/Pillager.java -@@ -81,6 +81,14 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pillagerMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.pillagerScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index 34a20b3d482b98c4fca961e5fd930b283b68dc41..47741944d11b55bcff46bb9abc2a059652a4f86a 100644 +index 6fa5fc86cfb2493a8bcd0dae92be635b7c1f6fe0..c3546b0841aff52ef758b0e8e48c9a70726f412d 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -94,6 +94,14 @@ public class Ravager extends Raider { +@@ -95,6 +95,14 @@ public class Ravager extends Raider { } // Purpur end - Ridables @@ -1375,10 +1231,10 @@ index 34a20b3d482b98c4fca961e5fd930b283b68dc41..47741944d11b55bcff46bb9abc2a0596 protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index d9401842948fed8edd6d31fcf08da2747f1a3921..3909804ba8f9e220260efe6255ff2b298a4448db 100644 +index 9647741b67e1b4b7bbff0df22fc1bf3fb26afa73..30f2503ebd045b05f5594cef28389a694338d13a 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -126,6 +126,14 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -125,6 +125,14 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Ridables @@ -1393,7 +1249,7 @@ index d9401842948fed8edd6d31fcf08da2747f1a3921..3909804ba8f9e220260efe6255ff2b29 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -605,7 +613,7 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -601,7 +609,7 @@ public class Shulker extends AbstractGolem implements Enemy { @Override protected float sanitizeScale(float scale) { @@ -1403,10 +1259,10 @@ index d9401842948fed8edd6d31fcf08da2747f1a3921..3909804ba8f9e220260efe6255ff2b29 private void setVariant(Optional variant) { diff --git a/net/minecraft/world/entity/monster/Silverfish.java b/net/minecraft/world/entity/monster/Silverfish.java -index 2fb89fffb425afb0b0267fc45f8198b7b120d10c..276f8e8234ed461af57c7fe0b7ea0346c86b9698 100644 +index cf305d4a0a71f91caa31757dcd8ca5be84fc3f03..1df006a0a49038f1e737194e7da8e0b27e6eeb95 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java -@@ -56,6 +56,16 @@ public class Silverfish extends Monster { +@@ -55,6 +55,16 @@ public class Silverfish extends Monster { } // Purpur end - Ridables @@ -1423,29 +1279,11 @@ index 2fb89fffb425afb0b0267fc45f8198b7b120d10c..276f8e8234ed461af57c7fe0b7ea0346 @Override protected void registerGoals() { this.friendsGoal = new Silverfish.SilverfishWakeUpFriendsGoal(this); -diff --git a/net/minecraft/world/entity/monster/Skeleton.java b/net/minecraft/world/entity/monster/Skeleton.java -index d225d9cd41bdb3b6e998f3ca38394d1d3fe8b64b..0a5d78da5f809afde38ebbbcec3798a7a5f0f9be 100644 ---- a/net/minecraft/world/entity/monster/Skeleton.java -+++ b/net/minecraft/world/entity/monster/Skeleton.java -@@ -43,6 +43,13 @@ public class Skeleton extends AbstractSkeleton { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.skeletonMaxHealth); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java -index e46fd8c9f9966dab8b27004db0bc7028e95dedf2..5af9f8182fa8bc3720cf30ed073ecc8050a76b43 100644 +index 0c56f9ae47b9263ac65fd3593911e2c8479fc157..f93a2c58b5835e9ce8318d28e944533ef69df8ef 100644 --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java -@@ -101,6 +101,39 @@ public class Slime extends Mob implements Enemy { +@@ -102,6 +102,39 @@ public class Slime extends Mob implements Enemy { } // Purpur end - Ridables @@ -1485,7 +1323,7 @@ index e46fd8c9f9966dab8b27004db0bc7028e95dedf2..5af9f8182fa8bc3720cf30ed073ecc80 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -131,9 +164,9 @@ public class Slime extends Mob implements Enemy { +@@ -132,9 +165,9 @@ public class Slime extends Mob implements Enemy { this.entityData.set(ID_SIZE, i); this.reapplyPosition(); this.refreshDimensions(); @@ -1497,45 +1335,8 @@ index e46fd8c9f9966dab8b27004db0bc7028e95dedf2..5af9f8182fa8bc3720cf30ed073ecc80 if (resetHealth) { this.setHealth(this.getMaxHealth()); } -diff --git a/net/minecraft/world/entity/monster/Spider.java b/net/minecraft/world/entity/monster/Spider.java -index 6237bbbed2aa643755e8e58a5fdd2f6d75f717ac..580047cd6a803ffdf6a1887d32731ddfd23316b9 100644 ---- a/net/minecraft/world/entity/monster/Spider.java -+++ b/net/minecraft/world/entity/monster/Spider.java -@@ -67,6 +67,14 @@ public class Spider extends Monster { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.spiderMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.spiderScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/monster/Stray.java b/net/minecraft/world/entity/monster/Stray.java -index b1013db104186ba079a51c6c30bb7f89b92da3d7..1be523e22b2fa0f9546eb272f3f68a896a0575c9 100644 ---- a/net/minecraft/world/entity/monster/Stray.java -+++ b/net/minecraft/world/entity/monster/Stray.java -@@ -39,6 +39,13 @@ public class Stray extends AbstractSkeleton { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.strayMaxHealth); -+ } -+ // Purpur end - Configurable entity base attributes -+ - public static boolean checkStraySpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index f03ec1e8985f2c81ad2ec13d136e4c0362be4fff..5d41885ceb7145a516a398da0d7553faeb386710 100644 +index 46121b018c5dd87d888a3724df12a9af0d007772..3308e954c8f6deff89c6df0af01f7774e36b0385 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -109,6 +109,14 @@ public class Strider extends Animal implements ItemSteerable { @@ -1554,10 +1355,10 @@ index f03ec1e8985f2c81ad2ec13d136e4c0362be4fff..5d41885ceb7145a516a398da0d7553fa EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random ) { diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index 99fe282067a2aa54d8fdb72c226d27cab6966b6c..09211a8a5b893f878ad173c4ab71393c8f309f58 100644 +index d567e2b9843606c36a61c83a3a4e2d181f3eefd9..32759864a8ff0c4e28ce80ae8906cbcf1927094e 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -104,6 +104,14 @@ public class Vex extends Monster implements TraceableEntity { +@@ -102,6 +102,14 @@ public class Vex extends Monster implements TraceableEntity { } // Purpur end - Ridables @@ -1572,27 +1373,8 @@ index 99fe282067a2aa54d8fdb72c226d27cab6966b6c..09211a8a5b893f878ad173c4ab71393c @Override public boolean isFlapping() { return this.tickCount % TICKS_PER_FLAP == 0; -diff --git a/net/minecraft/world/entity/monster/Vindicator.java b/net/minecraft/world/entity/monster/Vindicator.java -index c584a404838d5f8a916a27a74b4f4e8e3d5c1b1d..fdaf024a27825844105ef62baddf30e3b4412d28 100644 ---- a/net/minecraft/world/entity/monster/Vindicator.java -+++ b/net/minecraft/world/entity/monster/Vindicator.java -@@ -73,6 +73,14 @@ public class Vindicator extends AbstractIllager { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.vindicatorMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.vindicatorScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java -index 8c88c5a719d15a90ba449eccf9fd568e1d2c4e8d..35dc597e5b0e703319eb5ff31bde0960b224fc40 100644 +index bcb136e71db2272dc107304b52be41f83d6772b7..3c3c258d4cc7cf7376d0d3ad0794ec3611ab81ce 100644 --- a/net/minecraft/world/entity/monster/Witch.java +++ b/net/minecraft/world/entity/monster/Witch.java @@ -74,6 +74,14 @@ public class Witch extends Raider implements RangedAttackMob { @@ -1610,27 +1392,8 @@ index 8c88c5a719d15a90ba449eccf9fd568e1d2c4e8d..35dc597e5b0e703319eb5ff31bde0960 @Override protected void registerGoals() { super.registerGoals(); -diff --git a/net/minecraft/world/entity/monster/WitherSkeleton.java b/net/minecraft/world/entity/monster/WitherSkeleton.java -index 7061a0ae68ed28ea72335bb5eab013a6554abc07..4d4e04d9fb5b68897ffa6f299bd2009bb397da3d 100644 ---- a/net/minecraft/world/entity/monster/WitherSkeleton.java -+++ b/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -51,6 +51,14 @@ public class WitherSkeleton extends AbstractSkeleton { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.witherSkeletonMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.witherSkeletonScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index cab7d33f40eacdb0ba8a7058699eb2548e364524..e7e840ba5383c28e0167e7dd032359403ae3224a 100644 +index c4f009357e416ed4052e058d8bf3b8c3e9dfd4ae..e0192a13b8d7131024471569bf34329ba0f28287 100644 --- a/net/minecraft/world/entity/monster/Zoglin.java +++ b/net/minecraft/world/entity/monster/Zoglin.java @@ -104,6 +104,14 @@ public class Zoglin extends Monster implements HoglinBase { @@ -1648,87 +1411,8 @@ index cab7d33f40eacdb0ba8a7058699eb2548e364524..e7e840ba5383c28e0167e7dd03235940 @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index a2ee621ba8b242a4e4e68c3a0a1d8e63c1421c3f..c0bfb7fda27fe6da33918f69f4d50d2fb2b66063 100644 ---- a/net/minecraft/world/entity/monster/Zombie.java -+++ b/net/minecraft/world/entity/monster/Zombie.java -@@ -120,6 +120,14 @@ public class Zombie extends Monster { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zombieScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -632,7 +640,7 @@ public class Zombie extends Monster { - } - - protected void randomizeReinforcementsChance() { -- this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * 0.1F); -+ this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieSpawnReinforcements); // Purpur - Configurable entity base attributes - } - - class ZombieAttackTurtleEggGoal extends RemoveBlockGoal { -diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index f460df654393c0bd2e27b9fd96786d2e3fa5669e..bb716fb7d19568dbe51af161c3b1543ba6f5169c 100644 ---- a/net/minecraft/world/entity/monster/ZombieVillager.java -+++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -92,6 +92,18 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieVillagerMaxHealth); -+ } -+ -+ @Override -+ protected void randomizeReinforcementsChance() { -+ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieVillagerSpawnReinforcements); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index d4f036c7d4b6652c5585f1ce5af9b26f9ed5b856..b78ba21e6aa753e3df6545432038daa0070fa7b7 100644 ---- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java -+++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -81,6 +81,14 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - } - // Purpur end - Ridables - -+ // Purpur start - Configurable entity base attributes -+ @Override -+ public void initAttributes() { -+ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombifiedPiglinMaxHealth); -+ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zombifiedPiglinScale); -+ } -+ // Purpur end - Configurable entity base attributes -+ - @Override - public void setPersistentAngerTarget(@Nullable UUID target) { - this.persistentAngerTarget = target; -@@ -266,7 +274,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - - @Override - protected void randomizeReinforcementsChance() { -- this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(0.0); -+ this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombifiedPiglinSpawnReinforcements); // Purpur - Configurable entity base attributes - } - - @Nullable diff --git a/net/minecraft/world/entity/monster/creaking/Creaking.java b/net/minecraft/world/entity/monster/creaking/Creaking.java -index 86379fce8045722584736f1b39707f3d9a1fc4f4..6ab590b428e1a694b2538c53fabae9297b58b868 100644 +index 01d3d638e194ec5e812eea0ab96b100f4752ea18..a84edd4953e59daed6816531545a6ec1c914bce6 100644 --- a/net/minecraft/world/entity/monster/creaking/Creaking.java +++ b/net/minecraft/world/entity/monster/creaking/Creaking.java @@ -126,6 +126,14 @@ public class Creaking extends Monster { @@ -1747,10 +1431,10 @@ index 86379fce8045722584736f1b39707f3d9a1fc4f4..6ab590b428e1a694b2538c53fabae929 protected BodyRotationControl createBodyControl() { return new Creaking.CreakingBodyRotationControl(this); diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 9f4ef9292e89565c3de0d96bcc3c4c48d3c53dff..facab39612157cdc39bb7d8efad6e90d4fb7d001 100644 +index c84f009cb0498e9c1898e310f19cff80ec6989ea..baf81e1919e64af9d6da0a49b19e5f34cf962a79 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -113,6 +113,14 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -114,6 +114,14 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { } // Purpur end - Ridables @@ -1765,11 +1449,89 @@ index 9f4ef9292e89565c3de0d96bcc3c4c48d3c53dff..facab39612157cdc39bb7d8efad6e90d @VisibleForTesting public void setTimeInOverworld(int timeInOverworld) { this.timeInOverworld = timeInOverworld; +diff --git a/net/minecraft/world/entity/monster/illager/Evoker.java b/net/minecraft/world/entity/monster/illager/Evoker.java +index e40434d24c7a9ffe76c3410601942d0c8a963e30..46f79ed345ec51125364b49b244d6d005a3e64ae 100644 +--- a/net/minecraft/world/entity/monster/illager/Evoker.java ++++ b/net/minecraft/world/entity/monster/illager/Evoker.java +@@ -66,6 +66,14 @@ public class Evoker extends SpellcasterIllager { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.evokerMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.evokerScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/illager/Illusioner.java b/net/minecraft/world/entity/monster/illager/Illusioner.java +index 8a80c202752f56ba174c00531993795a4e621910..8fa53cccb73b2d8c599c898f298681735007d2a0 100644 +--- a/net/minecraft/world/entity/monster/illager/Illusioner.java ++++ b/net/minecraft/world/entity/monster/illager/Illusioner.java +@@ -76,6 +76,16 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ protected void initAttributes() { ++ this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(this.level().purpurConfig.illusionerMovementSpeed); ++ this.getAttribute(Attributes.FOLLOW_RANGE).setBaseValue(this.level().purpurConfig.illusionerFollowRange); ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.illusionerMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.illusionerScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/illager/Pillager.java b/net/minecraft/world/entity/monster/illager/Pillager.java +index 0b97c4fe89c8549841cbb79ecb9383a9be7a44af..1e43c69366287c7a191a6f8e3a7d5459743f07a2 100644 +--- a/net/minecraft/world/entity/monster/illager/Pillager.java ++++ b/net/minecraft/world/entity/monster/illager/Pillager.java +@@ -82,6 +82,14 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.pillagerMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.pillagerScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/illager/Vindicator.java b/net/minecraft/world/entity/monster/illager/Vindicator.java +index 4162e7ee482829f0c5276a31d44ed4c5ee24c3cf..5f3857186e86e27fe237c62cec4af13ebf58debe 100644 +--- a/net/minecraft/world/entity/monster/illager/Vindicator.java ++++ b/net/minecraft/world/entity/monster/illager/Vindicator.java +@@ -74,6 +74,14 @@ public class Vindicator extends AbstractIllager { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.vindicatorMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.vindicatorScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index a74268846a160aa2e2e8688b1562216c2e248726..471d4d375eb437a42361f60e27919c209221d743 100644 +index a42b84611836b970d0d7ddb602bd04d9ec850712..98241af88cc961470e07df47d128d8912338bd44 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -153,6 +153,14 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -158,6 +158,14 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento } // Purpur end - Ridables @@ -1785,7 +1547,7 @@ index a74268846a160aa2e2e8688b1562216c2e248726..471d4d375eb437a42361f60e27919c20 protected void addAdditionalSaveData(ValueOutput output) { super.addAdditionalSaveData(output); diff --git a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index e1b1a909c7e92c5fa5e8f9c155bc57290ef6667b..31e38737806098795de0e87fbcaf60d4ab83ea6e 100644 +index e33809e9ccc4a65909f1c12ec4b0fdc4050aeee7..3d34bef7ffe9e66e77e3fc10b2c5869d98a4a5c9 100644 --- a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java @@ -82,6 +82,14 @@ public class PiglinBrute extends AbstractPiglin { @@ -1803,10 +1565,248 @@ index e1b1a909c7e92c5fa5e8f9c155bc57290ef6667b..31e38737806098795de0e87fbcaf60d4 public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) -diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 7f9bd5695c960e88b9f59af4b67849db9c4ba10b..16c2db7705c594ba10af274c4f5fdd1d5623c6ae 100644 ---- a/net/minecraft/world/entity/npc/Villager.java -+++ b/net/minecraft/world/entity/npc/Villager.java +diff --git a/net/minecraft/world/entity/monster/skeleton/Bogged.java b/net/minecraft/world/entity/monster/skeleton/Bogged.java +index 10e66643a918184d858a4e6c9de7a6c2664fbcaf..f1e9cec85ce911a50bb83eff9228d6b98aa00d44 100644 +--- a/net/minecraft/world/entity/monster/skeleton/Bogged.java ++++ b/net/minecraft/world/entity/monster/skeleton/Bogged.java +@@ -58,6 +58,14 @@ public class Bogged extends AbstractSkeleton implements Shearable { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.boggedMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.boggedScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java +index 7f8298892565b073373ad68f9c1399a9c565c29a..96d989cffc6ff72954ed92e2535c72992d489372 100644 +--- a/net/minecraft/world/entity/monster/skeleton/Skeleton.java ++++ b/net/minecraft/world/entity/monster/skeleton/Skeleton.java +@@ -43,6 +43,13 @@ public class Skeleton extends AbstractSkeleton { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.skeletonMaxHealth); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java +index 23ceecffe8f1b758433e02b61cae421c518cc841..575f30cc9a6166a4e0733cc33e8b5814acb92660 100644 +--- a/net/minecraft/world/entity/monster/skeleton/Stray.java ++++ b/net/minecraft/world/entity/monster/skeleton/Stray.java +@@ -40,6 +40,13 @@ public class Stray extends AbstractSkeleton { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.strayMaxHealth); ++ } ++ // Purpur end - Configurable entity base attributes ++ + public static boolean checkStraySpawnRules( + EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { +diff --git a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java +index d49200718e7fab29ce5e55278b7584458bfb10e7..f38bb54c0f5d7797179e5e75eb8092baea7b9dcb 100644 +--- a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java ++++ b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java +@@ -51,6 +51,14 @@ public class WitherSkeleton extends AbstractSkeleton { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.witherSkeletonMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.witherSkeletonScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); +diff --git a/net/minecraft/world/entity/monster/spider/CaveSpider.java b/net/minecraft/world/entity/monster/spider/CaveSpider.java +index 17a9b046ccd8de37aa79501f7556a5a816dfa90f..a1391173cc4997df723c59f176726dde88491978 100644 +--- a/net/minecraft/world/entity/monster/spider/CaveSpider.java ++++ b/net/minecraft/world/entity/monster/spider/CaveSpider.java +@@ -43,6 +43,14 @@ public class CaveSpider extends Spider { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.caveSpiderMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.caveSpiderScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + public boolean doHurtTarget(ServerLevel level, Entity target) { + if (super.doHurtTarget(level, target)) { +diff --git a/net/minecraft/world/entity/monster/spider/Spider.java b/net/minecraft/world/entity/monster/spider/Spider.java +index 7a8b9c83490a05629e4996844a575ba4c7e9f156..6a9c807ed50dab4b65787d9f7269385103fa5f26 100644 +--- a/net/minecraft/world/entity/monster/spider/Spider.java ++++ b/net/minecraft/world/entity/monster/spider/Spider.java +@@ -69,6 +69,14 @@ public class Spider extends Monster { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.spiderMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.spiderScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/monster/zombie/Drowned.java b/net/minecraft/world/entity/monster/zombie/Drowned.java +index 2c637796399a9b33e03e6e99618a28bf55f36110..0b6d2bcec8506686eb6e0aaeb14870c14bd84e9d 100644 +--- a/net/minecraft/world/entity/monster/zombie/Drowned.java ++++ b/net/minecraft/world/entity/monster/zombie/Drowned.java +@@ -96,6 +96,19 @@ public class Drowned extends Zombie implements RangedAttackMob { + return new AmphibiousPathNavigation(this, level); + } + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.drownedMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.drownedScale); ++ } ++ ++ @Override ++ protected void randomizeReinforcementsChance() { ++ this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.drownedSpawnReinforcements); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void addBehaviourGoals() { + this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0)); +diff --git a/net/minecraft/world/entity/monster/zombie/Husk.java b/net/minecraft/world/entity/monster/zombie/Husk.java +index f18ac33d31ae23db02654658840b89ba03736bf3..03270138e6fae7ee28f958cafee5b74b18dce355 100644 +--- a/net/minecraft/world/entity/monster/zombie/Husk.java ++++ b/net/minecraft/world/entity/monster/zombie/Husk.java +@@ -46,6 +46,18 @@ public class Husk extends Zombie { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.huskMaxHealth); ++ } ++ ++ @Override ++ protected void randomizeReinforcementsChance() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.huskSpawnReinforcements); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + public boolean isSunSensitive() { + return false; +diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java +index b2d322bee9343079c0c21cc7b47493df9cfd861e..d873ca9873e95f3a5869cb63a93b0643a9c867dc 100644 +--- a/net/minecraft/world/entity/monster/zombie/Zombie.java ++++ b/net/minecraft/world/entity/monster/zombie/Zombie.java +@@ -120,6 +120,14 @@ public class Zombie extends Monster { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zombieScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables +@@ -604,7 +612,7 @@ public class Zombie extends Monster { + } + + protected void randomizeReinforcementsChance() { +- this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * 0.1F); ++ this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieSpawnReinforcements); // Purpur - Configurable entity base attributes + } + + class ZombieAttackTurtleEggGoal extends RemoveBlockGoal { +diff --git a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +index 65fa64cc24b6968c6f09a78d5f00750587bf9ef0..8c7eb8518a845efb344eba02e9fe804a5dcd5cb5 100644 +--- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java ++++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +@@ -89,6 +89,18 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombieVillagerMaxHealth); ++ } ++ ++ @Override ++ protected void randomizeReinforcementsChance() { ++ this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieVillagerSpawnReinforcements); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +index e2c5301a465e28cea057f9afec7e9d78090e1c9e..3ff8c95075f9d25c3a2e4160ee6d18057838a7b5 100644 +--- a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java ++++ b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +@@ -81,6 +81,14 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + } + // Purpur end - Ridables + ++ // Purpur start - Configurable entity base attributes ++ @Override ++ public void initAttributes() { ++ this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.zombifiedPiglinMaxHealth); ++ this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.zombifiedPiglinScale); ++ } ++ // Purpur end - Configurable entity base attributes ++ + @Override + protected void addBehaviourGoals() { + this.goalSelector.addGoal(1, new SpearUseGoal<>(this, 1.0, 1.0, 10.0F, 2.0F)); +@@ -267,7 +275,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + + @Override + protected void randomizeReinforcementsChance() { +- this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(0.0); ++ this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombifiedPiglinSpawnReinforcements); // Purpur - Configurable entity base attributes + } + + @Override +diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java +index 4b4acd05ab94d5beadd20989b39b267ecb56ad8b..2e4e5164ee59ee45ce56e39c305c200a636d4046 100644 +--- a/net/minecraft/world/entity/npc/villager/Villager.java ++++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -272,6 +272,14 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } // Purpur end - Ridables @@ -1822,11 +1822,11 @@ index 7f9bd5695c960e88b9f59af4b67849db9c4ba10b..16c2db7705c594ba10af274c4f5fdd1d @Override public Brain getBrain() { return (Brain)super.getBrain(); -diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java -index 5372f9cef4667a11b4e4447b1bacd7c232b6b0ad..b06ea793e0008c68d85d8112415fbc011131984d 100644 ---- a/net/minecraft/world/entity/npc/WanderingTrader.java -+++ b/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -84,6 +84,13 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +index 5c7da654ef967356173a9d85a8675a7dc61ef395..9d5dbaeafd899594425547fc58b87a1d0a52066e 100644 +--- a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java ++++ b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +@@ -85,6 +85,13 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over } // Purpur end - Ridables diff --git a/purpur-server/minecraft-patches/unapplied-features/0003-Barrels-and-enderchests-6-rows.patch b/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch similarity index 95% rename from purpur-server/minecraft-patches/unapplied-features/0003-Barrels-and-enderchests-6-rows.patch rename to purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch index 621f9352d..638bae2f4 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0003-Barrels-and-enderchests-6-rows.patch +++ b/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Barrels and enderchests 6 rows diff --git a/net/minecraft/server/players/PlayerList.java b/net/minecraft/server/players/PlayerList.java -index 0c3451caa323ce2553c0d7ee00e7bf8cc8766b2c..1328cc6402134042d5890bedaaacf6e9807eb5ec 100644 +index 80986de9222010f01982cfdab58649429d457778..22f768d805bfc1c6e6e50449e1d275c3195036ad 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -883,6 +883,27 @@ public abstract class PlayerList { +@@ -887,6 +887,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper - Add sendOpLevel API @@ -37,10 +37,10 @@ index 0c3451caa323ce2553c0d7ee00e7bf8cc8766b2c..1328cc6402134042d5890bedaaacf6e9 // Paper start - whitelist verify event / login event diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index f279a628d6627080743d9f4c49ff8bfd13494fed..f30cb0815e757b54ba98ac1b226cf657448512e0 100644 +index 4bf98783e7199bc5c7c05c953729523b0b75b2b5..c4039b1ba46ea72c7cd1cbed9e8edbffc5d5e1cc 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -183,6 +183,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -181,6 +181,7 @@ public abstract class Player extends Avatar implements ContainerUser { public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage public int burpDelay = 0; // Purpur - Burp delay public boolean canPortalInstant = false; // Purpur - Add portal permission bypass @@ -84,10 +84,10 @@ index 1fb3a34ea872dec73658fac59743e46ef8db5151..4c3b8d7ba777916ffc5ad0feccffbc76 return new ChestMenu(MenuType.GENERIC_9x6, containerId, playerInventory, container, 6); } diff --git a/net/minecraft/world/inventory/PlayerEnderChestContainer.java b/net/minecraft/world/inventory/PlayerEnderChestContainer.java -index 8cf089874a75735be690ab72a01264bac5ff793d..611f78f93b70674b53c025d9151dacb54af3e803 100644 +index 9749909b8253b432bb2f7fba2cd8ff17a8579b30..2c65c6428cb5925f8505cb0836b359f7e18c64eb 100644 --- a/net/minecraft/world/inventory/PlayerEnderChestContainer.java +++ b/net/minecraft/world/inventory/PlayerEnderChestContainer.java -@@ -27,11 +27,18 @@ public class PlayerEnderChestContainer extends SimpleContainer { +@@ -26,11 +26,18 @@ public class PlayerEnderChestContainer extends SimpleContainer { } public PlayerEnderChestContainer(Player owner) { @@ -108,7 +108,7 @@ index 8cf089874a75735be690ab72a01264bac5ff793d..611f78f93b70674b53c025d9151dacb5 this.activeChest = enderChestBlockEntity; } diff --git a/net/minecraft/world/level/block/EnderChestBlock.java b/net/minecraft/world/level/block/EnderChestBlock.java -index 4fe246e457bd9befcdcb6e2301bd55e949322d6f..5189125f4a66590b7842d19cd940de659d24c6a4 100644 +index 383e8285d366c7f594b0b4ff55b367970c9b69e4..077edf449d4faa41abafb94ac41dfe822f449d04 100644 --- a/net/minecraft/world/level/block/EnderChestBlock.java +++ b/net/minecraft/world/level/block/EnderChestBlock.java @@ -85,8 +85,8 @@ public class EnderChestBlock extends AbstractChestBlock i diff --git a/purpur-server/minecraft-patches/unapplied-features/0004-Giants-AI-settings.patch b/purpur-server/minecraft-patches/features/0004-Giants-AI-settings.patch similarity index 98% rename from purpur-server/minecraft-patches/unapplied-features/0004-Giants-AI-settings.patch rename to purpur-server/minecraft-patches/features/0004-Giants-AI-settings.patch index c50df5bb9..e698b8295 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0004-Giants-AI-settings.patch +++ b/purpur-server/minecraft-patches/features/0004-Giants-AI-settings.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Giants AI settings diff --git a/net/minecraft/world/entity/monster/Giant.java b/net/minecraft/world/entity/monster/Giant.java -index e673f488bfab9648075857bc40e1339f974a903c..f5565d314ded2145219debc446c7ddcb93b660e9 100644 +index 416bb85fc87b5f9e372f33df8fe27f12e83834b9..e6fb01e4e2146d6c6971d80af0f101d20c03950a 100644 --- a/net/minecraft/world/entity/monster/Giant.java +++ b/net/minecraft/world/entity/monster/Giant.java @@ -30,8 +30,25 @@ public class Giant extends Monster { diff --git a/purpur-server/minecraft-patches/unapplied-features/0005-Chickens-can-retaliate.patch b/purpur-server/minecraft-patches/features/0005-Chickens-can-retaliate.patch similarity index 83% rename from purpur-server/minecraft-patches/unapplied-features/0005-Chickens-can-retaliate.patch rename to purpur-server/minecraft-patches/features/0005-Chickens-can-retaliate.patch index 91143d225..deaa95d09 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0005-Chickens-can-retaliate.patch +++ b/purpur-server/minecraft-patches/features/0005-Chickens-can-retaliate.patch @@ -4,11 +4,11 @@ Date: Sun, 12 Apr 2020 13:19:34 -0500 Subject: [PATCH] Chickens can retaliate -diff --git a/net/minecraft/world/entity/animal/Chicken.java b/net/minecraft/world/entity/animal/Chicken.java -index b4b2cebbc8d4645dec0b1bfe4243426a1e7ccda5..6f6d99c075b3e402742e3c7401dea366f2d871b6 100644 ---- a/net/minecraft/world/entity/animal/Chicken.java -+++ b/net/minecraft/world/entity/animal/Chicken.java -@@ -94,6 +94,11 @@ public class Chicken extends Animal { +diff --git a/net/minecraft/world/entity/animal/chicken/Chicken.java b/net/minecraft/world/entity/animal/chicken/Chicken.java +index bfc5c6639ef1005d2752d5164f3613ddacc46bf1..52a0bf792337e2f1cf11e215b033caae21ee774b 100644 +--- a/net/minecraft/world/entity/animal/chicken/Chicken.java ++++ b/net/minecraft/world/entity/animal/chicken/Chicken.java +@@ -95,6 +95,11 @@ public class Chicken extends Animal { public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.chickenMaxHealth); this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.chickenScale); @@ -20,7 +20,7 @@ index b4b2cebbc8d4645dec0b1bfe4243426a1e7ccda5..6f6d99c075b3e402742e3c7401dea366 } // Purpur end - Configurable entity base attributes -@@ -101,13 +106,21 @@ public class Chicken extends Animal { +@@ -102,13 +107,21 @@ public class Chicken extends Animal { protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables @@ -43,7 +43,7 @@ index b4b2cebbc8d4645dec0b1bfe4243426a1e7ccda5..6f6d99c075b3e402742e3c7401dea366 } @Override -@@ -116,7 +129,7 @@ public class Chicken extends Animal { +@@ -117,7 +130,7 @@ public class Chicken extends Animal { } public static AttributeSupplier.Builder createAttributes() { diff --git a/purpur-server/minecraft-patches/unapplied-features/0006-Minecart-settings-and-WASD-controls.patch b/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch similarity index 88% rename from purpur-server/minecraft-patches/unapplied-features/0006-Minecart-settings-and-WASD-controls.patch rename to purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch index ee9459135..088846069 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0006-Minecart-settings-and-WASD-controls.patch +++ b/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Minecart settings and WASD controls diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 3624c08509131b1acbeaffc8c90f8b52d16d8d52..eb234fa15325d865ccd7c91026f83911a2c422d5 100644 +index 8d32717e8cc3c6880cb9ff10904114269dff7d67..9cb83c71cb0afa8dc862d06ae9da643874ce2c95 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1314,6 +1314,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1306,6 +1306,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } else { // Purpur start - Add boat fall damage config if (damageSource.is(net.minecraft.tags.DamageTypeTags.IS_FALL)) { @@ -17,14 +17,14 @@ index 3624c08509131b1acbeaffc8c90f8b52d16d8d52..eb234fa15325d865ccd7c91026f83911 + return false; + } + // Purpur end - Minecart settings and WASD controls - if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.Boat && !level().purpurConfig.boatsDoFallDamage) { + if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.boat.Boat && !level().purpurConfig.boatsDoFallDamage) { return false; } -diff --git a/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/net/minecraft/world/entity/vehicle/AbstractMinecart.java -index 3454506b2d7ada401600e2adccd462a15bd86723..0c7e3e821183eddce764f066fb8f34f9908623b5 100644 ---- a/net/minecraft/world/entity/vehicle/AbstractMinecart.java -+++ b/net/minecraft/world/entity/vehicle/AbstractMinecart.java -@@ -102,6 +102,10 @@ public abstract class AbstractMinecart extends VehicleEntity { +diff --git a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java +index 1123ec0038552e0b40774f4a433ff325695ea071..48099ae66045b6e78ec52832e3b972ac9c9bc246 100644 +--- a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java ++++ b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java +@@ -105,6 +105,10 @@ public abstract class AbstractMinecart extends VehicleEntity { private double flyingY = 0.95; private double flyingZ = 0.95; public @Nullable Double maxSpeed; @@ -35,7 +35,7 @@ index 3454506b2d7ada401600e2adccd462a15bd86723..0c7e3e821183eddce764f066fb8f34f9 public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API // CraftBukkit end -@@ -110,8 +114,13 @@ public abstract class AbstractMinecart extends VehicleEntity { +@@ -113,8 +117,13 @@ public abstract class AbstractMinecart extends VehicleEntity { this.blocksBuilding = true; if (useExperimentalMovement(level)) { this.behavior = new NewMinecartBehavior(this); @@ -49,7 +49,7 @@ index 3454506b2d7ada401600e2adccd462a15bd86723..0c7e3e821183eddce764f066fb8f34f9 } } -@@ -276,6 +285,14 @@ public abstract class AbstractMinecart extends VehicleEntity { +@@ -278,6 +287,14 @@ public abstract class AbstractMinecart extends VehicleEntity { @Override public void tick() { @@ -64,7 +64,7 @@ index 3454506b2d7ada401600e2adccd462a15bd86723..0c7e3e821183eddce764f066fb8f34f9 // CraftBukkit start double prevX = this.getX(); double prevY = this.getY(); -@@ -389,15 +406,61 @@ public abstract class AbstractMinecart extends VehicleEntity { +@@ -392,15 +409,61 @@ public abstract class AbstractMinecart extends VehicleEntity { this.behavior.moveAlongTrack(level); } @@ -127,7 +127,7 @@ index 3454506b2d7ada401600e2adccd462a15bd86723..0c7e3e821183eddce764f066fb8f34f9 this.move(MoverType.SELF, this.getDeltaMovement()); if (!this.onGround()) { diff --git a/net/minecraft/world/item/MinecartItem.java b/net/minecraft/world/item/MinecartItem.java -index e116ba0c2a1335ad009abc75675bd339dc034bd2..19fb2091ed57f10af52116519a5ac31dd4e9aeb0 100644 +index 3b511139985ea1646661ae0a6bcd1f0e386561e7..3a65e1a0b914d113feb727833803ece8f3b2e020 100644 --- a/net/minecraft/world/item/MinecartItem.java +++ b/net/minecraft/world/item/MinecartItem.java @@ -30,8 +30,9 @@ public class MinecartItem extends Item { diff --git a/purpur-server/minecraft-patches/unapplied-features/0007-Villagers-follow-emerald-blocks.patch b/purpur-server/minecraft-patches/features/0007-Villagers-follow-emerald-blocks.patch similarity index 77% rename from purpur-server/minecraft-patches/unapplied-features/0007-Villagers-follow-emerald-blocks.patch rename to purpur-server/minecraft-patches/features/0007-Villagers-follow-emerald-blocks.patch index 02566bc79..770512a28 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0007-Villagers-follow-emerald-blocks.patch +++ b/purpur-server/minecraft-patches/features/0007-Villagers-follow-emerald-blocks.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Villagers follow emerald blocks diff --git a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -index d9aefe5777fa545d67621bc1ce2ef6a11ca9b27c..48be4530b25d273032ff1a055406c7cca928d678 100644 +index 686776bb00560f9da8838bd5f8dd64aaddfa7a2b..9bc35ca825e300e82d2d108de70622f8f453bff6 100644 --- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -@@ -167,7 +167,7 @@ public class DefaultAttributes { +@@ -173,7 +173,7 @@ public class DefaultAttributes { .put(EntityType.VILLAGER, Villager.createAttributes().build()) .put(EntityType.VINDICATOR, Vindicator.createAttributes().build()) .put(EntityType.WARDEN, Warden.createAttributes().build()) @@ -18,10 +18,10 @@ index d9aefe5777fa545d67621bc1ce2ef6a11ca9b27c..48be4530b25d273032ff1a055406c7cc .put(EntityType.WITHER, WitherBoss.createAttributes().build()) .put(EntityType.WITHER_SKELETON, AbstractSkeleton.createAttributes().build()) diff --git a/net/minecraft/world/entity/ai/goal/TemptGoal.java b/net/minecraft/world/entity/ai/goal/TemptGoal.java -index dae935cc68e2e571d50e56ac8913c099a11cf771..a805c9426630c2c46db9d0dd536f1d16769395d3 100644 +index 18030dc04eb7d7971e457637b5320b1e41665658..1473da28222a4a1d465c5b5d0493fcdac81cd274 100644 --- a/net/minecraft/world/entity/ai/goal/TemptGoal.java +++ b/net/minecraft/world/entity/ai/goal/TemptGoal.java -@@ -71,7 +71,7 @@ public class TemptGoal extends Goal { +@@ -70,7 +70,7 @@ public class TemptGoal extends Goal { } private boolean shouldFollow(LivingEntity entity) { @@ -30,22 +30,22 @@ index dae935cc68e2e571d50e56ac8913c099a11cf771..a805c9426630c2c46db9d0dd536f1d16 } @Override -diff --git a/net/minecraft/world/entity/npc/AbstractVillager.java b/net/minecraft/world/entity/npc/AbstractVillager.java -index 6bb17ecbd93f6ced5436cf75f3695f44eedd4bd9..e60387c4ef2aa0fc35a559d75b1a7c1539dda57b 100644 ---- a/net/minecraft/world/entity/npc/AbstractVillager.java -+++ b/net/minecraft/world/entity/npc/AbstractVillager.java -@@ -35,6 +35,7 @@ import net.minecraft.world.level.storage.ValueOutput; - import net.minecraft.world.phys.Vec3; +diff --git a/net/minecraft/world/entity/npc/villager/AbstractVillager.java b/net/minecraft/world/entity/npc/villager/AbstractVillager.java +index fa8f1ea38192f9ad0a961a53399f295d83af7721..397cf33790494d84d7fc69234eae50ae154b0212 100644 +--- a/net/minecraft/world/entity/npc/villager/AbstractVillager.java ++++ b/net/minecraft/world/entity/npc/villager/AbstractVillager.java +@@ -38,6 +38,7 @@ import net.minecraft.world.phys.Vec3; + import org.jspecify.annotations.Nullable; public abstract class AbstractVillager extends AgeableMob implements InventoryCarrier, Npc, Merchant { + static final net.minecraft.world.item.crafting.Ingredient TEMPT_ITEMS = net.minecraft.world.item.crafting.Ingredient.of(net.minecraft.world.level.block.Blocks.EMERALD_BLOCK.asItem()); // Purpur - Villagers follow emerald blocks private static final EntityDataAccessor DATA_UNHAPPY_COUNTER = SynchedEntityData.defineId(AbstractVillager.class, EntityDataSerializers.INT); public static final int VILLAGER_SLOT_OFFSET = 300; private static final int VILLAGER_INVENTORY_SIZE = 8; -diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 16c2db7705c594ba10af274c4f5fdd1d5623c6ae..4a2fad1d8d6b20932b6be616e8e6b099daf715dd 100644 ---- a/net/minecraft/world/entity/npc/Villager.java -+++ b/net/minecraft/world/entity/npc/Villager.java +diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java +index 2e4e5164ee59ee45ce56e39c305c200a636d4046..bad2d93118b04d5b41626bf75a05cf469d6fd2e8 100644 +--- a/net/minecraft/world/entity/npc/villager/Villager.java ++++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -269,6 +269,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override protected void registerGoals() { @@ -71,11 +71,11 @@ index 16c2db7705c594ba10af274c4f5fdd1d5623c6ae..4a2fad1d8d6b20932b6be616e8e6b099 } public boolean assignProfessionWhenSpawned() { -diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java -index b06ea793e0008c68d85d8112415fbc011131984d..e5a6cc63d29be742be039053c39f983ed9c6a1e1 100644 ---- a/net/minecraft/world/entity/npc/WanderingTrader.java -+++ b/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -88,9 +88,16 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +index 9d5dbaeafd899594425547fc58b87a1d0a52066e..c6c4f4f2a970db7e782181eaca312931b192b0d5 100644 +--- a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java ++++ b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +@@ -89,9 +89,16 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over @Override public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.wanderingTraderMaxHealth); @@ -92,7 +92,7 @@ index b06ea793e0008c68d85d8112415fbc011131984d..e5a6cc63d29be742be039053c39f983e @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); -@@ -125,6 +132,7 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +@@ -126,6 +133,7 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over this.goalSelector.addGoal(1, new PanicGoal(this, 0.5)); this.goalSelector.addGoal(1, new LookAtTradingPlayerGoal(this)); this.goalSelector.addGoal(2, new WanderingTrader.WanderToPositionGoal(this, 2.0, 0.35)); diff --git a/purpur-server/minecraft-patches/unapplied-features/0008-Implement-elytra-settings.patch b/purpur-server/minecraft-patches/features/0008-Implement-elytra-settings.patch similarity index 90% rename from purpur-server/minecraft-patches/unapplied-features/0008-Implement-elytra-settings.patch rename to purpur-server/minecraft-patches/features/0008-Implement-elytra-settings.patch index 804cd1496..648745f2c 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0008-Implement-elytra-settings.patch +++ b/purpur-server/minecraft-patches/features/0008-Implement-elytra-settings.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Implement elytra settings diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index aeaf62b438fccc628ae3e8316d7965cdbea75731..2d0b13f76c2890eeef2c701a17d535e157195b29 100644 +index a2879705bf847dfc1453206746377895beac5b4b..e04320155173caa8ce8f998477f36a6b36de935c 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -3753,7 +3753,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3883,7 +3883,18 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin .filter(equipmentSlot1 -> canGlideUsing(this.getItemBySlot(equipmentSlot1), equipmentSlot1)) .toList(); EquipmentSlot equipmentSlot = Util.getRandom(list, this.random); @@ -29,10 +29,10 @@ index aeaf62b438fccc628ae3e8316d7965cdbea75731..2d0b13f76c2890eeef2c701a17d535e1 this.gameEvent(GameEvent.ELYTRA_GLIDE); diff --git a/net/minecraft/world/item/FireworkRocketItem.java b/net/minecraft/world/item/FireworkRocketItem.java -index f86b0579e707ecfa5c2074ea22bbe383b5e11841..43a6d9bd3a2e301e3957e9933663c3aff43722d6 100644 +index 2c597e20c1ff587f2eadef600bedb9e01b999bbf..1cad4997455ab1a17fc38da06a9ca0ec5c21b062 100644 --- a/net/minecraft/world/item/FireworkRocketItem.java +++ b/net/minecraft/world/item/FireworkRocketItem.java -@@ -72,6 +72,17 @@ public class FireworkRocketItem extends Item implements ProjectileItem { +@@ -73,6 +73,17 @@ public class FireworkRocketItem extends Item implements ProjectileItem { if (player.dropAllLeashConnections(null)) { level.playSound(null, player, SoundEvents.LEAD_BREAK, SoundSource.NEUTRAL, 1.0F, 1.0F); } @@ -51,10 +51,10 @@ index f86b0579e707ecfa5c2074ea22bbe383b5e11841..43a6d9bd3a2e301e3957e9933663c3af itemInHand.shrink(1); // Moved up from below } else { diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index b367b94ba6977b94c7f46c9f02ed6c3fc5284185..e4bcd4a3cbbc8942d52e5f3c7a4fb1572fdef91c 100644 +index 54f1ab1e63064c2b26993db5390f25be9809c5a8..70999b29944c821d8e165333b833fddba66c3f60 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -697,6 +697,14 @@ public final class ItemStack implements DataComponentHolder { +@@ -702,6 +702,14 @@ public final class ItemStack implements DataComponentHolder { org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent(serverPlayer, this); // Paper - Add EntityDamageItemEvent } // CraftBukkit end @@ -70,7 +70,7 @@ index b367b94ba6977b94c7f46c9f02ed6c3fc5284185..e4bcd4a3cbbc8942d52e5f3c7a4fb157 onBreak.accept(item); } diff --git a/net/minecraft/world/item/TridentItem.java b/net/minecraft/world/item/TridentItem.java -index 44b616ad2740d6ba9c8b2579ecd14edde64fffbb..8f7e6ac2ccb845133f6af69d2aac9b8674b1cc56 100644 +index b87861c089f849e855d10c15ede53fd7c9e6a47c..5dcac1c181ce0f811152bb32fd84c39fbcaf812f 100644 --- a/net/minecraft/world/item/TridentItem.java +++ b/net/minecraft/world/item/TridentItem.java @@ -126,6 +126,17 @@ public class TridentItem extends Item implements ProjectileItem { diff --git a/purpur-server/minecraft-patches/unapplied-features/0009-Configurable-jockey-options.patch b/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch similarity index 71% rename from purpur-server/minecraft-patches/unapplied-features/0009-Configurable-jockey-options.patch rename to purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch index 0cced5f4e..5a61ede01 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0009-Configurable-jockey-options.patch +++ b/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch @@ -4,11 +4,11 @@ Date: Thu, 26 Mar 2020 21:39:32 -0500 Subject: [PATCH] Configurable jockey options -diff --git a/net/minecraft/world/entity/monster/Drowned.java b/net/minecraft/world/entity/monster/Drowned.java -index 4037f13778d21461c862c26a0fcc3c08e6d472ae..af8c33c6d8ecbc7c3d8a33fc740adc26a43c08b3 100644 ---- a/net/minecraft/world/entity/monster/Drowned.java -+++ b/net/minecraft/world/entity/monster/Drowned.java -@@ -106,6 +106,23 @@ public class Drowned extends Zombie implements RangedAttackMob { +diff --git a/net/minecraft/world/entity/monster/zombie/Drowned.java b/net/minecraft/world/entity/monster/zombie/Drowned.java +index 0b6d2bcec8506686eb6e0aaeb14870c14bd84e9d..3b1e3e7c1218cbfdfe48db3fad15280f43fd3311 100644 +--- a/net/minecraft/world/entity/monster/zombie/Drowned.java ++++ b/net/minecraft/world/entity/monster/zombie/Drowned.java +@@ -109,6 +109,23 @@ public class Drowned extends Zombie implements RangedAttackMob { } // Purpur end - Configurable entity base attributes @@ -32,11 +32,11 @@ index 4037f13778d21461c862c26a0fcc3c08e6d472ae..af8c33c6d8ecbc7c3d8a33fc740adc26 @Override protected void addBehaviourGoals() { this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0)); -diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java -index 18fde06fce29973871547db5f638ba05638a8b18..d3e1f5debbd34b8afff06498de48299da37c3add 100644 ---- a/net/minecraft/world/entity/monster/Husk.java -+++ b/net/minecraft/world/entity/monster/Husk.java -@@ -50,6 +50,23 @@ public class Husk extends Zombie { +diff --git a/net/minecraft/world/entity/monster/zombie/Husk.java b/net/minecraft/world/entity/monster/zombie/Husk.java +index 03270138e6fae7ee28f958cafee5b74b18dce355..d31145fee0f646d734e90199288b29f07854d066 100644 +--- a/net/minecraft/world/entity/monster/zombie/Husk.java ++++ b/net/minecraft/world/entity/monster/zombie/Husk.java +@@ -58,6 +58,23 @@ public class Husk extends Zombie { } // Purpur end - Configurable entity base attributes @@ -57,13 +57,13 @@ index 18fde06fce29973871547db5f638ba05638a8b18..d3e1f5debbd34b8afff06498de48299d + } + // Purpur end - Configurable jockey options + - public static boolean checkHuskSpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { -diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index c0bfb7fda27fe6da33918f69f4d50d2fb2b66063..3095dfbba2c3e61a550abc7c48e91f5704909e03 100644 ---- a/net/minecraft/world/entity/monster/Zombie.java -+++ b/net/minecraft/world/entity/monster/Zombie.java + @Override + public boolean isSunSensitive() { + return false; +diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java +index d873ca9873e95f3a5869cb63a93b0643a9c867dc..638642628c3dc9fa25d25c589029219c23d1e602 100644 +--- a/net/minecraft/world/entity/monster/zombie/Zombie.java ++++ b/net/minecraft/world/entity/monster/zombie/Zombie.java @@ -128,6 +128,20 @@ public class Zombie extends Monster { } // Purpur end - Configurable entity base attributes @@ -85,7 +85,7 @@ index c0bfb7fda27fe6da33918f69f4d50d2fb2b66063..3095dfbba2c3e61a550abc7c48e91f57 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -557,19 +571,18 @@ public class Zombie extends Monster { +@@ -531,19 +545,18 @@ public class Zombie extends Monster { } if (spawnGroupData instanceof Zombie.ZombieGroupData zombieGroupData) { @@ -111,7 +111,7 @@ index c0bfb7fda27fe6da33918f69f4d50d2fb2b66063..3095dfbba2c3e61a550abc7c48e91f57 Chicken chicken1 = EntityType.CHICKEN.create(this.level(), EntitySpawnReason.JOCKEY); if (chicken1 != null) { chicken1.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F); -@@ -578,6 +591,7 @@ public class Zombie extends Monster { +@@ -552,6 +565,7 @@ public class Zombie extends Monster { this.startRiding(chicken1, false, false); level.addFreshEntity(chicken1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit } @@ -119,11 +119,11 @@ index c0bfb7fda27fe6da33918f69f4d50d2fb2b66063..3095dfbba2c3e61a550abc7c48e91f57 } } } -diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index bb716fb7d19568dbe51af161c3b1543ba6f5169c..cf88072320f46ec9cf2194f8debe05e33702521f 100644 ---- a/net/minecraft/world/entity/monster/ZombieVillager.java -+++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -104,6 +104,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { +diff --git a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +index 8c7eb8518a845efb344eba02e9fe804a5dcd5cb5..a80788fc6c537fb0d1f400819c7910d11aeda8d5 100644 +--- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java ++++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +@@ -101,6 +101,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { } // Purpur end - Configurable entity base attributes @@ -147,10 +147,10 @@ index bb716fb7d19568dbe51af161c3b1543ba6f5169c..cf88072320f46ec9cf2194f8debe05e3 @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index b78ba21e6aa753e3df6545432038daa0070fa7b7..06e2207d7ea554226b02d65c7fb612a87da71caa 100644 ---- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java -+++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java +diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +index 3ff8c95075f9d25c3a2e4160ee6d18057838a7b5..ec39ad6740361774f9ecfda7186cab9d8fac90f2 100644 +--- a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java ++++ b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java @@ -89,6 +89,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { } // Purpur end - Configurable entity base attributes @@ -173,5 +173,5 @@ index b78ba21e6aa753e3df6545432038daa0070fa7b7..06e2207d7ea554226b02d65c7fb612a8 + // Purpur end - Configurable jockey options + @Override - public void setPersistentAngerTarget(@Nullable UUID target) { - this.persistentAngerTarget = target; + protected void addBehaviourGoals() { + this.goalSelector.addGoal(1, new SpearUseGoal<>(this, 1.0, 1.0, 10.0F, 2.0F)); diff --git a/purpur-server/minecraft-patches/unapplied-features/0010-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/purpur-server/minecraft-patches/features/0010-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch similarity index 94% rename from purpur-server/minecraft-patches/unapplied-features/0010-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch rename to purpur-server/minecraft-patches/features/0010-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index 58fbf69ec..b49a87897 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0010-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/purpur-server/minecraft-patches/features/0010-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Phantoms attracted to crystals and crystals shoot phantoms diff --git a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java -index 9503ec9d44a6c0811639b7d0cf504d32fefff58d..ab878a0f789fa0dc3713eedac1bbcebcfc1a7fa5 100644 +index d1c593ccfab7bee4366ee7c56606a230964e3fb7..21d678008fac473dff4c3e10890882ab94d0087c 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java +++ b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java @@ -27,6 +27,12 @@ public class EndCrystal extends Entity { @@ -72,18 +72,18 @@ index 9503ec9d44a6c0811639b7d0cf504d32fefff58d..ab878a0f789fa0dc3713eedac1bbcebc @Override diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index f2af9bd8265d66711c7dcc8ef16893edfe8d918a..824b100154c82d8579833a4bebd7481934ba428a 100644 +index 046d6d3b665d0dbb5403ebe91d18503ec7613936..7077beafe2251fcc4e37578091bfaa02714268b9 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -50,6 +50,7 @@ public class Phantom extends Mob implements Enemy { - @Nullable - public BlockPos anchorPoint; +@@ -49,6 +49,7 @@ public class Phantom extends Mob implements Enemy { + Vec3 moveTargetPoint = Vec3.ZERO; + @Nullable public BlockPos anchorPoint; Phantom.AttackPhase attackPhase = Phantom.AttackPhase.CIRCLE; + Vec3 crystalPosition; // Purpur - Phantoms attracted to crystals and crystals shoot phantoms // Paper start - @Nullable - public java.util.UUID spawningEntity; -@@ -109,6 +110,25 @@ public class Phantom extends Mob implements Enemy { + public java.util.@Nullable UUID spawningEntity; + public boolean shouldBurnInDay = true; +@@ -107,6 +108,25 @@ public class Phantom extends Mob implements Enemy { } // Purpur end - Ridables @@ -109,7 +109,7 @@ index f2af9bd8265d66711c7dcc8ef16893edfe8d918a..824b100154c82d8579833a4bebd74819 @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; -@@ -122,9 +142,15 @@ public class Phantom extends Mob implements Enemy { +@@ -120,9 +140,15 @@ public class Phantom extends Mob implements Enemy { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables @@ -128,7 +128,7 @@ index f2af9bd8265d66711c7dcc8ef16893edfe8d918a..824b100154c82d8579833a4bebd74819 this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -511,6 +537,124 @@ public class Phantom extends Mob implements Enemy { +@@ -506,6 +532,124 @@ public class Phantom extends Mob implements Enemy { } } diff --git a/purpur-server/minecraft-patches/unapplied-features/0011-Phantoms-burn-in-light.patch b/purpur-server/minecraft-patches/features/0011-Phantoms-burn-in-light.patch similarity index 65% rename from purpur-server/minecraft-patches/unapplied-features/0011-Phantoms-burn-in-light.patch rename to purpur-server/minecraft-patches/features/0011-Phantoms-burn-in-light.patch index 858b02024..dd963acc1 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0011-Phantoms-burn-in-light.patch +++ b/purpur-server/minecraft-patches/features/0011-Phantoms-burn-in-light.patch @@ -4,32 +4,35 @@ Date: Sun, 12 Apr 2020 20:41:59 -0700 Subject: [PATCH] Phantoms burn in light +diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java +index d8faed1fc3ead010f0abd8ffdf3428881472a25c..a3569262099dce237c3feb5e29d24bf47f4c1e38 100644 +--- a/net/minecraft/world/entity/Mob.java ++++ b/net/minecraft/world/entity/Mob.java +@@ -581,7 +581,10 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + } + + private void burnUndead() { +- if (this.isAlive() && this.isSunBurnTick()) { ++ // Purpur start - Phantoms burn in light ++ boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this instanceof net.minecraft.world.entity.monster.Phantom && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight; ++ if (this.isAlive() && (this.isSunBurnTick() || burnFromLightSource)) { ++ // Purpur end - Phantoms burn in light + EquipmentSlot equipmentSlot = this.sunProtectionSlot(); + ItemStack itemBySlot = this.getItemBySlot(equipmentSlot); + if (!itemBySlot.isEmpty()) { diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index 824b100154c82d8579833a4bebd7481934ba428a..8ebe339c91d61166078291dc9f5f70dd596cc58f 100644 +index 7077beafe2251fcc4e37578091bfaa02714268b9..e55470432cebddec43a7d63230eb4391a3d42f8e 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -56,6 +56,7 @@ public class Phantom extends Mob implements Enemy { - public java.util.UUID spawningEntity; +@@ -54,6 +54,7 @@ public class Phantom extends Mob implements Enemy { + public java.util.@Nullable UUID spawningEntity; public boolean shouldBurnInDay = true; // Paper end + 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 - Phantoms burn in light public Phantom(EntityType type, Level level) { super(type, level); -@@ -239,7 +240,11 @@ public class Phantom extends Mob implements Enemy { - - @Override - public void aiStep() { -- if (this.isAlive() && this.shouldBurnInDay && this.isSunBurnTick()) { // Paper - shouldBurnInDay API -+ // Purpur start - Phantoms burn in light -+ boolean burnFromDaylight = this.shouldBurnInDay && this.isSunBurnTick() && this.level().purpurConfig.phantomBurnInDaylight; -+ boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight; -+ if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - shouldBurnInDay API -+ // Purpur end - Phantoms burn in light - if (getRider() == null || !this.isControllable()) // Purpur - Ridables - this.igniteForSeconds(8.0F); - } -@@ -371,6 +376,7 @@ public class Phantom extends Mob implements Enemy { +@@ -366,6 +367,7 @@ public class Phantom extends Mob implements Enemy { List nearbyPlayers = serverLevel.getNearbyPlayers( this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0, 64.0, 16.0) ); @@ -37,7 +40,7 @@ index 824b100154c82d8579833a4bebd7481934ba428a..8ebe339c91d61166078291dc9f5f70dd if (!nearbyPlayers.isEmpty()) { nearbyPlayers.sort(Comparator.comparing(Entity::getY).reversed()); -@@ -741,6 +747,12 @@ public class Phantom extends Mob implements Enemy { +@@ -736,6 +738,12 @@ public class Phantom extends Mob implements Enemy { return false; } else if (!target.isAlive()) { return false; diff --git a/purpur-server/minecraft-patches/unapplied-features/0012-Make-entity-breeding-times-configurable.patch b/purpur-server/minecraft-patches/features/0012-Make-entity-breeding-times-configurable.patch similarity index 66% rename from purpur-server/minecraft-patches/unapplied-features/0012-Make-entity-breeding-times-configurable.patch rename to purpur-server/minecraft-patches/features/0012-Make-entity-breeding-times-configurable.patch index 0f7bb1909..5f1c423d8 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0012-Make-entity-breeding-times-configurable.patch +++ b/purpur-server/minecraft-patches/features/0012-Make-entity-breeding-times-configurable.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Make entity breeding times configurable diff --git a/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java b/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java -index da3ab634c608a3e3b636ba2a519b3b9bb97a1659..f67b2f110ff465368e03ff9cf24318a18034e9d8 100644 +index 35aec6c3aa2f09f13954fda67902b3c975f566e3..fff139abc9341f3ab2dac568a922235dc5e81b3e 100644 --- a/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java +++ b/net/minecraft/world/entity/ai/behavior/VillagerMakeLove.java @@ -118,8 +118,10 @@ public class VillagerMakeLove extends Behavior { @@ -22,18 +22,18 @@ index da3ab634c608a3e3b636ba2a519b3b9bb97a1659..f67b2f110ff465368e03ff9cf24318a1 // CraftBukkit end - call EntityBreedEvent level.broadcastEntityEvent(breedOffspring, EntityEvent.LOVE_HEARTS); diff --git a/net/minecraft/world/entity/animal/Animal.java b/net/minecraft/world/entity/animal/Animal.java -index 8ccab236d1b8b00485eb6608778c43c5581641bd..3ad84e5c6ca7eaab196ffe03986c71d2d4c2ab7b 100644 +index ad90b0cce0e0a3e30d882c24a7286b9892ba4214..56979ad8fd7ebb15a6fc4e2144a8bfade4ca2969 100644 --- a/net/minecraft/world/entity/animal/Animal.java +++ b/net/minecraft/world/entity/animal/Animal.java -@@ -42,6 +42,7 @@ public abstract class Animal extends AgeableMob { - @Nullable - public EntityReference loveCause; +@@ -40,6 +40,7 @@ public abstract class Animal extends AgeableMob { + public int inLove = 0; + public @Nullable EntityReference loveCause; public @Nullable ItemStack breedItem; // CraftBukkit - Add breedItem variable + public abstract int getPurpurBreedTime(); // Purpur - Make entity breeding times configurable protected Animal(EntityType type, Level level) { super(type, level); -@@ -268,8 +269,10 @@ public abstract class Animal extends AgeableMob { +@@ -265,8 +266,10 @@ public abstract class Animal extends AgeableMob { player.awardStat(Stats.ANIMALS_BRED); CriteriaTriggers.BRED_ANIMALS.trigger(player, this, animal, baby); } // Paper - Call EntityBreedEvent @@ -46,289 +46,11 @@ index 8ccab236d1b8b00485eb6608778c43c5581641bd..3ad84e5c6ca7eaab196ffe03986c71d2 this.resetLove(); animal.resetLove(); level.broadcastEntityEvent(this, EntityEvent.IN_LOVE_HEARTS); -diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index b8dda3956152af17ce731d337ceb157d94bfb07b..f7d948294efcac1deac559d1fc9453f1dd0de659 100644 ---- a/net/minecraft/world/entity/animal/Bee.java -+++ b/net/minecraft/world/entity/animal/Bee.java -@@ -482,6 +482,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.beeBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - public int getRemainingPersistentAngerTime() { - return this.entityData.get(DATA_REMAINING_ANGER_TIME); -diff --git a/net/minecraft/world/entity/animal/Cat.java b/net/minecraft/world/entity/animal/Cat.java -index 7550a645d7814bc97243088e2d0f366adb081c76..307f62466c9486ffdf8c2991fb805730198f38eb 100644 ---- a/net/minecraft/world/entity/animal/Cat.java -+++ b/net/minecraft/world/entity/animal/Cat.java -@@ -126,6 +126,13 @@ public class Cat extends TamableAnimal { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.catBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - protected void registerGoals() { - this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); -diff --git a/net/minecraft/world/entity/animal/Chicken.java b/net/minecraft/world/entity/animal/Chicken.java -index b5d3d5fc666d04bc18ca5157a3aacc639c2537c8..b65abf395b3d3c10dc20604b670e44c183f5131b 100644 ---- a/net/minecraft/world/entity/animal/Chicken.java -+++ b/net/minecraft/world/entity/animal/Chicken.java -@@ -102,6 +102,13 @@ public class Chicken extends Animal { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.chickenBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/Cow.java b/net/minecraft/world/entity/animal/Cow.java -index e7100834ce813e9814139c6d6e957fce15861ab7..298cbc74a7d26de1cd0fb356ce9e802c0cc3a1ca 100644 ---- a/net/minecraft/world/entity/animal/Cow.java -+++ b/net/minecraft/world/entity/animal/Cow.java -@@ -54,6 +54,13 @@ public class Cow extends AbstractCow { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.cowBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java -index 375ce5de2c041a7e61578c233ca0dc2ef3a588ca..2cdc3fee6dfae173215733cae2f92d7304d3c5d1 100644 ---- a/net/minecraft/world/entity/animal/Fox.java -+++ b/net/minecraft/world/entity/animal/Fox.java -@@ -190,6 +190,13 @@ public class Fox extends Animal { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.foxBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -@@ -995,8 +1002,10 @@ public class Fox extends Animal { - CriteriaTriggers.BRED_ANIMALS.trigger(serverPlayer, this.animal, this.partner, fox); - } - -- this.animal.setAge(6000); -- this.partner.setAge(6000); -+ // Purpur start - Make entity breeding times configurable -+ this.animal.setAge(this.animal.getPurpurBreedTime()); -+ this.partner.setAge(this.partner.getPurpurBreedTime()); -+ // Purpur end - Make entity breeding times configurable - this.animal.resetLove(); - this.partner.resetLove(); - serverLevel.addFreshEntityWithPassengers(fox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason -diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java -index c5a126718c93d01376b73eb1337cfa63d9acd99e..5f7ab269e406e6d6912a58b3b48123d6c4da282c 100644 ---- a/net/minecraft/world/entity/animal/HappyGhast.java -+++ b/net/minecraft/world/entity/animal/HappyGhast.java -@@ -145,6 +145,13 @@ public class HappyGhast extends Animal { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return 6000; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - protected void ageBoundaryReached() { - if (this.isBaby()) { -diff --git a/net/minecraft/world/entity/animal/MushroomCow.java b/net/minecraft/world/entity/animal/MushroomCow.java -index 743faa77525d68181ee38415399bc6078f9360f8..6cbf93991ee375d2051128721a409a3a7a9064e8 100644 ---- a/net/minecraft/world/entity/animal/MushroomCow.java -+++ b/net/minecraft/world/entity/animal/MushroomCow.java -@@ -87,6 +87,13 @@ public class MushroomCow extends AbstractCow implements Shearable { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.mooshroomBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { - return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); -diff --git a/net/minecraft/world/entity/animal/Ocelot.java b/net/minecraft/world/entity/animal/Ocelot.java -index 947c4d4a9f93c3da36ab5912ef362a60bdf75596..f047fa8d33ab6b7e01447f91e6c33e22e9ce9e02 100644 ---- a/net/minecraft/world/entity/animal/Ocelot.java -+++ b/net/minecraft/world/entity/animal/Ocelot.java -@@ -90,6 +90,13 @@ public class Ocelot extends Animal { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.ocelotBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - public boolean isTrusting() { - return this.entityData.get(DATA_TRUSTING); - } -diff --git a/net/minecraft/world/entity/animal/Panda.java b/net/minecraft/world/entity/animal/Panda.java -index 53e4d1d35be13f04267151e1e8f808c5ad796ef5..fbe06479b24fd0e76a063eeac96447fa88c7d45b 100644 ---- a/net/minecraft/world/entity/animal/Panda.java -+++ b/net/minecraft/world/entity/animal/Panda.java -@@ -142,6 +142,13 @@ public class Panda extends Animal { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.pandaBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { - return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); -diff --git a/net/minecraft/world/entity/animal/Parrot.java b/net/minecraft/world/entity/animal/Parrot.java -index 01e2f610e8f0c54917899b54625b17fb0629df67..0749317e7f1a7b54759b9cd335419e7f92362715 100644 ---- a/net/minecraft/world/entity/animal/Parrot.java -+++ b/net/minecraft/world/entity/animal/Parrot.java -@@ -202,6 +202,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return 6000; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Nullable - @Override - public SpawnGroupData finalizeSpawn( -diff --git a/net/minecraft/world/entity/animal/Pig.java b/net/minecraft/world/entity/animal/Pig.java -index 8a8c796377254d47e68d0d8b1c9bdac7d4b99360..5300c3ae50633aa513c25384c1a2084701921cb9 100644 ---- a/net/minecraft/world/entity/animal/Pig.java -+++ b/net/minecraft/world/entity/animal/Pig.java -@@ -91,6 +91,13 @@ public class Pig extends Animal implements ItemSteerable { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.pigBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/PolarBear.java b/net/minecraft/world/entity/animal/PolarBear.java -index 2cf417f3bcf338a3edc4a2f71d8a700aca2e52dc..884137b428a1fe69bb61b9ae05b652357daecc27 100644 ---- a/net/minecraft/world/entity/animal/PolarBear.java -+++ b/net/minecraft/world/entity/animal/PolarBear.java -@@ -125,6 +125,13 @@ public class PolarBear extends Animal implements NeutralMob { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.polarBearBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { -diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java -index 7a2a95bb2fc1b7d2103da8ce7dd7f820af284f4f..78c6ccc6efafb11b42b051cc204341aa2d461307 100644 ---- a/net/minecraft/world/entity/animal/Rabbit.java -+++ b/net/minecraft/world/entity/animal/Rabbit.java -@@ -155,6 +155,13 @@ public class Rabbit extends Animal { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.rabbitBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - public void registerGoals() { - this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/Turtle.java b/net/minecraft/world/entity/animal/Turtle.java -index 047a1b27d4af3d050784241c8a34fdebbd8e1f49..11a5f8d1a424531105436f96a097de6e9745be96 100644 ---- a/net/minecraft/world/entity/animal/Turtle.java -+++ b/net/minecraft/world/entity/animal/Turtle.java -@@ -112,6 +112,13 @@ public class Turtle extends Animal { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.turtleBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - public void setHomePos(BlockPos homePos) { - this.homePos = homePos; - } -@@ -352,8 +359,10 @@ public class Turtle extends Animal { - } - - this.turtle.setHasEgg(true); -- this.animal.setAge(6000); -- this.partner.setAge(6000); -+ // Purpur start - Make entity breeding times configurable -+ this.animal.setAge(this.animal.getPurpurBreedTime()); -+ this.partner.setAge(this.partner.getPurpurBreedTime()); -+ // Purpur end - Make entity breeding times configurable - this.animal.resetLove(); - this.partner.resetLove(); - RandomSource random = this.animal.getRandom(); diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index 17d1a3d7ad33d99a57ea11be467e746b3dc99cbe..cf5e963d3ad0b5e22909a90dfe66d0a74ceff202 100644 +index 1f6b28531127ea2e5b291583f6bb6a236868fbf0..8ae1f8471f35028c1c469dc9cb9eac9b564a5c5e 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -108,6 +108,13 @@ public class Armadillo extends Animal { +@@ -107,6 +107,13 @@ public class Armadillo extends Animal { } // Purpur end - Configurable entity base attributes @@ -343,7 +65,7 @@ index 17d1a3d7ad33d99a57ea11be467e746b3dc99cbe..cf5e963d3ad0b5e22909a90dfe66d0a7 protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 330caf84f0a8e0edff764d4bd34b85b54b9f057f..277e955eabed07bdc50531dfe182de8cb05e56c2 100644 +index 3f9e15685ba52a5b9bd4282ba6de6751296975bf..79dfebbd72424d5a3a13d4ba89a555fdf782e703 100644 --- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -146,6 +146,13 @@ public class Axolotl extends Animal implements Bucketable { @@ -360,8 +82,26 @@ index 330caf84f0a8e0edff764d4bd34b85b54b9f057f..277e955eabed07bdc50531dfe182de8c @Override public float getWalkTargetValue(BlockPos pos, LevelReader level) { return 0.0F; +diff --git a/net/minecraft/world/entity/animal/bee/Bee.java b/net/minecraft/world/entity/animal/bee/Bee.java +index b7d6dc9c2e12a51b1e63947d7b32d592a8c84ebb..e28128ac556a7be1c50e8c95eb68f09dca2f901d 100644 +--- a/net/minecraft/world/entity/animal/bee/Bee.java ++++ b/net/minecraft/world/entity/animal/bee/Bee.java +@@ -479,6 +479,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.beeBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + public long getPersistentAngerEndTime() { + return this.entityData.get(DATA_ANGER_END_TIME); diff --git a/net/minecraft/world/entity/animal/camel/Camel.java b/net/minecraft/world/entity/animal/camel/Camel.java -index 78df0eb0a0b6765406bd0dc041a02b099d86dd60..cc71c575a8fb62c41198c6e1f27bd0e88380f5bc 100644 +index 95e86330e1e973c43e50bd4ac310212b8a057430..842b20242c323572d4c04d3a2d5fe21a54d53ed4 100644 --- a/net/minecraft/world/entity/animal/camel/Camel.java +++ b/net/minecraft/world/entity/animal/camel/Camel.java @@ -97,6 +97,13 @@ public class Camel extends AbstractHorse { @@ -378,8 +118,255 @@ index 78df0eb0a0b6765406bd0dc041a02b099d86dd60..cc71c575a8fb62c41198c6e1f27bd0e8 @Override protected void addAdditionalSaveData(ValueOutput output) { super.addAdditionalSaveData(output); +diff --git a/net/minecraft/world/entity/animal/chicken/Chicken.java b/net/minecraft/world/entity/animal/chicken/Chicken.java +index 52a0bf792337e2f1cf11e215b033caae21ee774b..029fe4ac952d9f56824de346d98b341bd0b9b65f 100644 +--- a/net/minecraft/world/entity/animal/chicken/Chicken.java ++++ b/net/minecraft/world/entity/animal/chicken/Chicken.java +@@ -103,6 +103,13 @@ public class Chicken extends Animal { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.chickenBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/cow/Cow.java b/net/minecraft/world/entity/animal/cow/Cow.java +index 5e5b239ebc774ae66f8c35a725ea917993239ef2..400b0a0a99590e3590cb66724acdc5ba9170f2c4 100644 +--- a/net/minecraft/world/entity/animal/cow/Cow.java ++++ b/net/minecraft/world/entity/animal/cow/Cow.java +@@ -54,6 +54,13 @@ public class Cow extends AbstractCow { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.cowBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/cow/MushroomCow.java b/net/minecraft/world/entity/animal/cow/MushroomCow.java +index 85ad44eb3e64232cf1ea326257078c46288a613a..e2aa027dc7a39fa8a8868a7d153e838113fcf97b 100644 +--- a/net/minecraft/world/entity/animal/cow/MushroomCow.java ++++ b/net/minecraft/world/entity/animal/cow/MushroomCow.java +@@ -85,6 +85,13 @@ public class MushroomCow extends AbstractCow implements Shearable { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.mooshroomBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + public float getWalkTargetValue(BlockPos pos, LevelReader level) { + return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); +diff --git a/net/minecraft/world/entity/animal/equine/Donkey.java b/net/minecraft/world/entity/animal/equine/Donkey.java +index b85d967c7c809683e4576be30ed855941c6e68cc..d74a5cc2a43ef41fd00676bbd17fe4df9edb67ff 100644 +--- a/net/minecraft/world/entity/animal/equine/Donkey.java ++++ b/net/minecraft/world/entity/animal/equine/Donkey.java +@@ -40,6 +40,13 @@ public class Donkey extends AbstractChestedHorse { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.donkeyBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + public SoundEvent getAmbientSound() { + return SoundEvents.DONKEY_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/equine/Horse.java b/net/minecraft/world/entity/animal/equine/Horse.java +index 9a97cd588fb2dc0f393b2c8768f4e45066a34850..ba9df659ed019f9e58991059fe99c1471bfc94d8 100644 +--- a/net/minecraft/world/entity/animal/equine/Horse.java ++++ b/net/minecraft/world/entity/animal/equine/Horse.java +@@ -74,6 +74,13 @@ public class Horse extends AbstractHorse { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.horseBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + protected void randomizeAttributes(RandomSource random) { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); +diff --git a/net/minecraft/world/entity/animal/equine/Llama.java b/net/minecraft/world/entity/animal/equine/Llama.java +index b54a535add643390a6164ab3f4a2fdd475d60162..960e48f5ae63d8c86758d2573510bf481ca4bca0 100644 +--- a/net/minecraft/world/entity/animal/equine/Llama.java ++++ b/net/minecraft/world/entity/animal/equine/Llama.java +@@ -152,6 +152,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.llamaBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + public boolean isTraderLlama() { + return false; + } +diff --git a/net/minecraft/world/entity/animal/equine/Mule.java b/net/minecraft/world/entity/animal/equine/Mule.java +index f49c8a61ac3883f7ff8ad8193ae9ea9136f54c45..180a807026437e949e3f7c3d59864ea328f6f03f 100644 +--- a/net/minecraft/world/entity/animal/equine/Mule.java ++++ b/net/minecraft/world/entity/animal/equine/Mule.java +@@ -39,6 +39,13 @@ public class Mule extends AbstractChestedHorse { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.muleBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + public SoundEvent getAmbientSound() { + return SoundEvents.MULE_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/equine/SkeletonHorse.java b/net/minecraft/world/entity/animal/equine/SkeletonHorse.java +index d8b7b787b98b86d16578abe1cd19321ad2c176c0..af0e326f5ff8fcb82353bac3143103928a6a08e6 100644 +--- a/net/minecraft/world/entity/animal/equine/SkeletonHorse.java ++++ b/net/minecraft/world/entity/animal/equine/SkeletonHorse.java +@@ -67,6 +67,13 @@ public class SkeletonHorse extends AbstractHorse { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return 6000; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + public static AttributeSupplier.Builder createAttributes() { + return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); + } +diff --git a/net/minecraft/world/entity/animal/equine/TraderLlama.java b/net/minecraft/world/entity/animal/equine/TraderLlama.java +index deb0a1eb867daec57a644ce698fe50d79fd8960e..65ac46335d642d5dd8c01623721257a4fd53441d 100644 +--- a/net/minecraft/world/entity/animal/equine/TraderLlama.java ++++ b/net/minecraft/world/entity/animal/equine/TraderLlama.java +@@ -70,6 +70,13 @@ public class TraderLlama extends Llama { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.traderLlamaBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + public boolean isTraderLlama() { + return true; +diff --git a/net/minecraft/world/entity/animal/equine/ZombieHorse.java b/net/minecraft/world/entity/animal/equine/ZombieHorse.java +index 8b8580f8c082a40f958ec61adf32dc7d1485ea68..fa2f18470123f98e336ab5c94bc791e9333356cb 100644 +--- a/net/minecraft/world/entity/animal/equine/ZombieHorse.java ++++ b/net/minecraft/world/entity/animal/equine/ZombieHorse.java +@@ -81,6 +81,13 @@ public class ZombieHorse extends AbstractHorse { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return 6000; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + public static AttributeSupplier.Builder createAttributes() { + return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 25.0); + } +diff --git a/net/minecraft/world/entity/animal/feline/Cat.java b/net/minecraft/world/entity/animal/feline/Cat.java +index b7c17aed96dce39cb03780ff251e0e38c3c6adb1..d0aa698ef99cf3b1926018314b4067cc1cd8ac2a 100644 +--- a/net/minecraft/world/entity/animal/feline/Cat.java ++++ b/net/minecraft/world/entity/animal/feline/Cat.java +@@ -128,6 +128,13 @@ public class Cat extends TamableAnimal { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.catBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + protected void registerGoals() { + this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); +diff --git a/net/minecraft/world/entity/animal/feline/Ocelot.java b/net/minecraft/world/entity/animal/feline/Ocelot.java +index c9a8dcfd1e46f97dee0393db3205049c0db1cefb..bf281fd4c050b87fd277ab68e812ab2dcd3d06aa 100644 +--- a/net/minecraft/world/entity/animal/feline/Ocelot.java ++++ b/net/minecraft/world/entity/animal/feline/Ocelot.java +@@ -91,6 +91,13 @@ public class Ocelot extends Animal { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.ocelotBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + public boolean isTrusting() { + return this.entityData.get(DATA_TRUSTING); + } +diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java +index 6819bcb15ad6c85f41a098a9fdb73ce5a7987d8f..3c2f5e711c013a6f51093e94bc4b5518263607a2 100644 +--- a/net/minecraft/world/entity/animal/fox/Fox.java ++++ b/net/minecraft/world/entity/animal/fox/Fox.java +@@ -197,6 +197,13 @@ public class Fox extends Animal { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.foxBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +@@ -997,8 +1004,10 @@ public class Fox extends Animal { + CriteriaTriggers.BRED_ANIMALS.trigger(serverPlayer, this.animal, this.partner, fox); + } + +- this.animal.setAge(6000); +- this.partner.setAge(6000); ++ // Purpur start - Make entity breeding times configurable ++ this.animal.setAge(this.animal.getPurpurBreedTime()); ++ this.partner.setAge(this.partner.getPurpurBreedTime()); ++ // Purpur end - Make entity breeding times configurable + this.animal.resetLove(); + this.partner.resetLove(); + this.level.addFreshEntityWithPassengers(fox, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason diff --git a/net/minecraft/world/entity/animal/frog/Frog.java b/net/minecraft/world/entity/animal/frog/Frog.java -index 4979ae6dc8f6c2361b443b8bbe90738e4a199200..78863bd593acaa46f33a49fadbd0cdb025074c11 100644 +index 5b4bb6fd100abc569c5da167735a220014bf5d8c..7d6dbdef68b25e774b5a83bb8aeb2535246459aa 100644 --- a/net/minecraft/world/entity/animal/frog/Frog.java +++ b/net/minecraft/world/entity/animal/frog/Frog.java @@ -164,6 +164,13 @@ public class Frog extends Animal { @@ -397,7 +384,7 @@ index 4979ae6dc8f6c2361b443b8bbe90738e4a199200..78863bd593acaa46f33a49fadbd0cdb0 protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index f417e9337a5102d6ec95a934c4126e1ec98a94d8..afcd9d3ea11d94ef811cce71f54f2a718619cc9f 100644 +index 6e4d611c959960e8d13f79704c176b41ea5c12c4..07ba57ae845024e0f2fa03a68e126ec79bfc6b15 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java @@ -132,6 +132,13 @@ public class Goat extends Animal { @@ -414,83 +401,11 @@ index f417e9337a5102d6ec95a934c4126e1ec98a94d8..afcd9d3ea11d94ef811cce71f54f2a71 @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -diff --git a/net/minecraft/world/entity/animal/horse/Donkey.java b/net/minecraft/world/entity/animal/horse/Donkey.java -index 65470905a29f1ae0ea7ac1d29ee108adcbc499c7..293d6059bc5e50b66b23e8e2e1d759e61cb26999 100644 ---- a/net/minecraft/world/entity/animal/horse/Donkey.java -+++ b/net/minecraft/world/entity/animal/horse/Donkey.java -@@ -40,6 +40,13 @@ public class Donkey extends AbstractChestedHorse { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.donkeyBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - public SoundEvent getAmbientSound() { - return SoundEvents.DONKEY_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/Horse.java b/net/minecraft/world/entity/animal/horse/Horse.java -index 78b68881357f1bc1111478bb7c9e4f1ba55e055e..513856b5047842edd501eb6c23c13e3bf10d7249 100644 ---- a/net/minecraft/world/entity/animal/horse/Horse.java -+++ b/net/minecraft/world/entity/animal/horse/Horse.java -@@ -71,6 +71,13 @@ public class Horse extends AbstractHorse { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.horseBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - protected void randomizeAttributes(RandomSource random) { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); -diff --git a/net/minecraft/world/entity/animal/horse/Llama.java b/net/minecraft/world/entity/animal/horse/Llama.java -index d1f1f30486ea5c4785e5c4c0104fa31a2e27521a..df3fd52ed0bc794919ff20c4eb8c561ec2b5ad8f 100644 ---- a/net/minecraft/world/entity/animal/horse/Llama.java -+++ b/net/minecraft/world/entity/animal/horse/Llama.java -@@ -154,6 +154,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.llamaBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - public boolean isTraderLlama() { - return false; - } -diff --git a/net/minecraft/world/entity/animal/horse/Mule.java b/net/minecraft/world/entity/animal/horse/Mule.java -index dc3723c5a0bca9e1023629657f668c7e5f6df4a4..5e6a9467d15e551ab2c8b3e42abd096a85e36037 100644 ---- a/net/minecraft/world/entity/animal/horse/Mule.java -+++ b/net/minecraft/world/entity/animal/horse/Mule.java -@@ -39,6 +39,13 @@ public class Mule extends AbstractChestedHorse { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Make entity breeding times configurable -+ @Override -+ public int getPurpurBreedTime() { -+ return this.level().purpurConfig.muleBreedingTicks; -+ } -+ // Purpur end - Make entity breeding times configurable -+ - @Override - public SoundEvent getAmbientSound() { - return SoundEvents.MULE_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -index 557e06b9002217b7ba5a07399bd71491cb0236c6..024591d5ffd396391864554e7b532910d465c30a 100644 ---- a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -+++ b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -@@ -66,6 +66,13 @@ public class SkeletonHorse extends AbstractHorse { +diff --git a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +index 7f45de1bbabc711eaf9d9c33afac47687b75da45..d1b6f627860163b3e977e794720dbf36fcd83001 100644 +--- a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java ++++ b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +@@ -146,6 +146,13 @@ public class HappyGhast extends Animal { } // Purpur end - Configurable entity base attributes @@ -501,32 +416,32 @@ index 557e06b9002217b7ba5a07399bd71491cb0236c6..024591d5ffd396391864554e7b532910 + } + // Purpur end - Make entity breeding times configurable + - public static AttributeSupplier.Builder createAttributes() { - return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); - } -diff --git a/net/minecraft/world/entity/animal/horse/TraderLlama.java b/net/minecraft/world/entity/animal/horse/TraderLlama.java -index a566336bb088286a29eeeca1703addc98922f6e6..8b63470177d60d79fe0b774a301d36701026a803 100644 ---- a/net/minecraft/world/entity/animal/horse/TraderLlama.java -+++ b/net/minecraft/world/entity/animal/horse/TraderLlama.java -@@ -70,6 +70,13 @@ public class TraderLlama extends Llama { + @Override + protected void ageBoundaryReached() { + if (this.isBaby()) { +diff --git a/net/minecraft/world/entity/animal/panda/Panda.java b/net/minecraft/world/entity/animal/panda/Panda.java +index d5060fb8e9a711e6230f2c4950521d8b4f5c01d2..163fe697f57459b36885fa3a18f41370347cab38 100644 +--- a/net/minecraft/world/entity/animal/panda/Panda.java ++++ b/net/minecraft/world/entity/animal/panda/Panda.java +@@ -143,6 +143,13 @@ public class Panda extends Animal { } // Purpur end - Configurable entity base attributes + // Purpur start - Make entity breeding times configurable + @Override + public int getPurpurBreedTime() { -+ return this.level().purpurConfig.traderLlamaBreedingTicks; ++ return this.level().purpurConfig.pandaBreedingTicks; + } + // Purpur end - Make entity breeding times configurable + @Override - public boolean isTraderLlama() { - return true; -diff --git a/net/minecraft/world/entity/animal/horse/ZombieHorse.java b/net/minecraft/world/entity/animal/horse/ZombieHorse.java -index 6684f5dfb7dec101bad15b7ede3d9fd377aacd45..0d6d470b8680aed64d2b208b2ed9b037c96563d9 100644 ---- a/net/minecraft/world/entity/animal/horse/ZombieHorse.java -+++ b/net/minecraft/world/entity/animal/horse/ZombieHorse.java -@@ -62,6 +62,13 @@ public class ZombieHorse extends AbstractHorse { + protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { + return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); +diff --git a/net/minecraft/world/entity/animal/parrot/Parrot.java b/net/minecraft/world/entity/animal/parrot/Parrot.java +index 7480a491533a47882eaf4b36c320adf45ebfb190..0d62046cb33ed750ab27229fe4f0b43c3a1dd5f4 100644 +--- a/net/minecraft/world/entity/animal/parrot/Parrot.java ++++ b/net/minecraft/world/entity/animal/parrot/Parrot.java +@@ -207,6 +207,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { } // Purpur end - Configurable entity base attributes @@ -537,11 +452,65 @@ index 6684f5dfb7dec101bad15b7ede3d9fd377aacd45..0d6d470b8680aed64d2b208b2ed9b037 + } + // Purpur end - Make entity breeding times configurable + - public static AttributeSupplier.Builder createAttributes() { - return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); + @Override + public @Nullable SpawnGroupData finalizeSpawn( + ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData +diff --git a/net/minecraft/world/entity/animal/pig/Pig.java b/net/minecraft/world/entity/animal/pig/Pig.java +index 55a862844907d7663323fb9c8de823aff5109c30..824704bdf2412f142dd260633bc8e56f079f5ea4 100644 +--- a/net/minecraft/world/entity/animal/pig/Pig.java ++++ b/net/minecraft/world/entity/animal/pig/Pig.java +@@ -92,6 +92,13 @@ public class Pig extends Animal implements ItemSteerable { } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.pigBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/polarbear/PolarBear.java b/net/minecraft/world/entity/animal/polarbear/PolarBear.java +index 904e4c641f1892220f263528c65f6f81708399cd..97edd950e2142e73ad947590c99d6d5529cbd44c 100644 +--- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java ++++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java +@@ -126,6 +126,13 @@ public class PolarBear extends Animal implements NeutralMob { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.polarBearBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return EntityType.POLAR_BEAR.create(level, EntitySpawnReason.BREEDING); +diff --git a/net/minecraft/world/entity/animal/rabbit/Rabbit.java b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +index cfbab57dd0527c5e2f17718f3974059eb881c2ea..061418a25d359574c4ff44327082b08b4094ee1c 100644 +--- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java ++++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +@@ -156,6 +156,13 @@ public class Rabbit extends Animal { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.rabbitBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + @Override + public void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/animal/sheep/Sheep.java b/net/minecraft/world/entity/animal/sheep/Sheep.java -index e479dd9e94ee931b6e9001f89dc36406c3dde209..baa18417b0b66f33aa3bb21032cd5816dc0ed800 100644 +index 1d60d35c1330418009f7d1d0b60d263559b68b7f..0e4505474a50d57338c16648cb6049d35455fdc6 100644 --- a/net/minecraft/world/entity/animal/sheep/Sheep.java +++ b/net/minecraft/world/entity/animal/sheep/Sheep.java @@ -88,6 +88,13 @@ public class Sheep extends Animal implements Shearable { @@ -576,11 +545,42 @@ index eb6675394ecc5bba67e0f8bb0220ad92ef2b5e4f..7ef3c94f63c8a25d09e69b818ecdf797 @Override protected void defineSynchedData(SynchedEntityData.Builder builder) { super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/turtle/Turtle.java b/net/minecraft/world/entity/animal/turtle/Turtle.java +index 8d9a1fe887c39588e43e4ccfc46151a033c8ccb7..fce1b1a22e091a1c05650c72e1ceb83e1a1d1ed1 100644 +--- a/net/minecraft/world/entity/animal/turtle/Turtle.java ++++ b/net/minecraft/world/entity/animal/turtle/Turtle.java +@@ -112,6 +112,13 @@ public class Turtle extends Animal { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Make entity breeding times configurable ++ @Override ++ public int getPurpurBreedTime() { ++ return this.level().purpurConfig.turtleBreedingTicks; ++ } ++ // Purpur end - Make entity breeding times configurable ++ + public void setHomePos(BlockPos homePos) { + this.homePos = homePos; + } +@@ -343,8 +350,10 @@ public class Turtle extends Animal { + } + + this.turtle.setHasEgg(true); +- this.animal.setAge(6000); +- this.partner.setAge(6000); ++ // Purpur start - Make entity breeding times configurable ++ this.animal.setAge(this.animal.getPurpurBreedTime()); ++ this.partner.setAge(this.partner.getPurpurBreedTime()); ++ // Purpur end - Make entity breeding times configurable + this.animal.resetLove(); + this.partner.resetLove(); + RandomSource random = this.animal.getRandom(); diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index 826c56281f1452fd1f4f9fba12a1fd169532e8cf..70b14a44f3d504788218b85317bb3812007386b0 100644 +index 7bccee8b5dd689bbff18f34d3afac52bfe34aa42..08a1bafa0e45dbdbf8bdc4d5cb654d080590707d 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -217,6 +217,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -216,6 +216,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Configurable entity base attributes @@ -595,7 +595,7 @@ index 826c56281f1452fd1f4f9fba12a1fd169532e8cf..70b14a44f3d504788218b85317bb3812 protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index 5d41885ceb7145a516a398da0d7553faeb386710..6760c826cf72cc704f54ea0e3d6aaffde4ac22c4 100644 +index 3308e954c8f6deff89c6df0af01f7774e36b0385..ad6515c2dcde0079095c6777f56319e9901850f8 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -117,6 +117,13 @@ public class Strider extends Animal implements ItemSteerable { @@ -613,10 +613,10 @@ index 5d41885ceb7145a516a398da0d7553faeb386710..6760c826cf72cc704f54ea0e3d6aaffd EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random ) { diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index facab39612157cdc39bb7d8efad6e90d4fb7d001..1f5096856ab353e2920003a54f530c952e8988da 100644 +index baf81e1919e64af9d6da0a49b19e5f34cf962a79..4498fe26dff2cdec8e90d6559a66ebe7859195bb 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -121,6 +121,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -122,6 +122,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { } // Purpur end - Configurable entity base attributes diff --git a/purpur-server/minecraft-patches/unapplied-features/0013-Apply-display-names-from-item-forms-of-entities-to-e.patch b/purpur-server/minecraft-patches/features/0013-Apply-display-names-from-item-forms-of-entities-to-e.patch similarity index 84% rename from purpur-server/minecraft-patches/unapplied-features/0013-Apply-display-names-from-item-forms-of-entities-to-e.patch rename to purpur-server/minecraft-patches/features/0013-Apply-display-names-from-item-forms-of-entities-to-e.patch index 2a8af519e..6095f7e7c 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0013-Apply-display-names-from-item-forms-of-entities-to-e.patch +++ b/purpur-server/minecraft-patches/features/0013-Apply-display-names-from-item-forms-of-entities-to-e.patch @@ -6,7 +6,7 @@ Subject: [PATCH] Apply display names from item forms of entities to entities diff --git a/net/minecraft/world/entity/decoration/ArmorStand.java b/net/minecraft/world/entity/decoration/ArmorStand.java -index f329459ad97ed4ea5297455d4741d008acb32750..8ba0e1345852693422e683d6479915ba9c13004a 100644 +index 959037a01841de06767522512b92e96be7c72b56..c7be4713a526171d2c4b9642d28f1a246e294ff7 100644 --- a/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/net/minecraft/world/entity/decoration/ArmorStand.java @@ -451,6 +451,7 @@ public class ArmorStand extends LivingEntity { @@ -18,7 +18,7 @@ index f329459ad97ed4ea5297455d4741d008acb32750..8ba0e1345852693422e683d6479915ba this.drops.add(new DefaultDrop(itemStack, stack -> Block.popResource(this.level(), this.blockPosition(), stack))); // CraftBukkit - add to drops // Paper - Restore vanilla drops behavior return this.brokenByAnything(level, damageSource); // Paper diff --git a/net/minecraft/world/entity/decoration/ItemFrame.java b/net/minecraft/world/entity/decoration/ItemFrame.java -index 1b50d5a1c61fe15d06b3c1880e046c4a674df04e..4c4af42b57a7ed20f445d9247870195bd4e6a733 100644 +index 5f518a7469953f50135ec53d7c6b77b9acbafed9..d5fec174e6accbf93fd70ed1ba64135fb879d0b2 100644 --- a/net/minecraft/world/entity/decoration/ItemFrame.java +++ b/net/minecraft/world/entity/decoration/ItemFrame.java @@ -246,7 +246,11 @@ public class ItemFrame extends HangingEntity { @@ -34,12 +34,12 @@ index 1b50d5a1c61fe15d06b3c1880e046c4a674df04e..4c4af42b57a7ed20f445d9247870195b } if (!item.isEmpty()) { -diff --git a/net/minecraft/world/entity/decoration/Painting.java b/net/minecraft/world/entity/decoration/Painting.java -index 97734dc34678a1f2e651c2229f62312c9a9cd8da..330d94275a7c89a11f9932fab758a1422202504e 100644 ---- a/net/minecraft/world/entity/decoration/Painting.java -+++ b/net/minecraft/world/entity/decoration/Painting.java +diff --git a/net/minecraft/world/entity/decoration/painting/Painting.java b/net/minecraft/world/entity/decoration/painting/Painting.java +index 682d6e8c400e3343815be83d74dafe7f16477ba2..32b7bfec3d169166fb607b68e4abf484756327ee 100644 +--- a/net/minecraft/world/entity/decoration/painting/Painting.java ++++ b/net/minecraft/world/entity/decoration/painting/Painting.java @@ -182,7 +182,11 @@ public class Painting extends HangingEntity { - if (level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { + if (level.getGameRules().get(GameRules.ENTITY_DROPS)) { this.playSound(SoundEvents.PAINTING_BREAK, 1.0F, 1.0F); if (!(entity instanceof Player player && player.hasInfiniteMaterials())) { - this.spawnAtLocation(level, Items.PAINTING); @@ -51,11 +51,11 @@ index 97734dc34678a1f2e651c2229f62312c9a9cd8da..330d94275a7c89a11f9932fab758a142 } } } -diff --git a/net/minecraft/world/entity/vehicle/AbstractBoat.java b/net/minecraft/world/entity/vehicle/AbstractBoat.java -index 2e8b923a97ed33ecc2802a0ac452e86e9f397bda..c5c516ea07949a295792da0ed7b63ea98de933b1 100644 ---- a/net/minecraft/world/entity/vehicle/AbstractBoat.java -+++ b/net/minecraft/world/entity/vehicle/AbstractBoat.java -@@ -821,7 +821,13 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable { +diff --git a/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java b/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java +index d17269c9274bd29c761403138bfc56355c800d9c..e5854af03a58dc26a100feac59357862e46bfeed 100644 +--- a/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java ++++ b/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java +@@ -818,7 +818,13 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable { @Override public final ItemStack getPickResult() { @@ -86,7 +86,7 @@ index 962483d6f7225f13f121141882262d36dacad8cb..89d4bc00898fd8f6d40cda87c04c5983 level.playSound( null, armorStand.getX(), armorStand.getY(), armorStand.getZ(), SoundEvents.ARMOR_STAND_PLACE, SoundSource.BLOCKS, 0.75F, 0.8F diff --git a/net/minecraft/world/item/BoatItem.java b/net/minecraft/world/item/BoatItem.java -index e849d3b8d3cc0203fa7736f88a669c67af699110..fdf09c4fe801a36589f54982b07371d2f9421084 100644 +index a8732056d0086a0932e82f70396a8849bf8d0ee1..2219d5e3e3d1aaa9f729205191a1f549ed662e2e 100644 --- a/net/minecraft/world/item/BoatItem.java +++ b/net/minecraft/world/item/BoatItem.java @@ -63,6 +63,7 @@ public class BoatItem extends Item { @@ -98,7 +98,7 @@ index e849d3b8d3cc0203fa7736f88a669c67af699110..fdf09c4fe801a36589f54982b07371d2 return InteractionResult.FAIL; } else { diff --git a/net/minecraft/world/item/HangingEntityItem.java b/net/minecraft/world/item/HangingEntityItem.java -index 0880db37298f9f338baa76028c132b4bb25f1d42..4a236dd14250bf0f1ce63e67349a4c48f104420c 100644 +index e9403c7c857bfaf09d8f8851b468aa4431c5be54..ecc890ae91475420215b61311ff959d9c522202d 100644 --- a/net/minecraft/world/item/HangingEntityItem.java +++ b/net/minecraft/world/item/HangingEntityItem.java @@ -59,7 +59,7 @@ public class HangingEntityItem extends Item { diff --git a/purpur-server/minecraft-patches/unapplied-features/0014-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch b/purpur-server/minecraft-patches/features/0014-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch similarity index 87% rename from purpur-server/minecraft-patches/unapplied-features/0014-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch rename to purpur-server/minecraft-patches/features/0014-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch index 4fbf6cb18..499efb9f9 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0014-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch +++ b/purpur-server/minecraft-patches/features/0014-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch @@ -8,10 +8,10 @@ farm Nether Wart. Reimplemented based on a feature of the carpet-extra mod. diff --git a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java -index ed286786bb8b4eee335ad3a601ce3713df36f5a9..7776ad5d87ee8aadc9fcb36fbce62fe868754942 100644 +index 23c9363f03a74a2ddd15ffa1da4e0910dcfe2eb4..83aac5dcc51fbc2cc9ee45c155fb2b5b67293a96 100644 --- a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java +++ b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java -@@ -32,6 +32,7 @@ public class HarvestFarmland extends Behavior { +@@ -31,6 +31,7 @@ public class HarvestFarmland extends Behavior { private long nextOkStartTime; private int timeWorkedSoFar; private final List validFarmlandAroundVillager = Lists.newArrayList(); @@ -19,9 +19,9 @@ index ed286786bb8b4eee335ad3a601ce3713df36f5a9..7776ad5d87ee8aadc9fcb36fbce62fe8 public HarvestFarmland() { super( -@@ -50,9 +51,10 @@ public class HarvestFarmland extends Behavior { +@@ -49,9 +50,10 @@ public class HarvestFarmland extends Behavior { protected boolean checkExtraStartConditions(ServerLevel level, Villager owner) { - if (!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { + if (!level.getGameRules().get(GameRules.MOB_GRIEFING)) { return false; - } else if (!owner.getVillagerData().profession().is(VillagerProfession.FARMER)) { + } else if (!owner.getVillagerData().profession().is(VillagerProfession.FARMER) && !(level.purpurConfig.villagerClericsFarmWarts && owner.getVillagerData().profession().is(VillagerProfession.CLERIC))) { // Purpur - Option for Villager Clerics to farm Nether Wart @@ -31,7 +31,7 @@ index ed286786bb8b4eee335ad3a601ce3713df36f5a9..7776ad5d87ee8aadc9fcb36fbce62fe8 BlockPos.MutableBlockPos mutableBlockPos = owner.blockPosition().mutable(); this.validFarmlandAroundVillager.clear(); -@@ -83,6 +85,7 @@ public class HarvestFarmland extends Behavior { +@@ -81,6 +83,7 @@ public class HarvestFarmland extends Behavior { BlockState blockState = level.getBlockState(pos); Block block = blockState.getBlock(); Block block1 = level.getBlockState(pos.below()).getBlock(); @@ -39,7 +39,7 @@ index ed286786bb8b4eee335ad3a601ce3713df36f5a9..7776ad5d87ee8aadc9fcb36fbce62fe8 return block instanceof CropBlock && ((CropBlock)block).isMaxAge(blockState) || blockState.isAir() && block1 instanceof FarmBlock; } -@@ -109,19 +112,19 @@ public class HarvestFarmland extends Behavior { +@@ -107,19 +110,19 @@ public class HarvestFarmland extends Behavior { BlockState blockState = level.getBlockState(this.aboveFarmlandPos); Block block = blockState.getBlock(); Block block1 = level.getBlockState(this.aboveFarmlandPos.below()).getBlock(); @@ -62,7 +62,7 @@ index ed286786bb8b4eee335ad3a601ce3713df36f5a9..7776ad5d87ee8aadc9fcb36fbce62fe8 BlockState blockState1 = blockItem.getBlock().defaultBlockState(); if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(owner, this.aboveFarmlandPos, blockState1)) { // CraftBukkit level.setBlockAndUpdate(this.aboveFarmlandPos, blockState1); -@@ -136,7 +139,7 @@ public class HarvestFarmland extends Behavior { +@@ -134,7 +137,7 @@ public class HarvestFarmland extends Behavior { this.aboveFarmlandPos.getX(), this.aboveFarmlandPos.getY(), this.aboveFarmlandPos.getZ(), @@ -72,7 +72,7 @@ index ed286786bb8b4eee335ad3a601ce3713df36f5a9..7776ad5d87ee8aadc9fcb36fbce62fe8 1.0F, 1.0F diff --git a/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java b/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java -index 623dd33a85cb67ecb835de18e9aac29f3394ce28..72cca4897f9697573fd6987a5f0d2df52761b8c3 100644 +index 256fb863683d66235db4fb2b65fb1495672a67bf..81145178ba1ef75c441a09ab5f376d0528299ad3 100644 --- a/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java +++ b/net/minecraft/world/entity/ai/behavior/TradeWithVillager.java @@ -59,6 +59,12 @@ public class TradeWithVillager extends Behavior { @@ -89,7 +89,7 @@ index 623dd33a85cb67ecb835de18e9aac29f3394ce28..72cca4897f9697573fd6987a5f0d2df5 throwHalfStack(owner, this.trades, villager); } diff --git a/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java b/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java -index c65f80aadeb27685653f6a4731888c612d4a59d6..bb07aa944ce60ec7db96e2b57bd6c2c862e2f787 100644 +index bb3ac5297860c8af6e213d10fdf5144086e9474b..0e72601781235119d62fe74420153b98edb5ce23 100644 --- a/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java +++ b/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java @@ -79,8 +79,13 @@ public class VillagerGoalPackages { @@ -108,7 +108,7 @@ index c65f80aadeb27685653f6a4731888c612d4a59d6..bb07aa944ce60ec7db96e2b57bd6c2c8 } else { workAtPoi = new WorkAtPoi(); diff --git a/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java b/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java -index f0583076ef62189508a392a76c3fb6b741bbdde9..dc4a9ddb8479e9d0c4895b19d7d677cdd8ad3faa 100644 +index 39a9e9a6f6dfddbf47a7f96150ef832efe61f89e..bcce12389c1cd290066bd86b85355292c22e921a 100644 --- a/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java +++ b/net/minecraft/world/entity/ai/sensing/SecondaryPoiSensor.java @@ -22,6 +22,13 @@ public class SecondaryPoiSensor extends Sensor { @@ -134,12 +134,12 @@ index f0583076ef62189508a392a76c3fb6b741bbdde9..dc4a9ddb8479e9d0c4895b19d7d677cd if (!list.isEmpty()) { brain.setMemory(MemoryModuleType.SECONDARY_JOB_SITE, list); } else { -diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 4a2fad1d8d6b20932b6be616e8e6b099daf715dd..03b4130179b34735243b3c0b86879dbb7d9f9f00 100644 ---- a/net/minecraft/world/entity/npc/Villager.java -+++ b/net/minecraft/world/entity/npc/Villager.java +diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java +index bad2d93118b04d5b41626bf75a05cf469d6fd2e8..810f1dc6506ca037363060aec1c90b9fc1602cd8 100644 +--- a/net/minecraft/world/entity/npc/villager/Villager.java ++++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -315,7 +315,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - villagerBrain.setSchedule(Schedule.VILLAGER_DEFAULT); + villagerBrain.setSchedule(EnvironmentAttributes.VILLAGER_ACTIVITY); villagerBrain.addActivityWithConditions( Activity.WORK, - VillagerGoalPackages.getWorkPackage(holder, 0.5F), @@ -147,7 +147,7 @@ index 4a2fad1d8d6b20932b6be616e8e6b099daf715dd..03b4130179b34735243b3c0b86879dbb ImmutableSet.of(Pair.of(MemoryModuleType.JOB_SITE, MemoryStatus.VALUE_PRESENT)) ); } -@@ -964,7 +964,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -956,7 +956,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public boolean hasFarmSeeds() { @@ -156,10 +156,10 @@ index 4a2fad1d8d6b20932b6be616e8e6b099daf715dd..03b4130179b34735243b3c0b86879dbb } @Override -diff --git a/net/minecraft/world/entity/npc/VillagerProfession.java b/net/minecraft/world/entity/npc/VillagerProfession.java -index 0b7fdbc19f8a977be8168bca198c157fbe90044b..abfc2542a486d5a64bf88eac69f7d9587869d3cf 100644 ---- a/net/minecraft/world/entity/npc/VillagerProfession.java -+++ b/net/minecraft/world/entity/npc/VillagerProfession.java +diff --git a/net/minecraft/world/entity/npc/villager/VillagerProfession.java b/net/minecraft/world/entity/npc/villager/VillagerProfession.java +index 0acfa8f9d2eab00cf0d8b4bc65c3af52046272bd..8f2edbe693a793d31295d035bc01e4c2b7742b4e 100644 +--- a/net/minecraft/world/entity/npc/villager/VillagerProfession.java ++++ b/net/minecraft/world/entity/npc/villager/VillagerProfession.java @@ -103,7 +103,7 @@ public record VillagerProfession( register(registry, ARMORER, PoiTypes.ARMORER, SoundEvents.VILLAGER_WORK_ARMORER); register(registry, BUTCHER, PoiTypes.BUTCHER, SoundEvents.VILLAGER_WORK_BUTCHER); diff --git a/purpur-server/minecraft-patches/unapplied-features/0015-Add-mobGriefing-override-to-everything-affected.patch b/purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch similarity index 55% rename from purpur-server/minecraft-patches/unapplied-features/0015-Add-mobGriefing-override-to-everything-affected.patch rename to purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch index 19d6418e6..97f514e50 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0015-Add-mobGriefing-override-to-everything-affected.patch +++ b/purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch @@ -5,67 +5,67 @@ Subject: [PATCH] Add mobGriefing override to everything affected diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 2d0b13f76c2890eeef2c701a17d535e157195b29..38750906a1e15c1758c4b54eca6be0170047a2d1 100644 +index e04320155173caa8ce8f998477f36a6b36de935c..34d5283bbc76b4b6c335de354fc2edc1046dcfd1 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1950,7 +1950,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1961,7 +1961,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin if (this.level() instanceof ServerLevel serverLevel) { boolean var6 = false; if (this.dead && entitySource instanceof WitherBoss) { // Paper -- if (serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.witherMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected +- if (serverLevel.getGameRules().get(GameRules.MOB_GRIEFING)) { ++ if (serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.witherMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected BlockPos blockPos = this.blockPosition(); BlockState blockState = Blocks.WITHER_ROSE.defaultBlockState(); if (this.level().getBlockState(blockPos).isAir() && blockState.canSurvive(this.level(), blockPos)) { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index bb1d33f759b74174f5c1a45c351a2d2c243c4f03..2d0efa66b33daa78479d01bd5ed8d558f0e0ae2d 100644 +index a3569262099dce237c3feb5e29d24bf47f4c1e38..70807b4a6c94b0231eb541c7121d925d88022ac6 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -554,7 +554,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab && this.canPickUpLoot() && this.isAlive() && !this.dead -- && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.entitiesPickUpLootMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected +- && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING)) { ++ && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.entitiesPickUpLootMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected Vec3i pickupReach = this.getPickupReach(); for (ItemEntity itemEntity : this.level() diff --git a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java -index 7776ad5d87ee8aadc9fcb36fbce62fe868754942..da974278e763df239f834c1d3653919d37787d42 100644 +index 83aac5dcc51fbc2cc9ee45c155fb2b5b67293a96..c68399986583a215da156b9057a61f22cbf6143d 100644 --- a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java +++ b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java -@@ -49,7 +49,7 @@ public class HarvestFarmland extends Behavior { +@@ -48,7 +48,7 @@ public class HarvestFarmland extends Behavior { @Override protected boolean checkExtraStartConditions(ServerLevel level, Villager owner) { -- if (!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.villagerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected +- if (!level.getGameRules().get(GameRules.MOB_GRIEFING)) { ++ if (!level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.villagerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected return false; } else if (!owner.getVillagerData().profession().is(VillagerProfession.FARMER) && !(level.purpurConfig.villagerClericsFarmWarts && owner.getVillagerData().profession().is(VillagerProfession.CLERIC))) { // Purpur - Option for Villager Clerics to farm Nether Wart return false; diff --git a/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java b/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java -index 244c8e54b3456194855a4516c4fceef85a2d3b78..4f01e8c34cbde1fa599ce0b767cc04e9c19b8dcc 100644 +index 3da917a428b9300d839df610e0e9dceb1d0f0668..a43c0d99458e8aff6a0b0a9eee60ed82b75ffdda 100644 --- a/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java +++ b/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java @@ -31,7 +31,7 @@ public class BreakDoorGoal extends DoorInteractGoal { @Override public boolean canUse() { return super.canUse() -- && getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) -+ && getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, this.mob.level().purpurConfig.zombieMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected +- && getServerLevel(this.mob).getGameRules().get(GameRules.MOB_GRIEFING) ++ && getServerLevel(this.mob).getGameRules().get(GameRules.MOB_GRIEFING, this.mob.level().purpurConfig.zombieMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected && this.isValidDifficulty(this.mob.level().getDifficulty()) && !this.isOpen(); } diff --git a/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java -index 713a669799bdc095e9d01542831e604298c4a214..bdb1f17fe4d43fd28511002005d5f8ffc10fde11 100644 +index 087861886eeb55324ffe54bda78e19f83bf33e72..0f0311eb836b8da39651ece499fe4bda44bce178 100644 --- a/net/minecraft/world/entity/ai/goal/EatBlockGoal.java +++ b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java @@ -64,7 +64,7 @@ public class EatBlockGoal extends Goal { BlockPos blockPos = this.mob.blockPosition(); final BlockState blockState = this.level.getBlockState(blockPos); // Paper - fix wrong block state if (IS_EDIBLE.test(blockState)) { // Paper - fix wrong block state -- if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - fix wrong block state -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.level).purpurConfig.sheepMobGriefingOverride))) { // CraftBukkit // Paper - fix wrong block state // Purpur - Add mobGriefing override to everything affected +- if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).getGameRules().get(GameRules.MOB_GRIEFING))) { // CraftBukkit // Paper - fix wrong block state ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos, blockState.getFluidState().createLegacyBlock(), !getServerLevel(this.level).getGameRules().get(GameRules.MOB_GRIEFING, getServerLevel(this.level).purpurConfig.sheepMobGriefingOverride))) { // CraftBukkit // Paper - fix wrong block state // Purpur - Add mobGriefing override to everything affected this.level.destroyBlock(blockPos, false); } @@ -73,306 +73,306 @@ index 713a669799bdc095e9d01542831e604298c4a214..bdb1f17fe4d43fd28511002005d5f8ff } else { BlockPos blockPos1 = blockPos.below(); if (this.level.getBlockState(blockPos1).is(Blocks.GRASS_BLOCK)) { -- if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Paper - Fix wrong block state -+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.level).purpurConfig.sheepMobGriefingOverride))) { // CraftBukkit // Paper - Fix wrong block state // Purpur - Add mobGriefing override to everything affected +- if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).getGameRules().get(GameRules.MOB_GRIEFING))) { // CraftBukkit // Paper - Fix wrong block state ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, blockPos1, Blocks.DIRT.defaultBlockState(), !getServerLevel(this.level).getGameRules().get(GameRules.MOB_GRIEFING, getServerLevel(this.level).purpurConfig.sheepMobGriefingOverride))) { // CraftBukkit // Paper - Fix wrong block state // Purpur - Add mobGriefing override to everything affected this.level.levelEvent(LevelEvent.PARTICLES_DESTROY_BLOCK, blockPos1, Block.getId(Blocks.GRASS_BLOCK.defaultBlockState())); this.level.setBlock(blockPos1, Blocks.DIRT.defaultBlockState(), Block.UPDATE_CLIENTS); } diff --git a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java -index 962c0b327a46cf0c58904466d3bcb608f474c329..72cc1d2cc76dd564b7fd5c797e8e784b9a343d8a 100644 +index 50cc4c462640a9d40abef6245439d71e8c593ae6..83be00350765db043b6bf32e7814d9c7119eacc5 100644 --- a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java +++ b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java @@ -35,7 +35,7 @@ public class RemoveBlockGoal extends MoveToBlockGoal { @Override public boolean canUse() { -- if (!getServerLevel(this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!getServerLevel(this.removerMob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.removerMob).purpurConfig.zombieMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected +- if (!getServerLevel(this.removerMob).getGameRules().get(GameRules.MOB_GRIEFING)) { ++ if (!getServerLevel(this.removerMob).getGameRules().get(GameRules.MOB_GRIEFING, getServerLevel(this.removerMob).purpurConfig.zombieMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected return false; } else if (this.nextStartTick > 0) { this.nextStartTick--; -diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java -index 2cdc3fee6dfae173215733cae2f92d7304d3c5d1..0f32571b193ba48540c283026e5a5d99314951fe 100644 ---- a/net/minecraft/world/entity/animal/Fox.java -+++ b/net/minecraft/world/entity/animal/Fox.java -@@ -1060,7 +1060,7 @@ public class Fox extends Animal { +diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java +index 3c2f5e711c013a6f51093e94bc4b5518263607a2..a0ed30e8ccd41729de8e0ff977a61fa607386640 100644 +--- a/net/minecraft/world/entity/animal/fox/Fox.java ++++ b/net/minecraft/world/entity/animal/fox/Fox.java +@@ -1062,7 +1062,7 @@ public class Fox extends Animal { } protected void onReachedTarget() { -- if (getServerLevel(Fox.this.level()).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (getServerLevel(Fox.this.level()).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(Fox.this.level()).purpurConfig.foxMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected +- if (getServerLevel(Fox.this.level()).getGameRules().get(GameRules.MOB_GRIEFING)) { ++ if (getServerLevel(Fox.this.level()).getGameRules().get(GameRules.MOB_GRIEFING, getServerLevel(Fox.this.level()).purpurConfig.foxMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected BlockState blockState = Fox.this.level().getBlockState(this.blockPos); if (blockState.is(Blocks.SWEET_BERRY_BUSH)) { this.pickSweetBerries(blockState); -diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java -index 78c6ccc6efafb11b42b051cc204341aa2d461307..f45ae44b37b512bf63e719ff15b538431a2c7e7f 100644 ---- a/net/minecraft/world/entity/animal/Rabbit.java -+++ b/net/minecraft/world/entity/animal/Rabbit.java -@@ -650,7 +650,7 @@ public class Rabbit extends Animal { - @Override - public boolean canUse() { - if (this.nextStartTick <= 0) { -- if (!getServerLevel(this.rabbit).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!getServerLevel(this.rabbit).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.rabbit).purpurConfig.rabbitMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected - return false; - } - -diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index d6f2a04cf04090e3cb68f5111d47bff9f1243568..20f73d895bc55581c62283825a6d5296150ac707 100644 ---- a/net/minecraft/world/entity/animal/SnowGolem.java -+++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -136,7 +136,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +diff --git a/net/minecraft/world/entity/animal/golem/SnowGolem.java b/net/minecraft/world/entity/animal/golem/SnowGolem.java +index ab44bc401438d589696d9f25ebaca0fc39648bed..f011369a67809d54230984a22a909bfea44f47f3 100644 +--- a/net/minecraft/world/entity/animal/golem/SnowGolem.java ++++ b/net/minecraft/world/entity/animal/golem/SnowGolem.java +@@ -135,7 +135,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM this.hurtServer(serverLevel, this.damageSources().onFire().knownCause(org.bukkit.event.entity.EntityDamageEvent.DamageCause.MELTING), 1.0F); // CraftBukkit } -- if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.snowGolemMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected +- if (!serverLevel.getGameRules().get(GameRules.MOB_GRIEFING)) { ++ if (!serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.snowGolemMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected return; } +diff --git a/net/minecraft/world/entity/animal/rabbit/Rabbit.java b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +index 061418a25d359574c4ff44327082b08b4094ee1c..66fda64006c0a70ab4502f088637bb6871c3bb37 100644 +--- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java ++++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +@@ -648,7 +648,7 @@ public class Rabbit extends Animal { + @Override + public boolean canUse() { + if (this.nextStartTick <= 0) { +- if (!getServerLevel(this.rabbit).getGameRules().get(GameRules.MOB_GRIEFING)) { ++ if (!getServerLevel(this.rabbit).getGameRules().get(GameRules.MOB_GRIEFING, getServerLevel(this.rabbit).purpurConfig.rabbitMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected + return false; + } + diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 52c959961a13bd3b85a262128b0950c60f96dc2f..bf9c295408902dc02b96e54959231338cd52c29c 100644 +index 844c989fc4e0d131d823bf8a59951f35f30b7641..e14347ccc7b21213801e59fa2e0e47964bc943ad 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -545,7 +545,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -542,7 +542,7 @@ public class EnderDragon extends Mob implements Enemy { BlockPos blockPos = new BlockPos(i, i1, i2); BlockState blockState = level.getBlockState(blockPos); if (!blockState.isAir() && !blockState.is(BlockTags.DRAGON_TRANSPARENT)) { -- if (level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && !blockState.is(BlockTags.DRAGON_IMMUNE)) { -+ if (level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.enderDragonMobGriefingOverride) && !blockState.is(BlockTags.DRAGON_IMMUNE)) { // Purpur - Add mobGriefing override to everything affected +- if (level.getGameRules().get(GameRules.MOB_GRIEFING) && !blockState.is(BlockTags.DRAGON_IMMUNE)) { ++ if (level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.enderDragonMobGriefingOverride) && !blockState.is(BlockTags.DRAGON_IMMUNE)) { // Purpur - Add mobGriefing override to everything affected // CraftBukkit start - Add blocks to list rather than destroying them //flag1 = level.removeBlock(blockPos, false) || flag1; flag1 = true; diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 3b037d2565fb30f68384d2b391f6d8219fdc9732..6d35cce3fde4d0cee5fa1266d831fdf97ad85d35 100644 +index 612df8799b80f1793ab9781212442098633e9d65..73dbc5ae28c5af00a36528e0397ad1c2eed14f2c 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -496,7 +496,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -495,7 +495,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { if (this.destroyBlocksTick > 0) { this.destroyBlocksTick--; -- if (this.destroyBlocksTick == 0 && level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (this.destroyBlocksTick == 0 && level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.witherMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected +- if (this.destroyBlocksTick == 0 && level.getGameRules().get(GameRules.MOB_GRIEFING)) { ++ if (this.destroyBlocksTick == 0 && level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.witherMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected boolean flag = false; int alternativeTarget = Mth.floor(this.getBbWidth() / 2.0F + 1.0F); int floor = Mth.floor(this.getBbHeight()); diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index ae532c1b5f838223d416564eab626a71b2d423e7..0d2fb6a1b4c8e02e40afa612744e259ef3230c0a 100644 +index 29570047bfc78a8993b0bbd7168cb4fe318a6be6..79a1d8f67a22a8fa4a6c3b657e44bb9503687c27 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -513,7 +513,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -509,7 +509,7 @@ public class EnderMan extends Monster implements NeutralMob { public boolean canUse() { if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur - Add enderman and creeper griefing controls return this.enderman.getCarriedBlock() != null -- && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) -+ && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, this.enderman.level().purpurConfig.endermanMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected +- && getServerLevel(this.enderman).getGameRules().get(GameRules.MOB_GRIEFING) ++ && getServerLevel(this.enderman).getGameRules().get(GameRules.MOB_GRIEFING, this.enderman.level().purpurConfig.endermanMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected && this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0; } -@@ -663,7 +663,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -658,7 +658,7 @@ public class EnderMan extends Monster implements NeutralMob { public boolean canUse() { if (!enderman.level().purpurConfig.endermanAllowGriefing) return false; // Purpur - Add enderman and creeper griefing controls return this.enderman.getCarriedBlock() == null -- && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) -+ && getServerLevel(this.enderman).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, this.enderman.level().purpurConfig.endermanMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected +- && getServerLevel(this.enderman).getGameRules().get(GameRules.MOB_GRIEFING) ++ && getServerLevel(this.enderman).getGameRules().get(GameRules.MOB_GRIEFING, this.enderman.level().purpurConfig.endermanMobGriefingOverride) // Purpur - Add mobGriefing override to everything affected && this.enderman.getRandom().nextInt(reducedTickDelay(20)) == 0; } -diff --git a/net/minecraft/world/entity/monster/Evoker.java b/net/minecraft/world/entity/monster/Evoker.java -index a5243b7969fec5d60b94368caf5e962c348c4135..24d104036902b8aaf79325e33d3063ccea29e13e 100644 ---- a/net/minecraft/world/entity/monster/Evoker.java -+++ b/net/minecraft/world/entity/monster/Evoker.java -@@ -306,7 +306,7 @@ public class Evoker extends SpellcasterIllager { - return false; - } else { - ServerLevel serverLevel = getServerLevel(Evoker.this.level()); -- if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ if (!serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.evokerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected - return false; - } else { - List nearbyEntities = serverLevel.getNearbyEntities( diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index 47741944d11b55bcff46bb9abc2a059652a4f86a..0220bb3add91779979cf7591dc1ea18f69f9e7c4 100644 +index c3546b0841aff52ef758b0e8e48c9a70726f412d..c1ae9826d15456762ac0c0ab7380763242fa48de 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -180,7 +180,7 @@ public class Ravager extends Raider { +@@ -179,7 +179,7 @@ public class Ravager extends Raider { + this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1, baseValue, d)); + } - if (this.level() instanceof ServerLevel serverLevel - && this.horizontalCollision -- && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) { -+ && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.ravagerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected +- if (this.level() instanceof ServerLevel serverLevel && this.horizontalCollision && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING)) { ++ if (this.level() instanceof ServerLevel serverLevel && this.horizontalCollision && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.ravagerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected boolean flag = false; AABB aabb = this.getBoundingBox().inflate(0.2); diff --git a/net/minecraft/world/entity/monster/Silverfish.java b/net/minecraft/world/entity/monster/Silverfish.java -index 276f8e8234ed461af57c7fe0b7ea0346c86b9698..d81ed52599cf4cba49726f2ad9da4ce1dab14df1 100644 +index 1df006a0a49038f1e737194e7da8e0b27e6eeb95..3e8e3a6018120576b0773769db7b2037148fae96 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java -@@ -170,7 +170,7 @@ public class Silverfish extends Monster { +@@ -168,7 +168,7 @@ public class Silverfish extends Monster { return false; } else { RandomSource random = this.mob.getRandom(); -- if (getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && random.nextInt(reducedTickDelay(10)) == 0) { -+ if (getServerLevel(this.mob).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(this.mob).purpurConfig.silverfishMobGriefingOverride) && random.nextInt(reducedTickDelay(10)) == 0) { // Purpur - Add mobGriefing override to everything affected +- if (getServerLevel(this.mob).getGameRules().get(GameRules.MOB_GRIEFING) && random.nextInt(reducedTickDelay(10)) == 0) { ++ if (getServerLevel(this.mob).getGameRules().get(GameRules.MOB_GRIEFING, getServerLevel(this.mob).purpurConfig.silverfishMobGriefingOverride) && random.nextInt(reducedTickDelay(10)) == 0) { // Purpur - Add mobGriefing override to everything affected this.selectedDirection = Direction.getRandom(random); BlockPos blockPos = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5, this.mob.getZ()).relative(this.selectedDirection); BlockState blockState = this.mob.level().getBlockState(blockPos); -@@ -247,7 +247,7 @@ public class Silverfish extends Monster { +@@ -245,7 +245,7 @@ public class Silverfish extends Monster { Block block = blockState.getBlock(); if (block instanceof InfestedBlock) { // CraftBukkit start -- BlockState afterState = getServerLevel(level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state -+ BlockState afterState = getServerLevel(level).getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, getServerLevel(level).purpurConfig.silverfishMobGriefingOverride) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state // Purpur - Add mobGriefing override to everything affected +- BlockState afterState = getServerLevel(level).getGameRules().get(GameRules.MOB_GRIEFING) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state ++ BlockState afterState = getServerLevel(level).getGameRules().get(GameRules.MOB_GRIEFING, getServerLevel(level).purpurConfig.silverfishMobGriefingOverride) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(blockPos1)); // Paper - fix wrong block state // Purpur - Add mobGriefing override to everything affected if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockPos1, afterState)) { // Paper - fix wrong block state continue; } +diff --git a/net/minecraft/world/entity/monster/illager/Evoker.java b/net/minecraft/world/entity/monster/illager/Evoker.java +index 46f79ed345ec51125364b49b244d6d005a3e64ae..334786b2c358c41058f2ac4b1fa4b185833cbd84 100644 +--- a/net/minecraft/world/entity/monster/illager/Evoker.java ++++ b/net/minecraft/world/entity/monster/illager/Evoker.java +@@ -306,7 +306,7 @@ public class Evoker extends SpellcasterIllager { + return false; + } else { + ServerLevel serverLevel = getServerLevel(Evoker.this.level()); +- if (!serverLevel.getGameRules().get(GameRules.MOB_GRIEFING)) { ++ if (!serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.evokerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected + return false; + } else { + List nearbyEntities = serverLevel.getNearbyEntities( diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index 471d4d375eb437a42361f60e27919c209221d743..de65ff0bf3de1d20360bc0ebb1cd3dc48c5560fe 100644 +index 98241af88cc961470e07df47d128d8912338bd44..4fccd122a227e5fe80965c37afaa031c4a673978 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -443,7 +443,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -448,7 +448,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override public boolean wantsToPickUp(ServerLevel level, ItemStack stack) { -- return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); -+ return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.piglinMobGriefingOverride) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); // Purpur - Add mobGriefing override to everything affected +- return level.getGameRules().get(GameRules.MOB_GRIEFING) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); ++ return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.piglinMobGriefingOverride) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); // Purpur - Add mobGriefing override to everything affected } protected boolean canReplaceCurrentItem(ItemStack candidate) { -diff --git a/net/minecraft/world/entity/projectile/LargeFireball.java b/net/minecraft/world/entity/projectile/LargeFireball.java -index b782957c118313fcaa80d127291e5b6d614da98a..f92ea082aca3aa75839e8ce0001b0f272d3235ce 100644 ---- a/net/minecraft/world/entity/projectile/LargeFireball.java -+++ b/net/minecraft/world/entity/projectile/LargeFireball.java +diff --git a/net/minecraft/world/entity/projectile/Projectile.java b/net/minecraft/world/entity/projectile/Projectile.java +index 6298e6de25f1dd9ff880a9ad2882dc7ccb2f100c..36479ed544ce812113c9a9c982a74a950cb9b26a 100644 +--- a/net/minecraft/world/entity/projectile/Projectile.java ++++ b/net/minecraft/world/entity/projectile/Projectile.java +@@ -434,7 +434,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { + @Override + public boolean mayInteract(ServerLevel level, BlockPos pos) { + Entity owner = this.getOwner(); +- return owner instanceof Player ? owner.mayInteract(level, pos) : owner == null || level.getGameRules().get(GameRules.MOB_GRIEFING); ++ return owner instanceof Player ? owner.mayInteract(level, pos) : owner == null || level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.projectilesMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected + } + + public boolean mayBreak(ServerLevel level) { +diff --git a/net/minecraft/world/entity/projectile/hurtingprojectile/LargeFireball.java b/net/minecraft/world/entity/projectile/hurtingprojectile/LargeFireball.java +index de0f086da9fe4afa14d2b77f6b0a2c0910745b94..775aa79a0d503217dbe42268f4feccbc2d3e1edb 100644 +--- a/net/minecraft/world/entity/projectile/hurtingprojectile/LargeFireball.java ++++ b/net/minecraft/world/entity/projectile/hurtingprojectile/LargeFireball.java @@ -20,20 +20,20 @@ public class LargeFireball extends Fireball { public LargeFireball(EntityType type, Level level) { super(type, level); -- this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit -+ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // CraftBukkit // Purpur - Add mobGriefing override to everything affected +- this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING); // CraftBukkit ++ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // CraftBukkit // Purpur - Add mobGriefing override to everything affected } public LargeFireball(Level level, LivingEntity owner, Vec3 movement, int explosionPower) { super(EntityType.FIREBALL, owner, movement, level); this.explosionPower = explosionPower; -- this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); // CraftBukkit -+ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // CraftBukkit // Purpur - Add mobGriefing override to everything affected +- this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING); // CraftBukkit ++ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // CraftBukkit // Purpur - Add mobGriefing override to everything affected } @Override protected void onHit(HitResult result) { super.onHit(result); if (this.level() instanceof ServerLevel serverLevel) { -- boolean _boolean = serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); -+ boolean _boolean = serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected +- // boolean flag = serverLevel.getGameRules().get(GameRules.MOB_GRIEFING); // CraftBukkit - baked into fields (see constructor) ++ // boolean flag = serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // CraftBukkit - baked into fields (see constructor) // Purpur - Add mobGriefing override to everything affected // CraftBukkit start - fire ExplosionPrimeEvent org.bukkit.event.entity.ExplosionPrimeEvent event = new org.bukkit.event.entity.ExplosionPrimeEvent((org.bukkit.entity.Explosive) this.getBukkitEntity()); if (event.callEvent()) { -diff --git a/net/minecraft/world/entity/projectile/Projectile.java b/net/minecraft/world/entity/projectile/Projectile.java -index cdb73cab0a64f51d65a7420fdac44455c6c77a48..74f5478c9eb8d0a01a7634980b6003198b8ea50c 100644 ---- a/net/minecraft/world/entity/projectile/Projectile.java -+++ b/net/minecraft/world/entity/projectile/Projectile.java -@@ -436,7 +436,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { - @Override - public boolean mayInteract(ServerLevel level, BlockPos pos) { - Entity owner = this.getOwner(); -- return owner instanceof Player ? owner.mayInteract(level, pos) : owner == null || level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); -+ return owner instanceof Player ? owner.mayInteract(level, pos) : owner == null || level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.projectilesMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected - } - - public boolean mayBreak(ServerLevel level) { -diff --git a/net/minecraft/world/entity/projectile/SmallFireball.java b/net/minecraft/world/entity/projectile/SmallFireball.java -index 78b1fb603fb33700229dc3ce93cd6e316eb95140..9471f4198f9e20de765552bf6a22ca448e669c94 100644 ---- a/net/minecraft/world/entity/projectile/SmallFireball.java -+++ b/net/minecraft/world/entity/projectile/SmallFireball.java +diff --git a/net/minecraft/world/entity/projectile/hurtingprojectile/SmallFireball.java b/net/minecraft/world/entity/projectile/hurtingprojectile/SmallFireball.java +index 043ddaa0e8718f50881d16892eab188aed70f67f..a10617c29098f28c5b5586a43071a47ef17e5744 100644 +--- a/net/minecraft/world/entity/projectile/hurtingprojectile/SmallFireball.java ++++ b/net/minecraft/world/entity/projectile/hurtingprojectile/SmallFireball.java @@ -25,7 +25,7 @@ public class SmallFireball extends Fireball { super(EntityType.SMALL_FIREBALL, owner, movement, level); // CraftBukkit start if (this.getOwner() != null && this.getOwner() instanceof Mob) { -- this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); -+ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected +- this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING); ++ this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.fireballsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected } // CraftBukkit end } diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java -index 8d8315edfb69b062ed5e3d957f4043ec411dd5d7..4d72b60489e9c684905ca251ead011aaa8ce1cdd 100644 +index 298d6749bdd5b6f09530096f8f546d9f46910b19..b03faa7600f182a12c3a739deefc38028cf45615 100644 --- a/net/minecraft/world/entity/raid/Raider.java +++ b/net/minecraft/world/entity/raid/Raider.java -@@ -401,7 +401,7 @@ public abstract class Raider extends PatrollingMonster { +@@ -396,7 +396,7 @@ public abstract class Raider extends PatrollingMonster { } private boolean cannotPickUpBanner() { -- if (!getServerLevel(this.mob).getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING)) return true; // Paper - respect game and entity rules for picking up items -+ if (!getServerLevel(this.mob).getGameRules().getBoolean(net.minecraft.world.level.GameRules.RULE_MOBGRIEFING, this.mob.level().purpurConfig.pillagerMobGriefingOverride)) return true; // Paper - respect game and entity rules for picking up items // Purpur - Add mobGriefing override to everything affected +- if (!getServerLevel(this.mob).getGameRules().get(net.minecraft.world.level.gamerules.GameRules.MOB_GRIEFING)) return true; // Paper - respect game and entity rules for picking up items ++ if (!getServerLevel(this.mob).getGameRules().get(net.minecraft.world.level.gamerules.GameRules.MOB_GRIEFING, this.mob.level().purpurConfig.pillagerMobGriefingOverride)) return true; // Paper - respect game and entity rules for picking up items // Purpur - Add mobGriefing override to everything affected if (!this.mob.hasActiveRaid()) { return true; } else if (this.mob.getCurrentRaid().isOver()) { -diff --git a/net/minecraft/world/level/GameRules.java b/net/minecraft/world/level/GameRules.java -index b159cae4d9c1274de14f3044c9d22a1231c639e5..57fc1c8bb1350dad26a616d2a8530df73fdf38da 100644 ---- a/net/minecraft/world/level/GameRules.java -+++ b/net/minecraft/world/level/GameRules.java -@@ -366,6 +366,13 @@ public class GameRules { - this.getRule(key).setFrom(rule, level); // CraftBukkit - per-world - } - -+ public boolean getBoolean(GameRules.Key key, Boolean gameRuleOverride) { -+ if (gameRuleOverride != null) { -+ return gameRuleOverride; -+ } -+ return this.getBoolean(key); -+ } -+ - public boolean getBoolean(GameRules.Key key) { - return this.getRule(key).get(); - } diff --git a/net/minecraft/world/level/block/CropBlock.java b/net/minecraft/world/level/block/CropBlock.java -index 4d7e01fea4bac6cf71cbca3deae632df0f738497..c5cbaa9ece0d304503998a4bca5e3527e0ea0601 100644 +index 4ad9b4afeb6958cba98d8413b3371754730741e5..0b748fac353d6a8b5351ad67df7d239d3efa43b0 100644 --- a/net/minecraft/world/level/block/CropBlock.java +++ b/net/minecraft/world/level/block/CropBlock.java @@ -169,7 +169,7 @@ public class CropBlock extends VegetationBlock implements BonemealableBlock { @Override protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean pastEdges) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent -- if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list -+ if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.ravagerMobGriefingOverride))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list // Purpur - Add mobGriefing override to everything affected +- if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().get(GameRules.MOB_GRIEFING))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list ++ if (level instanceof ServerLevel serverLevel && entity instanceof Ravager && serverLevel.purpurConfig.ravagerGriefableBlocks.contains(serverLevel.getBlockState(pos).getBlock()) && org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity, pos, Blocks.AIR.defaultBlockState(), !serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.ravagerMobGriefingOverride))) { // CraftBukkit // Purpur - Configurable ravager griefable blocks list // Purpur - Add mobGriefing override to everything affected serverLevel.destroyBlock(pos, true, entity); } diff --git a/net/minecraft/world/level/block/FarmBlock.java b/net/minecraft/world/level/block/FarmBlock.java -index 9883e6d1a1b76155c8ba1817fda6615b4742e18e..dc1ad33f801c308871931d271f97ff9185e9effb 100644 +index cd90b5151cae59a63836e88c6457c2954e24a345..3fd6a259788503f2a6d33d29a9247796f75e719a 100644 --- a/net/minecraft/world/level/block/FarmBlock.java +++ b/net/minecraft/world/level/block/FarmBlock.java @@ -114,7 +114,7 @@ public class FarmBlock extends Block { if (level instanceof ServerLevel serverLevel && (serverLevel.purpurConfig.farmlandTrampleHeight >= 0D ? fallDistance >= serverLevel.purpurConfig.farmlandTrampleHeight : level.random.nextFloat() < fallDistance - 0.5) // Purpur - Configurable farmland trample height && entity instanceof LivingEntity -- && (entity instanceof Player || serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) -+ && (entity instanceof Player || serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.farmlandMobGriefingOverride)) // Purpur - Add mobGriefing override to everything affected +- && (entity instanceof Player || serverLevel.getGameRules().get(GameRules.MOB_GRIEFING)) ++ && (entity instanceof Player || serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.farmlandMobGriefingOverride)) // Purpur - Add mobGriefing override to everything affected && entity.getBbWidth() * entity.getBbWidth() * entity.getBbHeight() > 0.512F) { // CraftBukkit start - Interact soil org.bukkit.event.Cancellable cancellable; diff --git a/net/minecraft/world/level/block/PowderSnowBlock.java b/net/minecraft/world/level/block/PowderSnowBlock.java -index e3a11a1f68e2aa89610dfda25c0f1f11fd3427aa..525644c33b9d1b42c86b93145c7120f6bc87b5e5 100644 +index f3a9117bd066861a1b447e8a13108ad212cc499f..b0165c839b145e82af38fe8f61bbd0161015d867 100644 --- a/net/minecraft/world/level/block/PowderSnowBlock.java +++ b/net/minecraft/world/level/block/PowderSnowBlock.java @@ -96,7 +96,7 @@ public class PowderSnowBlock extends Block implements BucketPickup { // CraftBukkit - move down && entity1.mayInteract(serverLevel, blockPos)) { // CraftBukkit start -- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING) || entity1 instanceof Player))) { -+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, serverLevel.purpurConfig.powderSnowMobGriefingOverride) || entity1 instanceof Player))) { // Purpur - Add mobGriefing override to everything affected +- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().get(GameRules.MOB_GRIEFING) || entity1 instanceof Player))) { ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(entity1, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.powderSnowMobGriefingOverride) || entity1 instanceof Player))) { // Purpur - Add mobGriefing override to everything affected return; } // CraftBukkit end diff --git a/net/minecraft/world/level/block/TurtleEggBlock.java b/net/minecraft/world/level/block/TurtleEggBlock.java -index 6fd922a7cf1c9679344af91e817469350b01de17..90d2317ca3e05bb41a1d03a8ccbc57d84f79f70c 100644 +index 77c2fb39c961180cd8280b97205273a5562481f7..f10a56052c51509784fb1f3851e41548c04d6a3c 100644 --- a/net/minecraft/world/level/block/TurtleEggBlock.java +++ b/net/minecraft/world/level/block/TurtleEggBlock.java @@ -214,7 +214,7 @@ public class TurtleEggBlock extends Block { // Purpur end - Option to disable turtle egg trampling with feather falling if (entity instanceof Player) return true; -- return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING); -+ return level.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING, level.purpurConfig.turtleEggsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected +- return level.getGameRules().get(GameRules.MOB_GRIEFING); ++ return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.turtleEggsMobGriefingOverride); // Purpur - Add mobGriefing override to everything affected // Purpur end - Add turtle egg block options } } +diff --git a/net/minecraft/world/level/gamerules/GameRules.java b/net/minecraft/world/level/gamerules/GameRules.java +index e71a9ffdb6c081baa79113f34b179671c179152d..746bc21fc09644366caa8bfd309f596c3cac59ec 100644 +--- a/net/minecraft/world/level/gamerules/GameRules.java ++++ b/net/minecraft/world/level/gamerules/GameRules.java +@@ -113,6 +113,13 @@ public class GameRules { + return this.rules.keySet().stream(); + } + ++ public boolean get(GameRule rule, Boolean gameRuleOverride) { ++ if (gameRuleOverride != null) { ++ return gameRuleOverride; ++ } ++ return (Boolean) this.get(rule); ++ } ++ + public T get(GameRule rule) { + T object = this.rules.get(rule); + if (object == null) { diff --git a/purpur-server/minecraft-patches/unapplied-features/0016-Add-EntityTeleportHinderedEvent.patch b/purpur-server/minecraft-patches/features/0016-Add-EntityTeleportHinderedEvent.patch similarity index 93% rename from purpur-server/minecraft-patches/unapplied-features/0016-Add-EntityTeleportHinderedEvent.patch rename to purpur-server/minecraft-patches/features/0016-Add-EntityTeleportHinderedEvent.patch index de35d1b4b..2fd6b6ed5 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0016-Add-EntityTeleportHinderedEvent.patch +++ b/purpur-server/minecraft-patches/features/0016-Add-EntityTeleportHinderedEvent.patch @@ -17,10 +17,10 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . diff --git a/net/minecraft/world/level/block/EndGatewayBlock.java b/net/minecraft/world/level/block/EndGatewayBlock.java -index 6161cd82dade8b4119ab0b8ba84451d592ce5858..5830b9a57786c6b0ab50a47aa68e960a580a31f6 100644 +index 4b959091412defb5ae6ffe387f98ed1cc9a29e5f..7ed96070abb398384e82d7d85efa3e0a6c493aad 100644 --- a/net/minecraft/world/level/block/EndGatewayBlock.java +++ b/net/minecraft/world/level/block/EndGatewayBlock.java -@@ -99,6 +99,13 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { +@@ -98,6 +98,13 @@ public class EndGatewayBlock extends BaseEntityBlock implements Portal { org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.END_GATEWAY); // Paper - add portal type if (!event.callEvent()) return; // Paper end - call EntityPortalEnterEvent @@ -35,7 +35,7 @@ index 6161cd82dade8b4119ab0b8ba84451d592ce5858..5830b9a57786c6b0ab50a47aa68e960a TheEndGatewayBlockEntity.triggerCooldown(level, pos, state, theEndGatewayBlockEntity); } diff --git a/net/minecraft/world/level/block/EndPortalBlock.java b/net/minecraft/world/level/block/EndPortalBlock.java -index 20c34b4601979e9a36e500da2143e446eeef098e..8b44e7e98085dc75ba631922ae4d14d6cfc5565c 100644 +index 19590aa5af0eaf0f9bf76dc189ed67e67c692c77..cb41b33a3022a341a340e8186fed8e39373a3a2b 100644 --- a/net/minecraft/world/level/block/EndPortalBlock.java +++ b/net/minecraft/world/level/block/EndPortalBlock.java @@ -61,6 +61,13 @@ public class EndPortalBlock extends BaseEntityBlock implements Portal { @@ -53,10 +53,10 @@ index 20c34b4601979e9a36e500da2143e446eeef098e..8b44e7e98085dc75ba631922ae4d14d6 org.bukkit.event.entity.EntityPortalEnterEvent event = new org.bukkit.event.entity.EntityPortalEnterEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.util.CraftLocation.toBukkit(pos, level), org.bukkit.PortalType.ENDER); // Paper - add portal type level.getCraftServer().getPluginManager().callEvent(event); diff --git a/net/minecraft/world/level/block/NetherPortalBlock.java b/net/minecraft/world/level/block/NetherPortalBlock.java -index da01114a89d62c80550272987d2df26daa661d65..e72d3f2776369a39b7429dc6a8aee9d05b5349ff 100644 +index 860e0c3ab118d8c6863936b9c2603bf6a278ca99..a37ae82d5c2407039d49304dc3937f7f0794bddc 100644 --- a/net/minecraft/world/level/block/NetherPortalBlock.java +++ b/net/minecraft/world/level/block/NetherPortalBlock.java -@@ -113,6 +113,13 @@ public class NetherPortalBlock extends Block implements Portal { +@@ -114,6 +114,13 @@ public class NetherPortalBlock extends Block implements Portal { protected void entityInside(BlockState state, Level level, BlockPos pos, Entity entity, InsideBlockEffectApplier effectApplier, boolean pastEdges) { if (!new io.papermc.paper.event.entity.EntityInsideBlockEvent(entity.getBukkitEntity(), org.bukkit.craftbukkit.block.CraftBlock.at(level, pos)).callEvent()) { return; } // Paper - Add EntityInsideBlockEvent if (entity.canUsePortal(false)) { diff --git a/purpur-server/minecraft-patches/unapplied-features/0017-Toggle-for-water-sensitive-mob-damage.patch b/purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch similarity index 66% rename from purpur-server/minecraft-patches/unapplied-features/0017-Toggle-for-water-sensitive-mob-damage.patch rename to purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch index 8f0299a69..6002a8bfe 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0017-Toggle-for-water-sensitive-mob-damage.patch +++ b/purpur-server/minecraft-patches/features/0017-Toggle-for-water-sensitive-mob-damage.patch @@ -4,29 +4,11 @@ Date: Fri, 5 Feb 2021 01:11:22 +0100 Subject: [PATCH] Toggle for water sensitive mob damage -diff --git a/net/minecraft/world/entity/GlowSquid.java b/net/minecraft/world/entity/GlowSquid.java -index cbb7e0591dc761d0566ac99dc6e5697b3ba4eeda..a10a1e26d0260968c6becd1e9d68436071da8411 100644 ---- a/net/minecraft/world/entity/GlowSquid.java -+++ b/net/minecraft/world/entity/GlowSquid.java -@@ -54,6 +54,13 @@ public class GlowSquid extends Squid { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.glowSquidTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected ParticleOptions getInkParticle() { - return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index 4624aca3dc3054ce7558023033fc953aedd33d88..a64afb30454ee537b0e044d6d55ce0b0a8e944ea 100644 +index a09b5035e91d50e12f613a7a1211c6869fbbf4df..e83900f8d6adbe8a48294f250bd6cc6e3fad8160 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java -@@ -112,6 +112,13 @@ public class Bat extends AmbientCreature { +@@ -109,6 +109,13 @@ public class Bat extends AmbientCreature { } // Purpur end - Configurable entity base attributes @@ -40,408 +22,8 @@ index 4624aca3dc3054ce7558023033fc953aedd33d88..a64afb30454ee537b0e044d6d55ce0b0 @Override public boolean isFlapping() { return !this.isResting() && this.tickCount % 10.0F == 0.0F; -diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index f7d948294efcac1deac559d1fc9453f1dd0de659..b2b234490aba52c8125c0644f0176fe825b63e91 100644 ---- a/net/minecraft/world/entity/animal/Bee.java -+++ b/net/minecraft/world/entity/animal/Bee.java -@@ -185,7 +185,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - // Paper end - Fix MC-167279 - this.lookControl = new Bee.BeeLookControl(this); - this.setPathfindingMalus(PathType.DANGER_FIRE, -1.0F); -- if (this.level().purpurConfig.beeCanInstantlyStartDrowning) this.setPathfindingMalus(PathType.WATER, -1.0F); // Purpur - bee can instantly start drowning in water option -+ if (this.level().purpurConfig.beeCanInstantlyStartDrowning || isSensitiveToWater()) this.setPathfindingMalus(PathType.WATER, -1.0F); // Purpur - bee can instantly start drowning in water option // Purpur - Toggle for water sensitive mob damage - this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F); - this.setPathfindingMalus(PathType.COCOA, -1.0F); - this.setPathfindingMalus(PathType.FENCE, -1.0F); -@@ -489,6 +489,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.beeTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - public int getRemainingPersistentAngerTime() { - return this.entityData.get(DATA_REMAINING_ANGER_TIME); -diff --git a/net/minecraft/world/entity/animal/Cat.java b/net/minecraft/world/entity/animal/Cat.java -index 307f62466c9486ffdf8c2991fb805730198f38eb..09467cb1f8f3c6978771464b292e33a1396d76e3 100644 ---- a/net/minecraft/world/entity/animal/Cat.java -+++ b/net/minecraft/world/entity/animal/Cat.java -@@ -133,6 +133,13 @@ public class Cat extends TamableAnimal { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.catTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); -diff --git a/net/minecraft/world/entity/animal/Chicken.java b/net/minecraft/world/entity/animal/Chicken.java -index b65abf395b3d3c10dc20604b670e44c183f5131b..dde117db5952784e385f242d388b062d0fa1d49d 100644 ---- a/net/minecraft/world/entity/animal/Chicken.java -+++ b/net/minecraft/world/entity/animal/Chicken.java -@@ -109,6 +109,13 @@ public class Chicken extends Animal { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.chickenTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/Cod.java b/net/minecraft/world/entity/animal/Cod.java -index 9b9a237a20d8e39ac11a39a4d5782084f97ea674..f8fbba4ae8b0ecf9aec33f60b908a88fa2933713 100644 ---- a/net/minecraft/world/entity/animal/Cod.java -+++ b/net/minecraft/world/entity/animal/Cod.java -@@ -32,6 +32,13 @@ public class Cod extends AbstractSchoolingFish { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.codTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - public ItemStack getBucketItemStack() { - return new ItemStack(Items.COD_BUCKET); -diff --git a/net/minecraft/world/entity/animal/Cow.java b/net/minecraft/world/entity/animal/Cow.java -index 298cbc74a7d26de1cd0fb356ce9e802c0cc3a1ca..a71b6c8a0c48d9c7121e7d29cff6d388cb2df09f 100644 ---- a/net/minecraft/world/entity/animal/Cow.java -+++ b/net/minecraft/world/entity/animal/Cow.java -@@ -61,6 +61,13 @@ public class Cow extends AbstractCow { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.cowTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/Dolphin.java b/net/minecraft/world/entity/animal/Dolphin.java -index caf0f3c0690344fafb9a52a55f81b25ea6aa91a9..b89f87425721e540d612b62bd3a78eb6d3fcfaf7 100644 ---- a/net/minecraft/world/entity/animal/Dolphin.java -+++ b/net/minecraft/world/entity/animal/Dolphin.java -@@ -160,6 +160,13 @@ public class Dolphin extends AgeableWaterCreature { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.dolphinTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Nullable - @Override - public SpawnGroupData finalizeSpawn( -diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java -index 0f32571b193ba48540c283026e5a5d99314951fe..71def83ec7b69832dbb0af4eaa012e25673e38b3 100644 ---- a/net/minecraft/world/entity/animal/Fox.java -+++ b/net/minecraft/world/entity/animal/Fox.java -@@ -197,6 +197,13 @@ public class Fox extends Animal { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.foxTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java -index 5f7ab269e406e6d6912a58b3b48123d6c4da282c..dbc01564e23e7785e85b16f100925d36496ef51c 100644 ---- a/net/minecraft/world/entity/animal/HappyGhast.java -+++ b/net/minecraft/world/entity/animal/HappyGhast.java -@@ -152,6 +152,13 @@ public class HappyGhast extends Animal { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.happyGhastTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void ageBoundaryReached() { - if (this.isBaby()) { -diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java -index a8ae43ab84d746e8f046b52410602607e759761e..54b7edced2b95f874d9ef7ba21418a68e9bd6291 100644 ---- a/net/minecraft/world/entity/animal/IronGolem.java -+++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -101,6 +101,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.ironGolemTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options -diff --git a/net/minecraft/world/entity/animal/MushroomCow.java b/net/minecraft/world/entity/animal/MushroomCow.java -index 6cbf93991ee375d2051128721a409a3a7a9064e8..ddd763cc38e8c624db7ef207f244961bda0b5ae1 100644 ---- a/net/minecraft/world/entity/animal/MushroomCow.java -+++ b/net/minecraft/world/entity/animal/MushroomCow.java -@@ -94,6 +94,13 @@ public class MushroomCow extends AbstractCow implements Shearable { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.mooshroomTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { - return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); -diff --git a/net/minecraft/world/entity/animal/Ocelot.java b/net/minecraft/world/entity/animal/Ocelot.java -index f047fa8d33ab6b7e01447f91e6c33e22e9ce9e02..15d0d05dd80744880da9192d3fdfe3bc0c3e9401 100644 ---- a/net/minecraft/world/entity/animal/Ocelot.java -+++ b/net/minecraft/world/entity/animal/Ocelot.java -@@ -97,6 +97,13 @@ public class Ocelot extends Animal { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.ocelotTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - public boolean isTrusting() { - return this.entityData.get(DATA_TRUSTING); - } -diff --git a/net/minecraft/world/entity/animal/Panda.java b/net/minecraft/world/entity/animal/Panda.java -index fbe06479b24fd0e76a063eeac96447fa88c7d45b..4e9aa65002e4134600ee95b16bd14dcb6f1f46ee 100644 ---- a/net/minecraft/world/entity/animal/Panda.java -+++ b/net/minecraft/world/entity/animal/Panda.java -@@ -149,6 +149,13 @@ public class Panda extends Animal { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.pandaTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { - return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); -diff --git a/net/minecraft/world/entity/animal/Parrot.java b/net/minecraft/world/entity/animal/Parrot.java -index 0749317e7f1a7b54759b9cd335419e7f92362715..d31e85b63f41121678c67e6c284923251ef744f6 100644 ---- a/net/minecraft/world/entity/animal/Parrot.java -+++ b/net/minecraft/world/entity/animal/Parrot.java -@@ -209,6 +209,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.parrotTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Nullable - @Override - public SpawnGroupData finalizeSpawn( -diff --git a/net/minecraft/world/entity/animal/Pig.java b/net/minecraft/world/entity/animal/Pig.java -index 5300c3ae50633aa513c25384c1a2084701921cb9..719317c3cd5fc0202ef5deb150e0304191b121b8 100644 ---- a/net/minecraft/world/entity/animal/Pig.java -+++ b/net/minecraft/world/entity/animal/Pig.java -@@ -98,6 +98,13 @@ public class Pig extends Animal implements ItemSteerable { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.pigTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/PolarBear.java b/net/minecraft/world/entity/animal/PolarBear.java -index 884137b428a1fe69bb61b9ae05b652357daecc27..eda9e5965a6ff244288215188de8e05ebcb61f14 100644 ---- a/net/minecraft/world/entity/animal/PolarBear.java -+++ b/net/minecraft/world/entity/animal/PolarBear.java -@@ -132,6 +132,13 @@ public class PolarBear extends Animal implements NeutralMob { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.polarBearTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { -diff --git a/net/minecraft/world/entity/animal/Pufferfish.java b/net/minecraft/world/entity/animal/Pufferfish.java -index 7ce2f0397b05e98a1d5721b6f5674cfbe7d19333..0f3bf73faf5c8d4bae5af6d4a9c4fa1be8394a6b 100644 ---- a/net/minecraft/world/entity/animal/Pufferfish.java -+++ b/net/minecraft/world/entity/animal/Pufferfish.java -@@ -66,6 +66,13 @@ public class Pufferfish extends AbstractFish { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.pufferfishTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java -index f45ae44b37b512bf63e719ff15b538431a2c7e7f..0320fbe2d266366f85080487ac9533b672451cbb 100644 ---- a/net/minecraft/world/entity/animal/Rabbit.java -+++ b/net/minecraft/world/entity/animal/Rabbit.java -@@ -162,6 +162,13 @@ public class Rabbit extends Animal { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.rabbitTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - public void registerGoals() { - this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/Salmon.java b/net/minecraft/world/entity/animal/Salmon.java -index e5790db0472fa97471b828cf6d817697389c3a8c..b9641e307d669ba20428843575a6bb39065df034 100644 ---- a/net/minecraft/world/entity/animal/Salmon.java -+++ b/net/minecraft/world/entity/animal/Salmon.java -@@ -58,6 +58,13 @@ public class Salmon extends AbstractSchoolingFish { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.salmonTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - public int getMaxSchoolSize() { - return 5; -diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index 20f73d895bc55581c62283825a6d5296150ac707..6cb6ff86e3fd7b9dd2929669dc1b0d339af9a95a 100644 ---- a/net/minecraft/world/entity/animal/SnowGolem.java -+++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -125,7 +125,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - - @Override - public boolean isSensitiveToWater() { -- return true; -+ return this.level().purpurConfig.snowGolemTakeDamageFromWater; // Purpur - Toggle for water sensitive mob damage - } - - @Override -diff --git a/net/minecraft/world/entity/animal/Squid.java b/net/minecraft/world/entity/animal/Squid.java -index 4f8a5d0d6c3d302ebf8fcb3268f8e40b63686125..fcdab19016a3f92776447a51df9ea2796461ef9c 100644 ---- a/net/minecraft/world/entity/animal/Squid.java -+++ b/net/minecraft/world/entity/animal/Squid.java -@@ -100,6 +100,13 @@ public class Squid extends AgeableWaterCreature { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.squidTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); -diff --git a/net/minecraft/world/entity/animal/TropicalFish.java b/net/minecraft/world/entity/animal/TropicalFish.java -index 95368fd534c77e7d89ed6219f1f3948c428c256c..22a75b6b1e6f130027e39051f04267fb436ae6de 100644 ---- a/net/minecraft/world/entity/animal/TropicalFish.java -+++ b/net/minecraft/world/entity/animal/TropicalFish.java -@@ -96,6 +96,13 @@ public class TropicalFish extends AbstractSchoolingFish { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.tropicalFishTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - public static String getPredefinedName(int variantId) { - return "entity.minecraft.tropical_fish.predefined." + variantId; - } -diff --git a/net/minecraft/world/entity/animal/Turtle.java b/net/minecraft/world/entity/animal/Turtle.java -index 11a5f8d1a424531105436f96a097de6e9745be96..536a0cddb05e1224562528d19a69a9ef5c1e07f5 100644 ---- a/net/minecraft/world/entity/animal/Turtle.java -+++ b/net/minecraft/world/entity/animal/Turtle.java -@@ -119,6 +119,13 @@ public class Turtle extends Animal { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.turtleTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - public void setHomePos(BlockPos homePos) { - this.homePos = homePos; - } diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 277e955eabed07bdc50531dfe182de8cb05e56c2..c32a5f348e41d6ff733331b85baf32da839083fe 100644 +index 79dfebbd72424d5a3a13d4ba89a555fdf782e703..947160c4dfc4e50bb75a1a797cb2f22602b22643 100644 --- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -153,6 +153,13 @@ public class Axolotl extends Animal implements Bucketable { @@ -458,26 +40,359 @@ index 277e955eabed07bdc50531dfe182de8cb05e56c2..c32a5f348e41d6ff733331b85baf32da @Override public float getWalkTargetValue(BlockPos pos, LevelReader level) { return 0.0F; -diff --git a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -index cfe0bb8983dd1633085e03a6c2a57d99a0d822b8..e533edb6163cada2bc9bc9ed61bf333b2a2703b8 100644 ---- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -+++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -@@ -143,6 +143,13 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab +diff --git a/net/minecraft/world/entity/animal/bee/Bee.java b/net/minecraft/world/entity/animal/bee/Bee.java +index e28128ac556a7be1c50e8c95eb68f09dca2f901d..26a25b4f294b936901765c72bfa7c5a80a7c299c 100644 +--- a/net/minecraft/world/entity/animal/bee/Bee.java ++++ b/net/minecraft/world/entity/animal/bee/Bee.java +@@ -185,7 +185,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + // Paper end - Fix MC-167279 + this.lookControl = new Bee.BeeLookControl(this); + this.setPathfindingMalus(PathType.DANGER_FIRE, -1.0F); +- if (this.level().purpurConfig.beeCanInstantlyStartDrowning) this.setPathfindingMalus(PathType.WATER, -1.0F); // Purpur - bee can instantly start drowning in water option ++ if (this.level().purpurConfig.beeCanInstantlyStartDrowning || isSensitiveToWater()) this.setPathfindingMalus(PathType.WATER, -1.0F); // Purpur - bee can instantly start drowning in water option // Purpur - Toggle for water sensitive mob damage + this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F); + this.setPathfindingMalus(PathType.COCOA, -1.0F); + this.setPathfindingMalus(PathType.FENCE, -1.0F); +@@ -486,6 +486,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.beeTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public long getPersistentAngerEndTime() { + return this.entityData.get(DATA_ANGER_END_TIME); +diff --git a/net/minecraft/world/entity/animal/chicken/Chicken.java b/net/minecraft/world/entity/animal/chicken/Chicken.java +index 029fe4ac952d9f56824de346d98b341bd0b9b65f..6308bb606b34d781e315f56a55e6544b3c156d85 100644 +--- a/net/minecraft/world/entity/animal/chicken/Chicken.java ++++ b/net/minecraft/world/entity/animal/chicken/Chicken.java +@@ -110,6 +110,13 @@ public class Chicken extends Animal { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.chickenTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/cow/Cow.java b/net/minecraft/world/entity/animal/cow/Cow.java +index 400b0a0a99590e3590cb66724acdc5ba9170f2c4..bb8c75d20e6a1300d68ae75233962bdc26736c77 100644 +--- a/net/minecraft/world/entity/animal/cow/Cow.java ++++ b/net/minecraft/world/entity/animal/cow/Cow.java +@@ -61,6 +61,13 @@ public class Cow extends AbstractCow { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.cowTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/cow/MushroomCow.java b/net/minecraft/world/entity/animal/cow/MushroomCow.java +index e2aa027dc7a39fa8a8868a7d153e838113fcf97b..a8e6e703a51130066547724dd08bdfe5e11c99e5 100644 +--- a/net/minecraft/world/entity/animal/cow/MushroomCow.java ++++ b/net/minecraft/world/entity/animal/cow/MushroomCow.java +@@ -92,6 +92,13 @@ public class MushroomCow extends AbstractCow implements Shearable { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.mooshroomTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public float getWalkTargetValue(BlockPos pos, LevelReader level) { + return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); +diff --git a/net/minecraft/world/entity/animal/dolphin/Dolphin.java b/net/minecraft/world/entity/animal/dolphin/Dolphin.java +index 94f92080de46f2af67e1d28753208691da534ddf..d73789bb8ce0f65be94437484c3ed41e26cd7510 100644 +--- a/net/minecraft/world/entity/animal/dolphin/Dolphin.java ++++ b/net/minecraft/world/entity/animal/dolphin/Dolphin.java +@@ -160,6 +160,13 @@ public class Dolphin extends AgeableWaterCreature { } // Purpur end - Configurable entity base attributes + // Purpur start - Toggle for water sensitive mob damage + @Override + public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.copperGolemTakeDamageFromWater; ++ return this.level().purpurConfig.dolphinTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public @Nullable SpawnGroupData finalizeSpawn( + ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData +diff --git a/net/minecraft/world/entity/animal/equine/Donkey.java b/net/minecraft/world/entity/animal/equine/Donkey.java +index d74a5cc2a43ef41fd00676bbd17fe4df9edb67ff..6cf6853c244b7589d2a57e7ae77933d4a1503ccd 100644 +--- a/net/minecraft/world/entity/animal/equine/Donkey.java ++++ b/net/minecraft/world/entity/animal/equine/Donkey.java +@@ -47,6 +47,13 @@ public class Donkey extends AbstractChestedHorse { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.donkeyTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public SoundEvent getAmbientSound() { + return SoundEvents.DONKEY_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/equine/Horse.java b/net/minecraft/world/entity/animal/equine/Horse.java +index ba9df659ed019f9e58991059fe99c1471bfc94d8..1c17ab94901ce1c6370670c06bf0801ee6b5b393 100644 +--- a/net/minecraft/world/entity/animal/equine/Horse.java ++++ b/net/minecraft/world/entity/animal/equine/Horse.java +@@ -81,6 +81,13 @@ public class Horse extends AbstractHorse { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.horseTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void randomizeAttributes(RandomSource random) { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); +diff --git a/net/minecraft/world/entity/animal/equine/Llama.java b/net/minecraft/world/entity/animal/equine/Llama.java +index 960e48f5ae63d8c86758d2573510bf481ca4bca0..eb2fc0e6d497241f1b4f3971155b10d14f5427f8 100644 +--- a/net/minecraft/world/entity/animal/equine/Llama.java ++++ b/net/minecraft/world/entity/animal/equine/Llama.java +@@ -159,6 +159,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.llamaTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + public boolean isTraderLlama() { + return false; + } +diff --git a/net/minecraft/world/entity/animal/equine/Mule.java b/net/minecraft/world/entity/animal/equine/Mule.java +index 180a807026437e949e3f7c3d59864ea328f6f03f..9bafe3e204b3e4624a95b130552c8230c0835a30 100644 +--- a/net/minecraft/world/entity/animal/equine/Mule.java ++++ b/net/minecraft/world/entity/animal/equine/Mule.java +@@ -46,6 +46,13 @@ public class Mule extends AbstractChestedHorse { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.muleTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public SoundEvent getAmbientSound() { + return SoundEvents.MULE_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/equine/SkeletonHorse.java b/net/minecraft/world/entity/animal/equine/SkeletonHorse.java +index af0e326f5ff8fcb82353bac3143103928a6a08e6..3865937e4a56636cde44f7d8f16873ae16512323 100644 +--- a/net/minecraft/world/entity/animal/equine/SkeletonHorse.java ++++ b/net/minecraft/world/entity/animal/equine/SkeletonHorse.java +@@ -74,6 +74,13 @@ public class SkeletonHorse extends AbstractHorse { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.skeletonHorseTakeDamageFromWater; + } + // Purpur end - Toggle for water sensitive mob damage + public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); + return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); } +diff --git a/net/minecraft/world/entity/animal/equine/TraderLlama.java b/net/minecraft/world/entity/animal/equine/TraderLlama.java +index 65ac46335d642d5dd8c01623721257a4fd53441d..4c07cd57aa3518adb4bc9b1213cc572a5b81f935 100644 +--- a/net/minecraft/world/entity/animal/equine/TraderLlama.java ++++ b/net/minecraft/world/entity/animal/equine/TraderLlama.java +@@ -77,6 +77,13 @@ public class TraderLlama extends Llama { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.traderLlamaTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public boolean isTraderLlama() { + return true; +diff --git a/net/minecraft/world/entity/animal/equine/ZombieHorse.java b/net/minecraft/world/entity/animal/equine/ZombieHorse.java +index fa2f18470123f98e336ab5c94bc791e9333356cb..b770d3118452b0b7a362b1f541bb602f4d3cbcec 100644 +--- a/net/minecraft/world/entity/animal/equine/ZombieHorse.java ++++ b/net/minecraft/world/entity/animal/equine/ZombieHorse.java +@@ -88,6 +88,13 @@ public class ZombieHorse extends AbstractHorse { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.zombieHorseTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + public static AttributeSupplier.Builder createAttributes() { + return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 25.0); + } +diff --git a/net/minecraft/world/entity/animal/feline/Cat.java b/net/minecraft/world/entity/animal/feline/Cat.java +index d0aa698ef99cf3b1926018314b4067cc1cd8ac2a..92b67565485b2fade3e80fb4b944edfc12d9e0a2 100644 +--- a/net/minecraft/world/entity/animal/feline/Cat.java ++++ b/net/minecraft/world/entity/animal/feline/Cat.java +@@ -135,6 +135,13 @@ public class Cat extends TamableAnimal { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.catTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); +diff --git a/net/minecraft/world/entity/animal/feline/Ocelot.java b/net/minecraft/world/entity/animal/feline/Ocelot.java +index bf281fd4c050b87fd277ab68e812ab2dcd3d06aa..13272516003f763d2c69dc599c8ff7696bec718b 100644 +--- a/net/minecraft/world/entity/animal/feline/Ocelot.java ++++ b/net/minecraft/world/entity/animal/feline/Ocelot.java +@@ -98,6 +98,13 @@ public class Ocelot extends Animal { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.ocelotTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + public boolean isTrusting() { + return this.entityData.get(DATA_TRUSTING); + } +diff --git a/net/minecraft/world/entity/animal/fish/Cod.java b/net/minecraft/world/entity/animal/fish/Cod.java +index e00e623d7df9e179d8bb5ee4812538578c5f4c08..8655aae805f239cbd049065232293854b18c73cf 100644 +--- a/net/minecraft/world/entity/animal/fish/Cod.java ++++ b/net/minecraft/world/entity/animal/fish/Cod.java +@@ -32,6 +32,13 @@ public class Cod extends AbstractSchoolingFish { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.codTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public ItemStack getBucketItemStack() { + return new ItemStack(Items.COD_BUCKET); +diff --git a/net/minecraft/world/entity/animal/fish/Pufferfish.java b/net/minecraft/world/entity/animal/fish/Pufferfish.java +index b2932aeb6000a4e268db12cb7b05be746788569c..4d21718441b0272774ec69e9b72a180fe417cbb0 100644 +--- a/net/minecraft/world/entity/animal/fish/Pufferfish.java ++++ b/net/minecraft/world/entity/animal/fish/Pufferfish.java +@@ -66,6 +66,13 @@ public class Pufferfish extends AbstractFish { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.pufferfishTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/fish/Salmon.java b/net/minecraft/world/entity/animal/fish/Salmon.java +index 97194d5c844bf96ba431c12ccc1a82cb8944c52b..424bd56ec9df8bd0a80d2fa79bc4f482eae2ab5c 100644 +--- a/net/minecraft/world/entity/animal/fish/Salmon.java ++++ b/net/minecraft/world/entity/animal/fish/Salmon.java +@@ -59,6 +59,13 @@ public class Salmon extends AbstractSchoolingFish { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.salmonTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public int getMaxSchoolSize() { + return 5; +diff --git a/net/minecraft/world/entity/animal/fish/TropicalFish.java b/net/minecraft/world/entity/animal/fish/TropicalFish.java +index 8ffb253c114d882c9459f74a27bd8a086ae82f01..04c30c60c76122018fa69cf1f3f64cae8ed62fad 100644 +--- a/net/minecraft/world/entity/animal/fish/TropicalFish.java ++++ b/net/minecraft/world/entity/animal/fish/TropicalFish.java +@@ -96,6 +96,13 @@ public class TropicalFish extends AbstractSchoolingFish { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.tropicalFishTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + public static String getPredefinedName(int variantId) { + return "entity.minecraft.tropical_fish.predefined." + variantId; + } +diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java +index a0ed30e8ccd41729de8e0ff977a61fa607386640..bc119c2f61adb6c6122119fda1df437bab40f9b4 100644 +--- a/net/minecraft/world/entity/animal/fox/Fox.java ++++ b/net/minecraft/world/entity/animal/fox/Fox.java +@@ -204,6 +204,13 @@ public class Fox extends Animal { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.foxTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index afcd9d3ea11d94ef811cce71f54f2a718619cc9f..60c97b44d3977eda2fa2c302aad3c7e337de51d9 100644 +index 07ba57ae845024e0f2fa03a68e126ec79bfc6b15..e5f5bc2c4b4f36e0e911b2c5ef67ef6e0d4cd0b1 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java @@ -139,6 +139,13 @@ public class Goat extends Animal { @@ -494,134 +409,165 @@ index afcd9d3ea11d94ef811cce71f54f2a718619cc9f..60c97b44d3977eda2fa2c302aad3c7e3 @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -diff --git a/net/minecraft/world/entity/animal/horse/Donkey.java b/net/minecraft/world/entity/animal/horse/Donkey.java -index 293d6059bc5e50b66b23e8e2e1d759e61cb26999..322ff19885fc2a982bc3c4bd7b5588cd2974e425 100644 ---- a/net/minecraft/world/entity/animal/horse/Donkey.java -+++ b/net/minecraft/world/entity/animal/horse/Donkey.java -@@ -47,6 +47,13 @@ public class Donkey extends AbstractChestedHorse { +diff --git a/net/minecraft/world/entity/animal/golem/CopperGolem.java b/net/minecraft/world/entity/animal/golem/CopperGolem.java +index e3c5b6fe7d6cdb674fbf5ac22001c3d917bf91ec..2d0ce5d420f88a95eda34a3fe81c815999bde300 100644 +--- a/net/minecraft/world/entity/animal/golem/CopperGolem.java ++++ b/net/minecraft/world/entity/animal/golem/CopperGolem.java +@@ -140,6 +140,13 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab } - // Purpur end - Make entity breeding times configurable + // Purpur end - Configurable entity base attributes + // Purpur start - Toggle for water sensitive mob damage + @Override + public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.donkeyTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - public SoundEvent getAmbientSound() { - return SoundEvents.DONKEY_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/Horse.java b/net/minecraft/world/entity/animal/horse/Horse.java -index 513856b5047842edd501eb6c23c13e3bf10d7249..4d8c6eac4d276dac7859bed1a1c83d45f1858b64 100644 ---- a/net/minecraft/world/entity/animal/horse/Horse.java -+++ b/net/minecraft/world/entity/animal/horse/Horse.java -@@ -78,6 +78,13 @@ public class Horse extends AbstractHorse { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.horseTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void randomizeAttributes(RandomSource random) { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); -diff --git a/net/minecraft/world/entity/animal/horse/Llama.java b/net/minecraft/world/entity/animal/horse/Llama.java -index df3fd52ed0bc794919ff20c4eb8c561ec2b5ad8f..32ceec4a08010a2febaac47b6288673cbc71ac90 100644 ---- a/net/minecraft/world/entity/animal/horse/Llama.java -+++ b/net/minecraft/world/entity/animal/horse/Llama.java -@@ -161,6 +161,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.llamaTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - public boolean isTraderLlama() { - return false; - } -diff --git a/net/minecraft/world/entity/animal/horse/Mule.java b/net/minecraft/world/entity/animal/horse/Mule.java -index 5e6a9467d15e551ab2c8b3e42abd096a85e36037..b1c320210e3116249043ef91feb621e1af5afabf 100644 ---- a/net/minecraft/world/entity/animal/horse/Mule.java -+++ b/net/minecraft/world/entity/animal/horse/Mule.java -@@ -46,6 +46,13 @@ public class Mule extends AbstractChestedHorse { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.muleTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - public SoundEvent getAmbientSound() { - return SoundEvents.MULE_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -index 024591d5ffd396391864554e7b532910d465c30a..9cd58494f090dd0d16787b3d739cbaa8bcd92370 100644 ---- a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -+++ b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -@@ -73,6 +73,13 @@ public class SkeletonHorse extends AbstractHorse { - } - // Purpur end - Make entity breeding times configurable - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.skeletonHorseTakeDamageFromWater; ++ return this.level().purpurConfig.copperGolemTakeDamageFromWater; + } + // Purpur end - Toggle for water sensitive mob damage + public static AttributeSupplier.Builder createAttributes() { - return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); + return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); } -diff --git a/net/minecraft/world/entity/animal/horse/TraderLlama.java b/net/minecraft/world/entity/animal/horse/TraderLlama.java -index 8b63470177d60d79fe0b774a301d36701026a803..204dfdeb5c3bb650dbd6c990c6a2e1e4d14b8c77 100644 ---- a/net/minecraft/world/entity/animal/horse/TraderLlama.java -+++ b/net/minecraft/world/entity/animal/horse/TraderLlama.java -@@ -77,6 +77,13 @@ public class TraderLlama extends Llama { +diff --git a/net/minecraft/world/entity/animal/golem/IronGolem.java b/net/minecraft/world/entity/animal/golem/IronGolem.java +index 677f584b38aeb6805db0bb867f62d5617e309f5e..d31c1f1b681922ca8f1657ffa333e8a6794e619f 100644 +--- a/net/minecraft/world/entity/animal/golem/IronGolem.java ++++ b/net/minecraft/world/entity/animal/golem/IronGolem.java +@@ -99,6 +99,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { } - // Purpur end - Make entity breeding times configurable + // Purpur end - Configurable entity base attributes + // Purpur start - Toggle for water sensitive mob damage + @Override + public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.traderLlamaTakeDamageFromWater; ++ return this.level().purpurConfig.ironGolemTakeDamageFromWater; + } + // Purpur end - Toggle for water sensitive mob damage + @Override - public boolean isTraderLlama() { - return true; -diff --git a/net/minecraft/world/entity/animal/horse/ZombieHorse.java b/net/minecraft/world/entity/animal/horse/ZombieHorse.java -index 0d6d470b8680aed64d2b208b2ed9b037c96563d9..fd8a512910c886af1ae4e66edbf7f8d6fe0bc4f3 100644 ---- a/net/minecraft/world/entity/animal/horse/ZombieHorse.java -+++ b/net/minecraft/world/entity/animal/horse/ZombieHorse.java -@@ -69,6 +69,13 @@ public class ZombieHorse extends AbstractHorse { + protected void registerGoals() { + if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options +diff --git a/net/minecraft/world/entity/animal/golem/SnowGolem.java b/net/minecraft/world/entity/animal/golem/SnowGolem.java +index f011369a67809d54230984a22a909bfea44f47f3..0fe7f18390490ccf4e944ac3378150ebcc53991d 100644 +--- a/net/minecraft/world/entity/animal/golem/SnowGolem.java ++++ b/net/minecraft/world/entity/animal/golem/SnowGolem.java +@@ -124,7 +124,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM + + @Override + public boolean isSensitiveToWater() { +- return true; ++ return this.level().purpurConfig.snowGolemTakeDamageFromWater; // Purpur - Toggle for water sensitive mob damage + } + + @Override +diff --git a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +index d1b6f627860163b3e977e794720dbf36fcd83001..bba0dc5e0fd28ce05adb2d4edb9c0c4366dd580e 100644 +--- a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java ++++ b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +@@ -153,6 +153,13 @@ public class HappyGhast extends Animal { } // Purpur end - Make entity breeding times configurable + // Purpur start - Toggle for water sensitive mob damage + @Override + public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.zombieHorseTakeDamageFromWater; ++ return this.level().purpurConfig.happyGhastTakeDamageFromWater; + } + // Purpur end - Toggle for water sensitive mob damage + - public static AttributeSupplier.Builder createAttributes() { - return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); + @Override + protected void ageBoundaryReached() { + if (this.isBaby()) { +diff --git a/net/minecraft/world/entity/animal/panda/Panda.java b/net/minecraft/world/entity/animal/panda/Panda.java +index 163fe697f57459b36885fa3a18f41370347cab38..e9aa07dea0515f53a08a7066fa9e23e0ee69d69e 100644 +--- a/net/minecraft/world/entity/animal/panda/Panda.java ++++ b/net/minecraft/world/entity/animal/panda/Panda.java +@@ -150,6 +150,13 @@ public class Panda extends Animal { } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.pandaTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { + return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); +diff --git a/net/minecraft/world/entity/animal/parrot/Parrot.java b/net/minecraft/world/entity/animal/parrot/Parrot.java +index 0d62046cb33ed750ab27229fe4f0b43c3a1dd5f4..e97782bc8232120d4e7d1feeb8ca87fd37a1fcf9 100644 +--- a/net/minecraft/world/entity/animal/parrot/Parrot.java ++++ b/net/minecraft/world/entity/animal/parrot/Parrot.java +@@ -214,6 +214,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.parrotTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public @Nullable SpawnGroupData finalizeSpawn( + ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData +diff --git a/net/minecraft/world/entity/animal/pig/Pig.java b/net/minecraft/world/entity/animal/pig/Pig.java +index 824704bdf2412f142dd260633bc8e56f079f5ea4..8d3ab29cd3eff0cbe08742201836382ba75ad50e 100644 +--- a/net/minecraft/world/entity/animal/pig/Pig.java ++++ b/net/minecraft/world/entity/animal/pig/Pig.java +@@ -99,6 +99,13 @@ public class Pig extends Animal implements ItemSteerable { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.pigTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/polarbear/PolarBear.java b/net/minecraft/world/entity/animal/polarbear/PolarBear.java +index 97edd950e2142e73ad947590c99d6d5529cbd44c..13d26a6981d6907f35f1f2bde93934c7c1fe8120 100644 +--- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java ++++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java +@@ -133,6 +133,13 @@ public class PolarBear extends Animal implements NeutralMob { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.polarBearTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return EntityType.POLAR_BEAR.create(level, EntitySpawnReason.BREEDING); +diff --git a/net/minecraft/world/entity/animal/rabbit/Rabbit.java b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +index 66fda64006c0a70ab4502f088637bb6871c3bb37..b1c72047f7aa63f62b0ad0274811b587b1d3486b 100644 +--- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java ++++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +@@ -163,6 +163,13 @@ public class Rabbit extends Animal { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.rabbitTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/animal/sheep/Sheep.java b/net/minecraft/world/entity/animal/sheep/Sheep.java -index baa18417b0b66f33aa3bb21032cd5816dc0ed800..3bdadfed6a06b965193cc615c490f89de65d515e 100644 +index 0e4505474a50d57338c16648cb6049d35455fdc6..7eca49c9237c61ab12f60ff16085aa8fd10c99ac 100644 --- a/net/minecraft/world/entity/animal/sheep/Sheep.java +++ b/net/minecraft/world/entity/animal/sheep/Sheep.java @@ -95,6 +95,13 @@ public class Sheep extends Animal implements Shearable { @@ -638,11 +584,65 @@ index baa18417b0b66f33aa3bb21032cd5816dc0ed800..3bdadfed6a06b965193cc615c490f89d @Override protected void registerGoals() { this.eatBlockGoal = new EatBlockGoal(this); +diff --git a/net/minecraft/world/entity/animal/squid/GlowSquid.java b/net/minecraft/world/entity/animal/squid/GlowSquid.java +index 7d41aaa0546a9ca02e46ce46e61ecc57120bfca9..2aa2a84a7ada369c45a85119a933eb92297af4dc 100644 +--- a/net/minecraft/world/entity/animal/squid/GlowSquid.java ++++ b/net/minecraft/world/entity/animal/squid/GlowSquid.java +@@ -57,6 +57,13 @@ public class GlowSquid extends Squid { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.glowSquidTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected ParticleOptions getInkParticle() { + return ParticleTypes.GLOW_SQUID_INK; +diff --git a/net/minecraft/world/entity/animal/squid/Squid.java b/net/minecraft/world/entity/animal/squid/Squid.java +index 5e4181f95711c6b0299f28de14d95da421dda373..e307ebfb8b2781b6175b520e148e6bd58d2b9dc4 100644 +--- a/net/minecraft/world/entity/animal/squid/Squid.java ++++ b/net/minecraft/world/entity/animal/squid/Squid.java +@@ -101,6 +101,13 @@ public class Squid extends AgeableWaterCreature { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.squidTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); +diff --git a/net/minecraft/world/entity/animal/turtle/Turtle.java b/net/minecraft/world/entity/animal/turtle/Turtle.java +index fce1b1a22e091a1c05650c72e1ceb83e1a1d1ed1..7d5987fe641646ecbf8e389d57a0a9a04e9c0959 100644 +--- a/net/minecraft/world/entity/animal/turtle/Turtle.java ++++ b/net/minecraft/world/entity/animal/turtle/Turtle.java +@@ -119,6 +119,13 @@ public class Turtle extends Animal { + } + // Purpur end - Make entity breeding times configurable + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.turtleTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + public void setHomePos(BlockPos homePos) { + this.homePos = homePos; + } diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index 70b14a44f3d504788218b85317bb3812007386b0..9832cafd14d42d3bf92bb5791d6ded4008215998 100644 +index 08a1bafa0e45dbdbf8bdc4d5cb654d080590707d..20f945ee06bcdb4736e6d3a8b20a5cbd3d79df0f 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -224,6 +224,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -223,6 +223,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Make entity breeding times configurable @@ -657,10 +657,10 @@ index 70b14a44f3d504788218b85317bb3812007386b0..9832cafd14d42d3bf92bb5791d6ded40 protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index bf9c295408902dc02b96e54959231338cd52c29c..5229ea2712436c4b087f1a159e3b1f680f0d237c 100644 +index e14347ccc7b21213801e59fa2e0e47964bc943ad..5efddef6e48bf28aa75041c291d954bbad527726 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -173,6 +173,13 @@ public class EnderDragon extends Mob implements Enemy { +@@ -170,6 +170,13 @@ public class EnderDragon extends Mob implements Enemy { } // Purpur end - Configurable entity base attributes @@ -675,10 +675,10 @@ index bf9c295408902dc02b96e54959231338cd52c29c..5229ea2712436c4b087f1a159e3b1f68 return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 200.0).add(Attributes.CAMERA_DISTANCE, 16.0); } diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 6d35cce3fde4d0cee5fa1266d831fdf97ad85d35..e4f3d21422ccf45aee34885cc7633f37ec0c9903 100644 +index 73dbc5ae28c5af00a36528e0397ad1c2eed14f2c..ef6dcc8183d9963d1e683f2cc74fec6443d175a9 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -222,6 +222,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -221,6 +221,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Configurable entity base attributes @@ -693,7 +693,7 @@ index 6d35cce3fde4d0cee5fa1266d831fdf97ad85d35..e4f3d21422ccf45aee34885cc7633f37 protected PathNavigation createNavigation(Level level) { FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); diff --git a/net/minecraft/world/entity/monster/Blaze.java b/net/minecraft/world/entity/monster/Blaze.java -index cb536ec921c837b86c2c1dfbe1d6b08a9b18bf0f..8941252b8c91ce26097651ab32c139a53c43feb3 100644 +index 4cd7975a8e9e55d6b6ded0b7e13d8da436e49c6c..e2afd7677986c70dd924017e8822fd6abd808f48 100644 --- a/net/minecraft/world/entity/monster/Blaze.java +++ b/net/minecraft/world/entity/monster/Blaze.java @@ -35,7 +35,7 @@ public class Blaze extends Monster { @@ -714,26 +714,8 @@ index cb536ec921c837b86c2c1dfbe1d6b08a9b18bf0f..8941252b8c91ce26097651ab32c139a5 } @Override -diff --git a/net/minecraft/world/entity/monster/CaveSpider.java b/net/minecraft/world/entity/monster/CaveSpider.java -index ca8e92447eb5f58e2bd855ac6fa1d580425218f9..239d855df83083e0eb875c430a165427f3a143de 100644 ---- a/net/minecraft/world/entity/monster/CaveSpider.java -+++ b/net/minecraft/world/entity/monster/CaveSpider.java -@@ -51,6 +51,13 @@ public class CaveSpider extends Spider { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.caveSpiderTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - public boolean doHurtTarget(ServerLevel level, Entity target) { - if (super.doHurtTarget(level, target)) { diff --git a/net/minecraft/world/entity/monster/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index 6259636b9856be5b03af83ee515e70cbf1eb51d8..719c752270c3f1b2496184df0eb728e3c934a3d5 100644 +index ed1ccd712a2fe00740beeee4fe615976258f5c6c..b0ed96c243f9abb3868d92bb513ad1620aa8e269 100644 --- a/net/minecraft/world/entity/monster/Creeper.java +++ b/net/minecraft/world/entity/monster/Creeper.java @@ -266,6 +266,13 @@ public class Creeper extends Monster { @@ -750,24 +732,6 @@ index 6259636b9856be5b03af83ee515e70cbf1eb51d8..719c752270c3f1b2496184df0eb728e3 @Override public SoundEvent getHurtSound(DamageSource damageSource) { return SoundEvents.CREEPER_HURT; -diff --git a/net/minecraft/world/entity/monster/Drowned.java b/net/minecraft/world/entity/monster/Drowned.java -index af8c33c6d8ecbc7c3d8a33fc740adc26a43c08b3..6beaed7f1ce39bef190cfa7e1addc28b929c0747 100644 ---- a/net/minecraft/world/entity/monster/Drowned.java -+++ b/net/minecraft/world/entity/monster/Drowned.java -@@ -123,6 +123,13 @@ public class Drowned extends Zombie implements RangedAttackMob { - } - // Purpur end - Configurable jockey options - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.drownedTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void addBehaviourGoals() { - this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0)); diff --git a/net/minecraft/world/entity/monster/ElderGuardian.java b/net/minecraft/world/entity/monster/ElderGuardian.java index 57fb334f670d35aa181b13e12fa2c5f36da1dda6..1ea323a17440abbe36c9528e80e169816267005b 100644 --- a/net/minecraft/world/entity/monster/ElderGuardian.java @@ -787,10 +751,10 @@ index 57fb334f670d35aa181b13e12fa2c5f36da1dda6..1ea323a17440abbe36c9528e80e16981 return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.3F).add(Attributes.ATTACK_DAMAGE, 8.0).add(Attributes.MAX_HEALTH, 80.0); } diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index 0d2fb6a1b4c8e02e40afa612744e259ef3230c0a..f6cc9107702e5cfa985694c7c88ae21622cd39c6 100644 +index 79a1d8f67a22a8fa4a6c3b657e44bb9503687c27..47c621f01658f3392b58f3f5c1f31bd539f63dd6 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -87,7 +87,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -86,7 +86,7 @@ public class EnderMan extends Monster implements NeutralMob { public EnderMan(EntityType type, Level level) { super(type, level); @@ -799,7 +763,7 @@ index 0d2fb6a1b4c8e02e40afa612744e259ef3230c0a..f6cc9107702e5cfa985694c7c88ae216 } // Purpur start - Ridables -@@ -287,7 +287,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -285,7 +285,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override public boolean isSensitiveToWater() { @@ -826,26 +790,8 @@ index c6ae00f6ab83743b9ce43d9e55f04ba23b0de0f1..c79c689cb99ad2a6cab88cf8b583ff0f @Override protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/monster/Evoker.java b/net/minecraft/world/entity/monster/Evoker.java -index 24d104036902b8aaf79325e33d3063ccea29e13e..9015643b47e2d20a5c75c5f4bf2ec66399d4a2e5 100644 ---- a/net/minecraft/world/entity/monster/Evoker.java -+++ b/net/minecraft/world/entity/monster/Evoker.java -@@ -73,6 +73,13 @@ public class Evoker extends SpellcasterIllager { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.evokerTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Ghast.java b/net/minecraft/world/entity/monster/Ghast.java -index 30b75f7e7a79aaa602083eb07f125a3a5e5f19f9..544f3564411138c59eaad2b0bf50ec01ceb319bf 100644 +index 7d97c00ae49629b97104631317aa6174741cdd5e..443eb9f12d6df950c59c9d4db4853087fd23d24e 100644 --- a/net/minecraft/world/entity/monster/Ghast.java +++ b/net/minecraft/world/entity/monster/Ghast.java @@ -83,6 +83,13 @@ public class Ghast extends Mob implements Enemy { @@ -881,10 +827,10 @@ index e6fb01e4e2146d6c6971d80af0f101d20c03950a..2204c729ce42e89a0b42b365e0060098 return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 100.0) diff --git a/net/minecraft/world/entity/monster/Guardian.java b/net/minecraft/world/entity/monster/Guardian.java -index d206d9b8563dfd38c0ff4c8b4abe00aa064a2305..901338319b78e538208f72ead289f7277fd00eb9 100644 +index 1eaa4f255b01eddc93ddbc5615ad05e7d8273581..9948511659de9222a19f6b9f660e4441ea98a4a9 100644 --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java -@@ -99,6 +99,13 @@ public class Guardian extends Monster { +@@ -97,6 +97,13 @@ public class Guardian extends Monster { } // Purpur end - Configurable entity base attributes @@ -898,44 +844,8 @@ index d206d9b8563dfd38c0ff4c8b4abe00aa064a2305..901338319b78e538208f72ead289f727 @Override protected void registerGoals() { MoveTowardsRestrictionGoal moveTowardsRestrictionGoal = new MoveTowardsRestrictionGoal(this, 1.0); -diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java -index d3e1f5debbd34b8afff06498de48299da37c3add..fe593e955c93f5dd211db11a3e2ae8051e74e164 100644 ---- a/net/minecraft/world/entity/monster/Husk.java -+++ b/net/minecraft/world/entity/monster/Husk.java -@@ -67,6 +67,13 @@ public class Husk extends Zombie { - } - // Purpur end - Configurable jockey options - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.huskTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - public static boolean checkHuskSpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { -diff --git a/net/minecraft/world/entity/monster/Illusioner.java b/net/minecraft/world/entity/monster/Illusioner.java -index b6872c94d769346ed2a8bb2406fc2b39ef64a67c..ee5e0b20f65a5f7d7dc2cf8fea2eff56f8f56a41 100644 ---- a/net/minecraft/world/entity/monster/Illusioner.java -+++ b/net/minecraft/world/entity/monster/Illusioner.java -@@ -84,6 +84,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.illusionerTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java -index db9e4dff83640b1e499db944a0c1cf3b869bc314..bce9a085dfbe06bd4a869ae8d7d407ebbf7ad6b4 100644 +index e0fda9a975e00c49ba09db65d7b3fba8fa434757..1bf9d04e5e44272b02753290995795f194cbdae1 100644 --- a/net/minecraft/world/entity/monster/MagmaCube.java +++ b/net/minecraft/world/entity/monster/MagmaCube.java @@ -68,6 +68,13 @@ public class MagmaCube extends Slime { @@ -953,10 +863,10 @@ index db9e4dff83640b1e499db944a0c1cf3b869bc314..bce9a085dfbe06bd4a869ae8d7d407eb return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F); } diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index 8ebe339c91d61166078291dc9f5f70dd596cc58f..f6ee097af3337c39baacad9a572443141c750223 100644 +index e55470432cebddec43a7d63230eb4391a3d42f8e..ffcbcf2246d739494d522a9a4fc16999655cd7ef 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -130,6 +130,13 @@ public class Phantom extends Mob implements Enemy { +@@ -128,6 +128,13 @@ public class Phantom extends Mob implements Enemy { } // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms @@ -970,29 +880,11 @@ index 8ebe339c91d61166078291dc9f5f70dd596cc58f..f6ee097af3337c39baacad9a57244314 @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; -diff --git a/net/minecraft/world/entity/monster/Pillager.java b/net/minecraft/world/entity/monster/Pillager.java -index 748233be6bdfd735aa3ccc02a7ba21a45603ffa4..1aa2f744b0d875fb874cf23a0601fee48ead66c2 100644 ---- a/net/minecraft/world/entity/monster/Pillager.java -+++ b/net/minecraft/world/entity/monster/Pillager.java -@@ -89,6 +89,13 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.pillagerTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index 0220bb3add91779979cf7591dc1ea18f69f9e7c4..2dcf90e3be35290ed9cbe7cf19aa67d1f9acac80 100644 +index c1ae9826d15456762ac0c0ab7380763242fa48de..f41df50e74823b2ef13de20721a4f237f6617438 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -102,6 +102,13 @@ public class Ravager extends Raider { +@@ -103,6 +103,13 @@ public class Ravager extends Raider { } // Purpur end - Configurable entity base attributes @@ -1007,10 +899,10 @@ index 0220bb3add91779979cf7591dc1ea18f69f9e7c4..2dcf90e3be35290ed9cbe7cf19aa67d1 protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index 3909804ba8f9e220260efe6255ff2b298a4448db..21b28d1ba59656b123aef95a7e18075dae9bc236 100644 +index 30f2503ebd045b05f5594cef28389a694338d13a..0a5a6f23cd8e4317db4e7c0ba8883e99f3aff148 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -134,6 +134,13 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -133,6 +133,13 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Configurable entity base attributes @@ -1025,10 +917,10 @@ index 3909804ba8f9e220260efe6255ff2b298a4448db..21b28d1ba59656b123aef95a7e18075d protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables diff --git a/net/minecraft/world/entity/monster/Silverfish.java b/net/minecraft/world/entity/monster/Silverfish.java -index d81ed52599cf4cba49726f2ad9da4ce1dab14df1..58a759fdfae0ef20decc82842bdf4e9947f51807 100644 +index 3e8e3a6018120576b0773769db7b2037148fae96..1692e7c93234506e22039da071e9c8e8a8567495 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java -@@ -66,6 +66,13 @@ public class Silverfish extends Monster { +@@ -65,6 +65,13 @@ public class Silverfish extends Monster { } // Purpur end - Configurable entity base attributes @@ -1042,29 +934,11 @@ index d81ed52599cf4cba49726f2ad9da4ce1dab14df1..58a759fdfae0ef20decc82842bdf4e99 @Override protected void registerGoals() { this.friendsGoal = new Silverfish.SilverfishWakeUpFriendsGoal(this); -diff --git a/net/minecraft/world/entity/monster/Skeleton.java b/net/minecraft/world/entity/monster/Skeleton.java -index 0a5d78da5f809afde38ebbbcec3798a7a5f0f9be..c7bfa5214fd46c6b5e264314f86ca5c2904bf123 100644 ---- a/net/minecraft/world/entity/monster/Skeleton.java -+++ b/net/minecraft/world/entity/monster/Skeleton.java -@@ -50,6 +50,13 @@ public class Skeleton extends AbstractSkeleton { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.skeletonTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java -index 5af9f8182fa8bc3720cf30ed073ecc8050a76b43..7c5d3c30be47f0cac043e73153a1face837406dd 100644 +index f93a2c58b5835e9ce8318d28e944533ef69df8ef..c4222e17d9a1f4cba6a74099a167cff13856f3e3 100644 --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java -@@ -134,6 +134,13 @@ public class Slime extends Mob implements Enemy { +@@ -135,6 +135,13 @@ public class Slime extends Mob implements Enemy { } // Purpur end - Configurable entity base attributes @@ -1078,44 +952,8 @@ index 5af9f8182fa8bc3720cf30ed073ecc8050a76b43..7c5d3c30be47f0cac043e73153a1face @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -diff --git a/net/minecraft/world/entity/monster/Spider.java b/net/minecraft/world/entity/monster/Spider.java -index 580047cd6a803ffdf6a1887d32731ddfd23316b9..5fa082b5a04d152c72f6053ca6bc4598899ca30c 100644 ---- a/net/minecraft/world/entity/monster/Spider.java -+++ b/net/minecraft/world/entity/monster/Spider.java -@@ -75,6 +75,13 @@ public class Spider extends Monster { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.spiderTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/monster/Stray.java b/net/minecraft/world/entity/monster/Stray.java -index 1be523e22b2fa0f9546eb272f3f68a896a0575c9..1d99432da3df434394a746f0bf4d5cc62c90dcba 100644 ---- a/net/minecraft/world/entity/monster/Stray.java -+++ b/net/minecraft/world/entity/monster/Stray.java -@@ -46,6 +46,13 @@ public class Stray extends AbstractSkeleton { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.strayTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - public static boolean checkStraySpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index 6760c826cf72cc704f54ea0e3d6aaffde4ac22c4..1004aaf885268d08e68e5d2465fae2b5566a4eff 100644 +index ad6515c2dcde0079095c6777f56319e9901850f8..758887f3fcec2bf0946cddb184e19a1c9b64eee3 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -86,7 +86,7 @@ public class Strider extends Animal implements ItemSteerable { @@ -1127,7 +965,7 @@ index 6760c826cf72cc704f54ea0e3d6aaffde4ac22c4..1004aaf885268d08e68e5d2465fae2b5 this.setPathfindingMalus(PathType.LAVA, 0.0F); this.setPathfindingMalus(PathType.DANGER_FIRE, 0.0F); this.setPathfindingMalus(PathType.DAMAGE_FIRE, 0.0F); -@@ -390,7 +390,7 @@ public class Strider extends Animal implements ItemSteerable { +@@ -388,7 +388,7 @@ public class Strider extends Animal implements ItemSteerable { @Override public boolean isSensitiveToWater() { @@ -1137,10 +975,10 @@ index 6760c826cf72cc704f54ea0e3d6aaffde4ac22c4..1004aaf885268d08e68e5d2465fae2b5 @Override diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index 09211a8a5b893f878ad173c4ab71393c8f309f58..13285c9f233c3240729de4baf5f014e25b245547 100644 +index 32759864a8ff0c4e28ce80ae8906cbcf1927094e..6ead673c44891c6b1c1688f80bf299527d7bc777 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -112,6 +112,13 @@ public class Vex extends Monster implements TraceableEntity { +@@ -110,6 +110,13 @@ public class Vex extends Monster implements TraceableEntity { } // Purpur end - Configurable entity base attributes @@ -1154,26 +992,8 @@ index 09211a8a5b893f878ad173c4ab71393c8f309f58..13285c9f233c3240729de4baf5f014e2 @Override public boolean isFlapping() { return this.tickCount % TICKS_PER_FLAP == 0; -diff --git a/net/minecraft/world/entity/monster/Vindicator.java b/net/minecraft/world/entity/monster/Vindicator.java -index fdaf024a27825844105ef62baddf30e3b4412d28..33452593731c53f404059271b3fbb0407d75517c 100644 ---- a/net/minecraft/world/entity/monster/Vindicator.java -+++ b/net/minecraft/world/entity/monster/Vindicator.java -@@ -81,6 +81,13 @@ public class Vindicator extends AbstractIllager { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.vindicatorTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java -index 35dc597e5b0e703319eb5ff31bde0960b224fc40..a785deb09373e20c13f8be49626d9619491b02c8 100644 +index 3c3c258d4cc7cf7376d0d3ad0794ec3611ab81ce..86d9952ed0f692e8f229b0c0bcb6cacf53a00c8b 100644 --- a/net/minecraft/world/entity/monster/Witch.java +++ b/net/minecraft/world/entity/monster/Witch.java @@ -82,6 +82,13 @@ public class Witch extends Raider implements RangedAttackMob { @@ -1190,26 +1010,8 @@ index 35dc597e5b0e703319eb5ff31bde0960b224fc40..a785deb09373e20c13f8be49626d9619 @Override protected void registerGoals() { super.registerGoals(); -diff --git a/net/minecraft/world/entity/monster/WitherSkeleton.java b/net/minecraft/world/entity/monster/WitherSkeleton.java -index 4d4e04d9fb5b68897ffa6f299bd2009bb397da3d..778779c79c56e2ca438ecbb82fbb16d70d312524 100644 ---- a/net/minecraft/world/entity/monster/WitherSkeleton.java -+++ b/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -59,6 +59,13 @@ public class WitherSkeleton extends AbstractSkeleton { - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.witherSkeletonTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index e7e840ba5383c28e0167e7dd032359403ae3224a..d9ca3944fce3464be69ca1b3b5191e2d8de01e3d 100644 +index e0192a13b8d7131024471569bf34329ba0f28287..e2708eb836d60588c1bedb75c520e5007185034a 100644 --- a/net/minecraft/world/entity/monster/Zoglin.java +++ b/net/minecraft/world/entity/monster/Zoglin.java @@ -112,6 +112,13 @@ public class Zoglin extends Monster implements HoglinBase { @@ -1226,65 +1028,11 @@ index e7e840ba5383c28e0167e7dd032359403ae3224a..d9ca3944fce3464be69ca1b3b5191e2d @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index 3095dfbba2c3e61a550abc7c48e91f5704909e03..23484fe8ca8568d533e1604876900f75a96ac6d8 100644 ---- a/net/minecraft/world/entity/monster/Zombie.java -+++ b/net/minecraft/world/entity/monster/Zombie.java -@@ -142,6 +142,13 @@ public class Zombie extends Monster { - } - // Purpur end - Configurable jockey options - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.zombieTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index cf88072320f46ec9cf2194f8debe05e33702521f..5ae0e9d5f3c3b7a6f64775396acf061ff0d3561f 100644 ---- a/net/minecraft/world/entity/monster/ZombieVillager.java -+++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -121,6 +121,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - } - // Purpur end - Configurable jockey options - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.zombieVillagerTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 06e2207d7ea554226b02d65c7fb612a87da71caa..46520af2dcf89a54374b933f5acdb8d2c66abbff 100644 ---- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java -+++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -106,6 +106,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - } - // Purpur end - Configurable jockey options - -+ // Purpur start - Toggle for water sensitive mob damage -+ @Override -+ public boolean isSensitiveToWater() { -+ return this.level().purpurConfig.zombifiedPiglinTakeDamageFromWater; -+ } -+ // Purpur end - Toggle for water sensitive mob damage -+ - @Override - public void setPersistentAngerTarget(@Nullable UUID target) { - this.persistentAngerTarget = target; diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 1f5096856ab353e2920003a54f530c952e8988da..053c47fcaf4e5d3bc8f9a3d913508a7816b15747 100644 +index 4498fe26dff2cdec8e90d6559a66ebe7859195bb..5e3f7005a7167c786038823a8437ad2e90a41d2c 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -128,6 +128,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -129,6 +129,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { } // Purpur end - Make entity breeding times configurable @@ -1298,11 +1046,83 @@ index 1f5096856ab353e2920003a54f530c952e8988da..053c47fcaf4e5d3bc8f9a3d913508a78 @VisibleForTesting public void setTimeInOverworld(int timeInOverworld) { this.timeInOverworld = timeInOverworld; +diff --git a/net/minecraft/world/entity/monster/illager/Evoker.java b/net/minecraft/world/entity/monster/illager/Evoker.java +index 334786b2c358c41058f2ac4b1fa4b185833cbd84..c4f45f6303a46ad54991c9013608a4e5ba8b9fee 100644 +--- a/net/minecraft/world/entity/monster/illager/Evoker.java ++++ b/net/minecraft/world/entity/monster/illager/Evoker.java +@@ -74,6 +74,13 @@ public class Evoker extends SpellcasterIllager { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.evokerTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/illager/Illusioner.java b/net/minecraft/world/entity/monster/illager/Illusioner.java +index 8fa53cccb73b2d8c599c898f298681735007d2a0..32278f51f4973d1294e52f0775697e9f5b295ee0 100644 +--- a/net/minecraft/world/entity/monster/illager/Illusioner.java ++++ b/net/minecraft/world/entity/monster/illager/Illusioner.java +@@ -86,6 +86,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.illusionerTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/illager/Pillager.java b/net/minecraft/world/entity/monster/illager/Pillager.java +index 1e43c69366287c7a191a6f8e3a7d5459743f07a2..6190286ab2f454382d497b4fce47632e6f771215 100644 +--- a/net/minecraft/world/entity/monster/illager/Pillager.java ++++ b/net/minecraft/world/entity/monster/illager/Pillager.java +@@ -90,6 +90,13 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.pillagerTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/illager/Vindicator.java b/net/minecraft/world/entity/monster/illager/Vindicator.java +index 5f3857186e86e27fe237c62cec4af13ebf58debe..86b463a16e8630af4918ea43a2546995aa00244f 100644 +--- a/net/minecraft/world/entity/monster/illager/Vindicator.java ++++ b/net/minecraft/world/entity/monster/illager/Vindicator.java +@@ -82,6 +82,13 @@ public class Vindicator extends AbstractIllager { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.vindicatorTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index de65ff0bf3de1d20360bc0ebb1cd3dc48c5560fe..293d6359469095c5faf87ec574ac8a475ce33ba9 100644 +index 4fccd122a227e5fe80965c37afaa031c4a673978..d6c834914ddea76280466bf0f7d001a76af34f08 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -161,6 +161,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -166,6 +166,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento } // Purpur end - Configurable entity base attributes @@ -1317,7 +1137,7 @@ index de65ff0bf3de1d20360bc0ebb1cd3dc48c5560fe..293d6359469095c5faf87ec574ac8a47 protected void addAdditionalSaveData(ValueOutput output) { super.addAdditionalSaveData(output); diff --git a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index 31e38737806098795de0e87fbcaf60d4ab83ea6e..e988a65cbd1f71f488fa8221ef11b6b1a05dc554 100644 +index 3d34bef7ffe9e66e77e3fc10b2c5869d98a4a5c9..4bf2038fea712e65f420ade915a18470b79318fc 100644 --- a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java @@ -90,6 +90,13 @@ public class PiglinBrute extends AbstractPiglin { @@ -1334,10 +1154,190 @@ index 31e38737806098795de0e87fbcaf60d4ab83ea6e..e988a65cbd1f71f488fa8221ef11b6b1 public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) -diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 03b4130179b34735243b3c0b86879dbb7d9f9f00..2a145e4eb0474950cbfb4a229891b4b2320d98d2 100644 ---- a/net/minecraft/world/entity/npc/Villager.java -+++ b/net/minecraft/world/entity/npc/Villager.java +diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java +index 96d989cffc6ff72954ed92e2535c72992d489372..30d79be765118a50e2e2c5bfde6bf6bbc957cf40 100644 +--- a/net/minecraft/world/entity/monster/skeleton/Skeleton.java ++++ b/net/minecraft/world/entity/monster/skeleton/Skeleton.java +@@ -50,6 +50,13 @@ public class Skeleton extends AbstractSkeleton { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.skeletonTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java +index 575f30cc9a6166a4e0733cc33e8b5814acb92660..ec19c49d195daff5839c991cce63b1ffc15a7e0b 100644 +--- a/net/minecraft/world/entity/monster/skeleton/Stray.java ++++ b/net/minecraft/world/entity/monster/skeleton/Stray.java +@@ -47,6 +47,13 @@ public class Stray extends AbstractSkeleton { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.strayTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + public static boolean checkStraySpawnRules( + EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { +diff --git a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java +index f38bb54c0f5d7797179e5e75eb8092baea7b9dcb..3e8cc658b333f1259784e1426896ac8b8c1537fa 100644 +--- a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java ++++ b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java +@@ -59,6 +59,13 @@ public class WitherSkeleton extends AbstractSkeleton { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.witherSkeletonTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); +diff --git a/net/minecraft/world/entity/monster/spider/CaveSpider.java b/net/minecraft/world/entity/monster/spider/CaveSpider.java +index a1391173cc4997df723c59f176726dde88491978..fad3e951e443f04f5bf0423cde42c0ae299a4236 100644 +--- a/net/minecraft/world/entity/monster/spider/CaveSpider.java ++++ b/net/minecraft/world/entity/monster/spider/CaveSpider.java +@@ -51,6 +51,13 @@ public class CaveSpider extends Spider { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.caveSpiderTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public boolean doHurtTarget(ServerLevel level, Entity target) { + if (super.doHurtTarget(level, target)) { +diff --git a/net/minecraft/world/entity/monster/spider/Spider.java b/net/minecraft/world/entity/monster/spider/Spider.java +index 6a9c807ed50dab4b65787d9f7269385103fa5f26..81c500de41b11d4aa6c52dc290f132ad2c23f009 100644 +--- a/net/minecraft/world/entity/monster/spider/Spider.java ++++ b/net/minecraft/world/entity/monster/spider/Spider.java +@@ -77,6 +77,13 @@ public class Spider extends Monster { + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.spiderTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/monster/zombie/Drowned.java b/net/minecraft/world/entity/monster/zombie/Drowned.java +index 3b1e3e7c1218cbfdfe48db3fad15280f43fd3311..fe02f54adaaed855c5d078281207a5fe8e182087 100644 +--- a/net/minecraft/world/entity/monster/zombie/Drowned.java ++++ b/net/minecraft/world/entity/monster/zombie/Drowned.java +@@ -126,6 +126,13 @@ public class Drowned extends Zombie implements RangedAttackMob { + } + // Purpur end - Configurable jockey options + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.drownedTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void addBehaviourGoals() { + this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0)); +diff --git a/net/minecraft/world/entity/monster/zombie/Husk.java b/net/minecraft/world/entity/monster/zombie/Husk.java +index d31145fee0f646d734e90199288b29f07854d066..928e2c95146bc3fc9b8c41c5b6c3970fc919bb15 100644 +--- a/net/minecraft/world/entity/monster/zombie/Husk.java ++++ b/net/minecraft/world/entity/monster/zombie/Husk.java +@@ -75,6 +75,13 @@ public class Husk extends Zombie { + } + // Purpur end - Configurable jockey options + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.huskTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + public boolean isSunSensitive() { + return false; +diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java +index 638642628c3dc9fa25d25c589029219c23d1e602..dfdf9ee98a25ec1f7a1f41326c98155131494d93 100644 +--- a/net/minecraft/world/entity/monster/zombie/Zombie.java ++++ b/net/minecraft/world/entity/monster/zombie/Zombie.java +@@ -142,6 +142,13 @@ public class Zombie extends Monster { + } + // Purpur end - Configurable jockey options + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.zombieTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables +diff --git a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +index a80788fc6c537fb0d1f400819c7910d11aeda8d5..8ed04b75cc0a2fa0d18eb7929be8f14dc5fb38b8 100644 +--- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java ++++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +@@ -118,6 +118,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { + } + // Purpur end - Configurable jockey options + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.zombieVillagerTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +index ec39ad6740361774f9ecfda7186cab9d8fac90f2..9a1da88752b0dd708365dd41a074cc0e90f36e1c 100644 +--- a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java ++++ b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +@@ -106,6 +106,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + } + // Purpur end - Configurable jockey options + ++ // Purpur start - Toggle for water sensitive mob damage ++ @Override ++ public boolean isSensitiveToWater() { ++ return this.level().purpurConfig.zombifiedPiglinTakeDamageFromWater; ++ } ++ // Purpur end - Toggle for water sensitive mob damage ++ + @Override + protected void addBehaviourGoals() { + this.goalSelector.addGoal(1, new SpearUseGoal<>(this, 1.0, 1.0, 10.0F, 2.0F)); +diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java +index 810f1dc6506ca037363060aec1c90b9fc1602cd8..b8409bb066039766e0b4f680b35c3bc16e5c37d8 100644 +--- a/net/minecraft/world/entity/npc/villager/Villager.java ++++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -282,6 +282,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } // Purpur end - Configurable entity base attributes @@ -1352,11 +1352,11 @@ index 03b4130179b34735243b3c0b86879dbb7d9f9f00..2a145e4eb0474950cbfb4a229891b4b2 @Override public Brain getBrain() { return (Brain)super.getBrain(); -diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java -index e5a6cc63d29be742be039053c39f983ed9c6a1e1..6e5f5711b729b41f5221fb7e7d0c8dad57f790ca 100644 ---- a/net/minecraft/world/entity/npc/WanderingTrader.java -+++ b/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -98,6 +98,13 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +index c6c4f4f2a970db7e782181eaca312931b192b0d5..cabebbc25788a8c41912f97dac85af41c9433b68 100644 +--- a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java ++++ b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +@@ -99,6 +99,13 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over } // Purpur end - Villagers follow emerald blocks diff --git a/purpur-server/minecraft-patches/unapplied-features/0018-API-for-any-mob-to-burn-daylight.patch b/purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch similarity index 59% rename from purpur-server/minecraft-patches/unapplied-features/0018-API-for-any-mob-to-burn-daylight.patch rename to purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch index 6bfa7844c..cfa5f5410 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0018-API-for-any-mob-to-burn-daylight.patch +++ b/purpur-server/minecraft-patches/features/0018-API-for-any-mob-to-burn-daylight.patch @@ -6,19 +6,19 @@ Subject: [PATCH] API for any mob to burn daylight Co-authored by: Encode42 diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java -index 046cf7d2146f68bf1b959ae19fd034a241e12164..a45d8f5355becd08cbd247b3a489667bdfc73995 100644 +index 56a066c5452ee9fc16d176df46ecfbd9584a3783..c1d0c1d1ff1314075c16dfcdfc163c5cc71dbc20 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -543,6 +543,24 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -544,6 +544,24 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name } // Purpur end - Add canSaveToDisk to Entity + // Purpur start - copied from Mob - API for any mob to burn daylight + public boolean isSunBurnTick() { -+ if (this.level().isBrightOutside() && !this.level().isClientSide()) { ++ if (!this.level().isClientSide() && this.level().environmentAttributes().getValue(EnvironmentAttributes.MONSTERS_BURN, this.position())) { + float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue(); + BlockPos blockPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); -+ boolean flag = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; ++ boolean flag = this.isInWater() || this.isInPowderSnow || this.wasInPowderSnow; + if (lightLevelDependentMagicValue > 0.5F + && this.random.nextFloat() * 30.0F < (lightLevelDependentMagicValue - 0.4F) * 2.0F + && !flag @@ -35,18 +35,18 @@ index 046cf7d2146f68bf1b959ae19fd034a241e12164..a45d8f5355becd08cbd247b3a489667b this.type = type; this.level = level; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 38750906a1e15c1758c4b54eca6be0170047a2d1..c528300563a5318969c5acab6971b2257a57a112 100644 +index 34d5283bbc76b4b6c335de354fc2edc1046dcfd1..9aef157abdc61a91101cc0d103524e12b08887a5 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -287,6 +287,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - public org.bukkit.craftbukkit.entity.CraftLivingEntity getBukkitLivingEntity() { return (org.bukkit.craftbukkit.entity.CraftLivingEntity) super.getBukkitEntity(); } // Paper +@@ -290,6 +290,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin public boolean silentDeath = false; // Paper - mark entity as dying silently for cancellable death event public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API + public int invulnerableDuration = LivingEntity.INVULNERABLE_DURATION; // Paper - configurable invulnerable duration + protected boolean shouldBurnInDay = false; public boolean shouldBurnInDay() { return this.shouldBurnInDay; } public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; } // Purpur - API for any mob to burn daylight // CraftBukkit end protected LivingEntity(EntityType type, Level level) { -@@ -796,6 +797,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -793,6 +794,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.getSleepingPos().ifPresent(blockPos -> output.store("sleeping_pos", BlockPos.CODEC, blockPos)); DataResult> dataResult = this.brain.serializeStart(NbtOps.INSTANCE).map(tag -> new Dynamic<>(NbtOps.INSTANCE, tag)); dataResult.resultOrPartial(LOGGER::error).ifPresent(dynamic -> output.store("Brain", Codec.PASSTHROUGH, (Dynamic)dynamic)); @@ -54,7 +54,7 @@ index 38750906a1e15c1758c4b54eca6be0170047a2d1..c528300563a5318969c5acab6971b225 if (this.lastHurtByPlayer != null) { this.lastHurtByPlayer.store(output, "last_hurt_by_player"); output.putInt("last_hurt_by_player_memory_time", this.lastHurtByPlayerMemoryTime); -@@ -922,6 +924,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -917,6 +919,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin } // Paper - The sleeping pos will always also set the actual pos, so a desync suggests something is wrong }, this::clearSleepingPos); input.read("Brain", Codec.PASSTHROUGH).ifPresent(dynamic -> this.brain = this.makeBrain((Dynamic)dynamic)); @@ -62,13 +62,13 @@ index 38750906a1e15c1758c4b54eca6be0170047a2d1..c528300563a5318969c5acab6971b225 this.lastHurtByPlayer = EntityReference.read(input, "last_hurt_by_player"); this.lastHurtByPlayerMemoryTime = input.getIntOr("last_hurt_by_player_memory_time", 0); this.lastHurtByMob = EntityReference.read(input, "last_hurt_by_mob"); -@@ -3720,6 +3723,32 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3850,6 +3853,32 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin if (this.level() instanceof ServerLevel serverLevel && this.isSensitiveToWater() && this.isInWaterOrRain()) { this.hurtServer(serverLevel, this.damageSources().drown(), 1.0F); } + -+ // Purpur start - copied from Zombie - API for any mob to burn daylight -+ if (this.isAlive()) { ++ // Purpur start - copied from Mob - API for any mob to burn daylight ++ if (this.getType().is(EntityTypeTags.BURN_IN_DAYLIGHT) && this.isAlive()) { + boolean flag = this.shouldBurnInDay() && this.isSunBurnTick(); // Paper - shouldBurnInDay API // Purpur - use shouldBurnInDay() method to handle Phantoms properly - API for any mob to burn daylight + if (flag) { + ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD); @@ -91,41 +91,85 @@ index 38750906a1e15c1758c4b54eca6be0170047a2d1..c528300563a5318969c5acab6971b225 + } + } + } -+ // Purpur end - copied from Zombie - API for any mob to burn daylight ++ // Purpur end - copied from Mob - API for any mob to burn daylight } protected void applyInput() { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 2d0efa66b33daa78479d01bd5ed8d558f0e0ae2d..8ca2005133aaf76ecd437e8d9317ea05a303f79d 100644 +index 70807b4a6c94b0231eb541c7121d925d88022ac6..73b3d43d9073c8f2fe09e1f1d9d4a7a0a01eeb94 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java -@@ -1589,19 +1589,8 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -544,9 +544,9 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + @Override + public void aiStep() { + super.aiStep(); +- if (this.getType().is(EntityTypeTags.BURN_IN_DAYLIGHT)) { ++ /*if (this.getType().is(EntityTypeTags.BURN_IN_DAYLIGHT)) { // Purpur start - implemented in LivingEntity - API for any mob to burn daylight + this.burnUndead(); +- } ++ }*/ // Purpur end - implemented in LivingEntity - API for any mob to burn daylight + + ProfilerFiller profilerFiller = Profiler.get(); + profilerFiller.push("looting"); +diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java +index ffcbcf2246d739494d522a9a4fc16999655cd7ef..e7e3949e4ccea1f5160fc687c2ff2704c1be3b2d 100644 +--- a/net/minecraft/world/entity/monster/Phantom.java ++++ b/net/minecraft/world/entity/monster/Phantom.java +@@ -52,7 +52,7 @@ public class Phantom extends Mob implements Enemy { + Vec3 crystalPosition; // Purpur - Phantoms attracted to crystals and crystals shoot phantoms + // Paper start + public java.util.@Nullable UUID spawningEntity; +- public boolean shouldBurnInDay = true; ++ //public boolean shouldBurnInDay = true; // Purpur - API for any mob to burn daylight + // Paper end + 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 - Phantoms burn in light + +@@ -61,6 +61,7 @@ public class Phantom extends Mob implements Enemy { + this.xpReward = 5; + this.moveControl = new Phantom.PhantomMoveControl(this); + this.lookControl = new Phantom.PhantomLookControl(this); ++ this.setShouldBurnInDay(true); // Purpur - API for any mob to burn daylight } - public boolean isSunBurnTick() { -- if (this.level().isBrightOutside() && !this.level().isClientSide()) { -- float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue(); -- BlockPos blockPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); -- boolean flag = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; -- if (lightLevelDependentMagicValue > 0.5F -- && this.random.nextFloat() * 30.0F < (lightLevelDependentMagicValue - 0.4F) * 2.0F -- && !flag -- && this.level().canSeeSky(blockPos)) { -- return true; -- } -- } -- -- return false; -+ // Purpur - implemented in Entity - API for any mob to burn daylight -+ return super.isSunBurnTick(); + // Purpur start - Ridables +@@ -243,12 +244,12 @@ public class Phantom extends Mob implements Enemy { + } } +- // Paper start ++ /*// Paper start // Purpur start - implemented in LivingEntity - API for any mob to burn daylight + @Override + public boolean isSunBurnTick() { + return this.shouldBurnInDay && super.isSunBurnTick(); + } +- // Paper end ++ */// Paper end // Purpur end - implemented in LivingEntity - API for any mob to burn daylight + @Override -diff --git a/net/minecraft/world/entity/monster/AbstractSkeleton.java b/net/minecraft/world/entity/monster/AbstractSkeleton.java -index 7e43dd4b44335989127cc1b6e2c59d771876887a..14730f53561dec218b0fa6648c8de2b2157165fc 100644 ---- a/net/minecraft/world/entity/monster/AbstractSkeleton.java -+++ b/net/minecraft/world/entity/monster/AbstractSkeleton.java -@@ -64,11 +64,12 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo + protected void checkFallDamage(double y, boolean onGround, BlockState state, BlockPos pos) { +@@ -293,7 +294,7 @@ public class Phantom extends Mob implements Enemy { + this.setPhantomSize(input.getIntOr("size", 0)); + // Paper start + this.spawningEntity = input.read("Paper.SpawningEntity", net.minecraft.core.UUIDUtil.CODEC).orElse(null); +- this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); ++ //this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); // Purpur - implemented in LivingEntity - API for any mob to burn daylight + // Paper end + } + +@@ -304,7 +305,7 @@ public class Phantom extends Mob implements Enemy { + output.putInt("size", this.getPhantomSize()); + // Paper start + output.storeNullable("Paper.SpawningEntity", net.minecraft.core.UUIDUtil.CODEC, this.spawningEntity); +- output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); ++ //output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - implemented in LivingEntity - API for any mob to burn daylight + // Paper end + } + +diff --git a/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java b/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java +index 1ab860be69bcc1ab5cc07418c2d7e733afdc482b..60afd81d3bf671889fbff5d4a3fabb38a8e2d461 100644 +--- a/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java ++++ b/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java +@@ -66,11 +66,12 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo AbstractSkeleton.this.setAggressive(true); } }; @@ -139,36 +183,7 @@ index 7e43dd4b44335989127cc1b6e2c59d771876887a..14730f53561dec218b0fa6648c8de2b2 } @Override -@@ -110,27 +111,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo - - @Override - public void aiStep() { -- boolean isSunBurnTick = this.shouldBurnInDay && this.isSunBurnTick(); // Paper - shouldBurnInDay API -- if (isSunBurnTick) { -- ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD); -- if (!itemBySlot.isEmpty()) { -- if (itemBySlot.isDamageableItem()) { -- Item item = itemBySlot.getItem(); -- itemBySlot.setDamageValue(itemBySlot.getDamageValue() + this.random.nextInt(2)); -- if (itemBySlot.getDamageValue() >= itemBySlot.getMaxDamage()) { -- this.onEquippedItemBroken(item, EquipmentSlot.HEAD); -- this.setItemSlot(EquipmentSlot.HEAD, ItemStack.EMPTY); -- } -- } -- -- isSunBurnTick = false; -- } -- -- if (isSunBurnTick) { -- this.igniteForSeconds(8.0F); -- } -- } -- -+ // Purpur - implemented in LivingEntity - API for any mob to burn daylight - super.aiStep(); - } - -@@ -245,14 +226,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo +@@ -223,14 +224,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo protected void readAdditionalSaveData(ValueInput input) { super.readAdditionalSaveData(input); this.reassessWeaponGoal(); @@ -185,11 +200,11 @@ index 7e43dd4b44335989127cc1b6e2c59d771876887a..14730f53561dec218b0fa6648c8de2b2 } // Paper end - shouldBurnInDay API -diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java -index fe593e955c93f5dd211db11a3e2ae8051e74e164..ac02f6abf186a1f31e48fd4ed8181e22919c2f04 100644 ---- a/net/minecraft/world/entity/monster/Husk.java -+++ b/net/minecraft/world/entity/monster/Husk.java -@@ -19,6 +19,7 @@ import net.minecraft.world.level.block.LevelEvent; +diff --git a/net/minecraft/world/entity/monster/zombie/Husk.java b/net/minecraft/world/entity/monster/zombie/Husk.java +index 928e2c95146bc3fc9b8c41c5b6c3970fc919bb15..31b91dbc3f3e1875fbe6750bb815514686d14f7f 100644 +--- a/net/minecraft/world/entity/monster/zombie/Husk.java ++++ b/net/minecraft/world/entity/monster/zombie/Husk.java +@@ -27,6 +27,7 @@ import org.jspecify.annotations.Nullable; public class Husk extends Zombie { public Husk(EntityType type, Level level) { super(type, level); @@ -197,7 +212,7 @@ index fe593e955c93f5dd211db11a3e2ae8051e74e164..ac02f6abf186a1f31e48fd4ed8181e22 } // Purpur start - Ridables -@@ -82,7 +83,7 @@ public class Husk extends Zombie { +@@ -84,7 +85,7 @@ public class Husk extends Zombie { @Override public boolean isSunSensitive() { @@ -206,83 +221,10 @@ index fe593e955c93f5dd211db11a3e2ae8051e74e164..ac02f6abf186a1f31e48fd4ed8181e22 } @Override -diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index f6ee097af3337c39baacad9a572443141c750223..332c08a2d0d0fe2e8c7e9461bb73a73ddee91b94 100644 ---- a/net/minecraft/world/entity/monster/Phantom.java -+++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -54,7 +54,7 @@ public class Phantom extends Mob implements Enemy { - // Paper start - @Nullable - public java.util.UUID spawningEntity; -- public boolean shouldBurnInDay = true; -+ //public boolean shouldBurnInDay = true; // Purpur - API for any mob to burn daylight - // Paper end - 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 - Phantoms burn in light - -@@ -63,6 +63,7 @@ public class Phantom extends Mob implements Enemy { - this.xpReward = 5; - this.moveControl = new Phantom.PhantomMoveControl(this); - this.lookControl = new Phantom.PhantomLookControl(this); -+ this.setShouldBurnInDay(true); // Purpur - API for any mob to burn daylight - } - - // Purpur start - Ridables -@@ -137,6 +138,16 @@ public class Phantom extends Mob implements Enemy { - } - // Purpur end - Toggle for water sensitive mob damage - -+ //private boolean shouldBurnInDay = true; // Purpur - moved to LivingEntity; keep methods for ABI compatibility - API for any mob to burn daylight -+ // Purpur start - API for any mob to burn daylight -+ public boolean shouldBurnInDay() { -+ boolean burnFromDaylight = this.shouldBurnInDay && this.level().purpurConfig.phantomBurnInDaylight; -+ boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight; -+ return burnFromDaylight || burnFromLightSource; -+ } -+ public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; } -+ // Purpur end - API for any mob to burn daylight -+ - @Override - public boolean isFlapping() { - return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; -@@ -247,15 +258,7 @@ public class Phantom extends Mob implements Enemy { - - @Override - public void aiStep() { -- // Purpur start - Phantoms burn in light -- boolean burnFromDaylight = this.shouldBurnInDay && this.isSunBurnTick() && this.level().purpurConfig.phantomBurnInDaylight; -- boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight; -- if (this.isAlive() && (burnFromDaylight || burnFromLightSource)) { // Paper - shouldBurnInDay API -- // Purpur end - Phantoms burn in light -- if (getRider() == null || !this.isControllable()) // Purpur - Ridables -- this.igniteForSeconds(8.0F); -- } -- -+ // Purpur - implemented in LivingEntity; moved down to shouldBurnInDay() - API for any mob to burn daylight - super.aiStep(); - } - -@@ -302,7 +305,7 @@ public class Phantom extends Mob implements Enemy { - this.setPhantomSize(input.getIntOr("size", 0)); - // Paper start - this.spawningEntity = input.read("Paper.SpawningEntity", net.minecraft.core.UUIDUtil.CODEC).orElse(null); -- this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); -+ //this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); // Purpur - implemented in LivingEntity - API for any mob to burn daylight - // Paper end - } - -@@ -313,7 +316,7 @@ public class Phantom extends Mob implements Enemy { - output.putInt("size", this.getPhantomSize()); - // Paper start - output.storeNullable("Paper.SpawningEntity", net.minecraft.core.UUIDUtil.CODEC, this.spawningEntity); -- output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); -+ //output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - implemented in LivingEntity - API for any mob to burn daylight - // Paper end - } - -diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index 23484fe8ca8568d533e1604876900f75a96ac6d8..1280605d393d0afda475c5d54b073824d141a460 100644 ---- a/net/minecraft/world/entity/monster/Zombie.java -+++ b/net/minecraft/world/entity/monster/Zombie.java +diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java +index dfdf9ee98a25ec1f7a1f41326c98155131494d93..d32a831ba76f65c4719c2672ffaec81a861cc7e6 100644 +--- a/net/minecraft/world/entity/monster/zombie/Zombie.java ++++ b/net/minecraft/world/entity/monster/zombie/Zombie.java @@ -92,11 +92,12 @@ public class Zombie extends Monster { private boolean canBreakDoors = false; private int inWaterTime = 0; @@ -297,38 +239,7 @@ index 23484fe8ca8568d533e1604876900f75a96ac6d8..1280605d393d0afda475c5d54b073824 } public Zombie(Level level) { -@@ -293,29 +294,7 @@ public class Zombie extends Monster { - - @Override - public void aiStep() { -- if (this.isAlive()) { -- boolean flag = this.isSunSensitive() && this.isSunBurnTick(); -- if (flag) { -- ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD); -- if (!itemBySlot.isEmpty()) { -- if (itemBySlot.isDamageableItem()) { -- Item item = itemBySlot.getItem(); -- itemBySlot.setDamageValue(itemBySlot.getDamageValue() + this.random.nextInt(2)); -- if (itemBySlot.getDamageValue() >= itemBySlot.getMaxDamage()) { -- this.onEquippedItemBroken(item, EquipmentSlot.HEAD); -- this.setItemSlot(EquipmentSlot.HEAD, ItemStack.EMPTY); -- } -- } -- -- flag = false; -- } -- -- if (flag) { -- this.igniteForSeconds(8.0F); -- } -- } -- } -- -+ // Purpur - implemented in LivingEntity - API for any mob to burn daylight - super.aiStep(); - } - -@@ -374,6 +353,7 @@ public class Zombie extends Monster { +@@ -347,6 +348,7 @@ public class Zombie extends Monster { // CraftBukkit end } @@ -336,7 +247,7 @@ index 23484fe8ca8568d533e1604876900f75a96ac6d8..1280605d393d0afda475c5d54b073824 public boolean isSunSensitive() { return this.shouldBurnInDay; // Paper - Add more Zombie API } -@@ -511,7 +491,7 @@ public class Zombie extends Monster { +@@ -486,7 +488,7 @@ public class Zombie extends Monster { output.putBoolean("CanBreakDoors", this.canBreakDoors()); output.putInt("InWaterTime", this.isInWater() ? this.inWaterTime : -1); output.putInt("DrownedConversionTime", this.isUnderWaterConverting() ? this.conversionTime : -1); @@ -345,7 +256,7 @@ index 23484fe8ca8568d533e1604876900f75a96ac6d8..1280605d393d0afda475c5d54b073824 } @Override -@@ -526,7 +506,7 @@ public class Zombie extends Monster { +@@ -501,7 +503,7 @@ public class Zombie extends Monster { } else { this.getEntityData().set(DATA_DROWNED_CONVERSION_ID, false); } diff --git a/purpur-server/minecraft-patches/unapplied-features/0019-Cows-naturally-aggressive-to-players-chance.patch b/purpur-server/minecraft-patches/features/0019-Cows-naturally-aggressive-to-players-chance.patch similarity index 87% rename from purpur-server/minecraft-patches/unapplied-features/0019-Cows-naturally-aggressive-to-players-chance.patch rename to purpur-server/minecraft-patches/features/0019-Cows-naturally-aggressive-to-players-chance.patch index 05705aa3c..c010b48ba 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0019-Cows-naturally-aggressive-to-players-chance.patch +++ b/purpur-server/minecraft-patches/features/0019-Cows-naturally-aggressive-to-players-chance.patch @@ -5,24 +5,24 @@ Subject: [PATCH] Cows naturally aggressive to players chance diff --git a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -index 48be4530b25d273032ff1a055406c7cca928d678..65f48ced39fe3bffaea34b1f8d83374bfd5cc1c8 100644 +index 9bc35ca825e300e82d2d108de70622f8f453bff6..2db06c40b4a1841e96d02e3d90e2c98a6f709d30 100644 --- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -@@ -131,7 +131,7 @@ public class DefaultAttributes { +@@ -135,7 +135,7 @@ public class DefaultAttributes { .put(EntityType.LLAMA, Llama.createAttributes().build()) .put(EntityType.MAGMA_CUBE, MagmaCube.createAttributes().build()) .put(EntityType.MANNEQUIN, LivingEntity.createLivingAttributes().build()) - .put(EntityType.MOOSHROOM, Cow.createAttributes().build()) + .put(EntityType.MOOSHROOM, net.minecraft.world.entity.animal.AbstractCow.createAttributes().build()) // Purpur - Cows naturally aggressive to players chance .put(EntityType.MULE, AbstractChestedHorse.createBaseChestedHorseAttributes().build()) + .put(EntityType.NAUTILUS, Nautilus.createAttributes().build()) .put(EntityType.OCELOT, Ocelot.createAttributes().build()) - .put(EntityType.PANDA, Panda.createAttributes().build()) -diff --git a/net/minecraft/world/entity/animal/Cow.java b/net/minecraft/world/entity/animal/Cow.java -index a71b6c8a0c48d9c7121e7d29cff6d388cb2df09f..150ba89fee07dcb67550165597203f572d901f04 100644 ---- a/net/minecraft/world/entity/animal/Cow.java -+++ b/net/minecraft/world/entity/animal/Cow.java -@@ -23,6 +23,8 @@ import net.minecraft.world.level.storage.ValueInput; - import net.minecraft.world.level.storage.ValueOutput; +diff --git a/net/minecraft/world/entity/animal/cow/Cow.java b/net/minecraft/world/entity/animal/cow/Cow.java +index bb8c75d20e6a1300d68ae75233962bdc26736c77..9fa18b190091bbfcb9a65d8d35f68fc7375f504f 100644 +--- a/net/minecraft/world/entity/animal/cow/Cow.java ++++ b/net/minecraft/world/entity/animal/cow/Cow.java +@@ -23,6 +23,8 @@ import net.minecraft.world.level.storage.ValueOutput; + import org.jspecify.annotations.Nullable; public class Cow extends AbstractCow { + private boolean isNaturallyAggressiveToPlayers; // Purpur - Cows naturally aggressive to players chance @@ -69,7 +69,7 @@ index a71b6c8a0c48d9c7121e7d29cff6d388cb2df09f..150ba89fee07dcb67550165597203f57 @Override protected void readAdditionalSaveData(ValueInput input) { super.readAdditionalSaveData(input); -@@ -101,6 +117,7 @@ public class Cow extends AbstractCow { +@@ -100,6 +116,7 @@ public class Cow extends AbstractCow { public SpawnGroupData finalizeSpawn( ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData ) { diff --git a/purpur-server/minecraft-patches/unapplied-features/0020-Mobs-always-drop-experience.patch b/purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch similarity index 65% rename from purpur-server/minecraft-patches/unapplied-features/0020-Mobs-always-drop-experience.patch rename to purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch index 3c417b5f1..5023c6bad 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0020-Mobs-always-drop-experience.patch +++ b/purpur-server/minecraft-patches/features/0020-Mobs-always-drop-experience.patch @@ -4,29 +4,11 @@ Date: Tue, 21 Dec 2021 20:40:42 -0600 Subject: [PATCH] Mobs always drop experience -diff --git a/net/minecraft/world/entity/GlowSquid.java b/net/minecraft/world/entity/GlowSquid.java -index a10a1e26d0260968c6becd1e9d68436071da8411..0a29ed8b1347ce7c854bb787e0d003ffdcf44830 100644 ---- a/net/minecraft/world/entity/GlowSquid.java -+++ b/net/minecraft/world/entity/GlowSquid.java -@@ -61,6 +61,13 @@ public class GlowSquid extends Squid { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.glowSquidAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected ParticleOptions getInkParticle() { - return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index a64afb30454ee537b0e044d6d55ce0b0a8e944ea..f8b3cae866b68b71345c1d0cb578ea5346d83cba 100644 +index e83900f8d6adbe8a48294f250bd6cc6e3fad8160..b642f71d282773afb9fe273cbe65765afa2d5868 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java -@@ -119,6 +119,13 @@ public class Bat extends AmbientCreature { +@@ -116,6 +116,13 @@ public class Bat extends AmbientCreature { } // Purpur end - Toggle for water sensitive mob damage @@ -40,404 +22,8 @@ index a64afb30454ee537b0e044d6d55ce0b0a8e944ea..f8b3cae866b68b71345c1d0cb578ea53 @Override public boolean isFlapping() { return !this.isResting() && this.tickCount % 10.0F == 0.0F; -diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index b2b234490aba52c8125c0644f0176fe825b63e91..5e054044444b464243c11574bbac9a0eabcc4073 100644 ---- a/net/minecraft/world/entity/animal/Bee.java -+++ b/net/minecraft/world/entity/animal/Bee.java -@@ -496,6 +496,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.beeAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - public int getRemainingPersistentAngerTime() { - return this.entityData.get(DATA_REMAINING_ANGER_TIME); -diff --git a/net/minecraft/world/entity/animal/Cat.java b/net/minecraft/world/entity/animal/Cat.java -index 09467cb1f8f3c6978771464b292e33a1396d76e3..dcfa9994cbc9213e15e6528c21149eed3294be2c 100644 ---- a/net/minecraft/world/entity/animal/Cat.java -+++ b/net/minecraft/world/entity/animal/Cat.java -@@ -140,6 +140,13 @@ public class Cat extends TamableAnimal { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.catAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); -diff --git a/net/minecraft/world/entity/animal/Chicken.java b/net/minecraft/world/entity/animal/Chicken.java -index dde117db5952784e385f242d388b062d0fa1d49d..c36d35bcef9eee3da3371fc3c06f3fca124c3d80 100644 ---- a/net/minecraft/world/entity/animal/Chicken.java -+++ b/net/minecraft/world/entity/animal/Chicken.java -@@ -116,6 +116,13 @@ public class Chicken extends Animal { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.chickenAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/Cod.java b/net/minecraft/world/entity/animal/Cod.java -index f8fbba4ae8b0ecf9aec33f60b908a88fa2933713..50ebeabf494eab43b10394fa2fff312912df99b2 100644 ---- a/net/minecraft/world/entity/animal/Cod.java -+++ b/net/minecraft/world/entity/animal/Cod.java -@@ -39,6 +39,13 @@ public class Cod extends AbstractSchoolingFish { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.codAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - public ItemStack getBucketItemStack() { - return new ItemStack(Items.COD_BUCKET); -diff --git a/net/minecraft/world/entity/animal/Cow.java b/net/minecraft/world/entity/animal/Cow.java -index 150ba89fee07dcb67550165597203f572d901f04..c3d225f555b44d73196a3c34ca0b3a0c19434be5 100644 ---- a/net/minecraft/world/entity/animal/Cow.java -+++ b/net/minecraft/world/entity/animal/Cow.java -@@ -71,6 +71,13 @@ public class Cow extends AbstractCow { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.cowAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - super.registerGoals(); -diff --git a/net/minecraft/world/entity/animal/Dolphin.java b/net/minecraft/world/entity/animal/Dolphin.java -index b89f87425721e540d612b62bd3a78eb6d3fcfaf7..9bf53221bf6652fa8e0a2ef47ac1524065ffe784 100644 ---- a/net/minecraft/world/entity/animal/Dolphin.java -+++ b/net/minecraft/world/entity/animal/Dolphin.java -@@ -167,6 +167,13 @@ public class Dolphin extends AgeableWaterCreature { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.dolphinAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Nullable - @Override - public SpawnGroupData finalizeSpawn( -diff --git a/net/minecraft/world/entity/animal/Fox.java b/net/minecraft/world/entity/animal/Fox.java -index 71def83ec7b69832dbb0af4eaa012e25673e38b3..e35772494c56918592ee5684dc5c86b5f2123a80 100644 ---- a/net/minecraft/world/entity/animal/Fox.java -+++ b/net/minecraft/world/entity/animal/Fox.java -@@ -204,6 +204,13 @@ public class Fox extends Animal { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.foxAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/HappyGhast.java b/net/minecraft/world/entity/animal/HappyGhast.java -index dbc01564e23e7785e85b16f100925d36496ef51c..e85f17f362548f13a414a41f711900add788b2f7 100644 ---- a/net/minecraft/world/entity/animal/HappyGhast.java -+++ b/net/minecraft/world/entity/animal/HappyGhast.java -@@ -159,6 +159,13 @@ public class HappyGhast extends Animal { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.happyGhastAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void ageBoundaryReached() { - if (this.isBaby()) { -diff --git a/net/minecraft/world/entity/animal/IronGolem.java b/net/minecraft/world/entity/animal/IronGolem.java -index 54b7edced2b95f874d9ef7ba21418a68e9bd6291..2b9595f060bb3d1172380e3b985d8320a2594dc9 100644 ---- a/net/minecraft/world/entity/animal/IronGolem.java -+++ b/net/minecraft/world/entity/animal/IronGolem.java -@@ -108,6 +108,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.ironGolemAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options -diff --git a/net/minecraft/world/entity/animal/MushroomCow.java b/net/minecraft/world/entity/animal/MushroomCow.java -index ddd763cc38e8c624db7ef207f244961bda0b5ae1..3b18ea446cc7e19295a9fa37b74c3a02be421e55 100644 ---- a/net/minecraft/world/entity/animal/MushroomCow.java -+++ b/net/minecraft/world/entity/animal/MushroomCow.java -@@ -101,6 +101,13 @@ public class MushroomCow extends AbstractCow implements Shearable { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.mooshroomAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { - return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); -diff --git a/net/minecraft/world/entity/animal/Ocelot.java b/net/minecraft/world/entity/animal/Ocelot.java -index 15d0d05dd80744880da9192d3fdfe3bc0c3e9401..effabafb4e686f5d8464821fd59e23a56b87b90a 100644 ---- a/net/minecraft/world/entity/animal/Ocelot.java -+++ b/net/minecraft/world/entity/animal/Ocelot.java -@@ -104,6 +104,13 @@ public class Ocelot extends Animal { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.ocelotAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - public boolean isTrusting() { - return this.entityData.get(DATA_TRUSTING); - } -diff --git a/net/minecraft/world/entity/animal/Panda.java b/net/minecraft/world/entity/animal/Panda.java -index 4e9aa65002e4134600ee95b16bd14dcb6f1f46ee..9fae0d54fce37ef1b3511339ba05673e80ef6d01 100644 ---- a/net/minecraft/world/entity/animal/Panda.java -+++ b/net/minecraft/world/entity/animal/Panda.java -@@ -156,6 +156,13 @@ public class Panda extends Animal { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.pandaAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { - return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); -diff --git a/net/minecraft/world/entity/animal/Parrot.java b/net/minecraft/world/entity/animal/Parrot.java -index d31e85b63f41121678c67e6c284923251ef744f6..09cc4b2e6b8479a54aa1c867fdc73eac0fdf7e35 100644 ---- a/net/minecraft/world/entity/animal/Parrot.java -+++ b/net/minecraft/world/entity/animal/Parrot.java -@@ -216,6 +216,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.parrotAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Nullable - @Override - public SpawnGroupData finalizeSpawn( -diff --git a/net/minecraft/world/entity/animal/Pig.java b/net/minecraft/world/entity/animal/Pig.java -index 719317c3cd5fc0202ef5deb150e0304191b121b8..2b9342497a408248f24682f547d93125ce268d86 100644 ---- a/net/minecraft/world/entity/animal/Pig.java -+++ b/net/minecraft/world/entity/animal/Pig.java -@@ -105,6 +105,13 @@ public class Pig extends Animal implements ItemSteerable { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.pigAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/PolarBear.java b/net/minecraft/world/entity/animal/PolarBear.java -index eda9e5965a6ff244288215188de8e05ebcb61f14..9ac8beb6075502e3b18064429cb71c5d5b1d8831 100644 ---- a/net/minecraft/world/entity/animal/PolarBear.java -+++ b/net/minecraft/world/entity/animal/PolarBear.java -@@ -139,6 +139,13 @@ public class PolarBear extends Animal implements NeutralMob { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.polarBearAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Nullable - @Override - public AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { -diff --git a/net/minecraft/world/entity/animal/Pufferfish.java b/net/minecraft/world/entity/animal/Pufferfish.java -index 0f3bf73faf5c8d4bae5af6d4a9c4fa1be8394a6b..4dbc56c4e4668a6634d6a7ff603403e001942a78 100644 ---- a/net/minecraft/world/entity/animal/Pufferfish.java -+++ b/net/minecraft/world/entity/animal/Pufferfish.java -@@ -73,6 +73,13 @@ public class Pufferfish extends AbstractFish { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.pufferfishAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/animal/Rabbit.java b/net/minecraft/world/entity/animal/Rabbit.java -index 0320fbe2d266366f85080487ac9533b672451cbb..c5413f063c14ce2eccee28f1d8e0b57349968cbb 100644 ---- a/net/minecraft/world/entity/animal/Rabbit.java -+++ b/net/minecraft/world/entity/animal/Rabbit.java -@@ -169,6 +169,13 @@ public class Rabbit extends Animal { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.rabbitAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - public void registerGoals() { - this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/animal/Salmon.java b/net/minecraft/world/entity/animal/Salmon.java -index b9641e307d669ba20428843575a6bb39065df034..db3610b7a95effd9ad6fc782d254b9e2a4eb434f 100644 ---- a/net/minecraft/world/entity/animal/Salmon.java -+++ b/net/minecraft/world/entity/animal/Salmon.java -@@ -65,6 +65,13 @@ public class Salmon extends AbstractSchoolingFish { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.salmonAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - public int getMaxSchoolSize() { - return 5; -diff --git a/net/minecraft/world/entity/animal/SnowGolem.java b/net/minecraft/world/entity/animal/SnowGolem.java -index 6cb6ff86e3fd7b9dd2929669dc1b0d339af9a95a..03071650204193f1130e8e17f280ae6ad2cfad38 100644 ---- a/net/minecraft/world/entity/animal/SnowGolem.java -+++ b/net/minecraft/world/entity/animal/SnowGolem.java -@@ -88,6 +88,13 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM - } - // Purpur end - Configurable entity base attributes - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.snowGolemAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -diff --git a/net/minecraft/world/entity/animal/Squid.java b/net/minecraft/world/entity/animal/Squid.java -index fcdab19016a3f92776447a51df9ea2796461ef9c..1e71f73622e0c11b3e3ff2ee5afbf6522d03922a 100644 ---- a/net/minecraft/world/entity/animal/Squid.java -+++ b/net/minecraft/world/entity/animal/Squid.java -@@ -107,6 +107,13 @@ public class Squid extends AgeableWaterCreature { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.squidAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); -diff --git a/net/minecraft/world/entity/animal/TropicalFish.java b/net/minecraft/world/entity/animal/TropicalFish.java -index 22a75b6b1e6f130027e39051f04267fb436ae6de..64682d4cadcc15d6308f535591d130cfda244807 100644 ---- a/net/minecraft/world/entity/animal/TropicalFish.java -+++ b/net/minecraft/world/entity/animal/TropicalFish.java -@@ -103,6 +103,13 @@ public class TropicalFish extends AbstractSchoolingFish { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.tropicalFishAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - public static String getPredefinedName(int variantId) { - return "entity.minecraft.tropical_fish.predefined." + variantId; - } -diff --git a/net/minecraft/world/entity/animal/Turtle.java b/net/minecraft/world/entity/animal/Turtle.java -index 536a0cddb05e1224562528d19a69a9ef5c1e07f5..75e367535ce46411fffdfbab89293146fc95782b 100644 ---- a/net/minecraft/world/entity/animal/Turtle.java -+++ b/net/minecraft/world/entity/animal/Turtle.java -@@ -126,6 +126,13 @@ public class Turtle extends Animal { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.turtleAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - public void setHomePos(BlockPos homePos) { - this.homePos = homePos; - } diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index c32a5f348e41d6ff733331b85baf32da839083fe..3cc8ee115e889ced4457596b9c5fce438157e980 100644 +index 947160c4dfc4e50bb75a1a797cb2f22602b22643..e5ac43bf5631254c31d91abb1c5de408807429dd 100644 --- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java @@ -160,6 +160,13 @@ public class Axolotl extends Animal implements Bucketable { @@ -454,26 +40,350 @@ index c32a5f348e41d6ff733331b85baf32da839083fe..3cc8ee115e889ced4457596b9c5fce43 @Override public float getWalkTargetValue(BlockPos pos, LevelReader level) { return 0.0F; -diff --git a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -index e533edb6163cada2bc9bc9ed61bf333b2a2703b8..739deece6ae077b8fa1694eb6cc6ed9996dff09b 100644 ---- a/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -+++ b/net/minecraft/world/entity/animal/coppergolem/CopperGolem.java -@@ -150,6 +150,13 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab +diff --git a/net/minecraft/world/entity/animal/bee/Bee.java b/net/minecraft/world/entity/animal/bee/Bee.java +index 26a25b4f294b936901765c72bfa7c5a80a7c299c..eacf4161721350649913436e5f3c06c87be625fd 100644 +--- a/net/minecraft/world/entity/animal/bee/Bee.java ++++ b/net/minecraft/world/entity/animal/bee/Bee.java +@@ -493,6 +493,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } // Purpur end - Toggle for water sensitive mob damage + // Purpur start - Mobs always drop experience + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.copperGolemAlwaysDropExp; ++ return this.level().purpurConfig.beeAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public long getPersistentAngerEndTime() { + return this.entityData.get(DATA_ANGER_END_TIME); +diff --git a/net/minecraft/world/entity/animal/chicken/Chicken.java b/net/minecraft/world/entity/animal/chicken/Chicken.java +index 6308bb606b34d781e315f56a55e6544b3c156d85..341d6ecefb126be61b5f43a73638847e2bf9f125 100644 +--- a/net/minecraft/world/entity/animal/chicken/Chicken.java ++++ b/net/minecraft/world/entity/animal/chicken/Chicken.java +@@ -117,6 +117,13 @@ public class Chicken extends Animal { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.chickenAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/cow/Cow.java b/net/minecraft/world/entity/animal/cow/Cow.java +index 9fa18b190091bbfcb9a65d8d35f68fc7375f504f..1463e94d3851614caee216b50e90d1980de75298 100644 +--- a/net/minecraft/world/entity/animal/cow/Cow.java ++++ b/net/minecraft/world/entity/animal/cow/Cow.java +@@ -71,6 +71,13 @@ public class Cow extends AbstractCow { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.cowAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/animal/cow/MushroomCow.java b/net/minecraft/world/entity/animal/cow/MushroomCow.java +index a8e6e703a51130066547724dd08bdfe5e11c99e5..3327b93f095b6b6b6d5620bffd03232d4fb47d20 100644 +--- a/net/minecraft/world/entity/animal/cow/MushroomCow.java ++++ b/net/minecraft/world/entity/animal/cow/MushroomCow.java +@@ -99,6 +99,13 @@ public class MushroomCow extends AbstractCow implements Shearable { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.mooshroomAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public float getWalkTargetValue(BlockPos pos, LevelReader level) { + return level.getBlockState(pos.below()).is(Blocks.MYCELIUM) ? 10.0F : level.getPathfindingCostFromLightLevels(pos); +diff --git a/net/minecraft/world/entity/animal/dolphin/Dolphin.java b/net/minecraft/world/entity/animal/dolphin/Dolphin.java +index d73789bb8ce0f65be94437484c3ed41e26cd7510..bea132780ef9b8aac23dbd38cebed080082c2a87 100644 +--- a/net/minecraft/world/entity/animal/dolphin/Dolphin.java ++++ b/net/minecraft/world/entity/animal/dolphin/Dolphin.java +@@ -167,6 +167,13 @@ public class Dolphin extends AgeableWaterCreature { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.dolphinAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public @Nullable SpawnGroupData finalizeSpawn( + ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData +diff --git a/net/minecraft/world/entity/animal/equine/Donkey.java b/net/minecraft/world/entity/animal/equine/Donkey.java +index 6cf6853c244b7589d2a57e7ae77933d4a1503ccd..ca02355276286a88d618467d9191d648a3cf7b12 100644 +--- a/net/minecraft/world/entity/animal/equine/Donkey.java ++++ b/net/minecraft/world/entity/animal/equine/Donkey.java +@@ -54,6 +54,13 @@ public class Donkey extends AbstractChestedHorse { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.donkeyAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public SoundEvent getAmbientSound() { + return SoundEvents.DONKEY_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/equine/Horse.java b/net/minecraft/world/entity/animal/equine/Horse.java +index 1c17ab94901ce1c6370670c06bf0801ee6b5b393..bb7ae0bc176fc873b0e1c760b62c5c4e0ee05ae8 100644 +--- a/net/minecraft/world/entity/animal/equine/Horse.java ++++ b/net/minecraft/world/entity/animal/equine/Horse.java +@@ -88,6 +88,13 @@ public class Horse extends AbstractHorse { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.horseAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void randomizeAttributes(RandomSource random) { + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); +diff --git a/net/minecraft/world/entity/animal/equine/Llama.java b/net/minecraft/world/entity/animal/equine/Llama.java +index eb2fc0e6d497241f1b4f3971155b10d14f5427f8..eef4b602bd03df53823da6f576246c330e46d0d4 100644 +--- a/net/minecraft/world/entity/animal/equine/Llama.java ++++ b/net/minecraft/world/entity/animal/equine/Llama.java +@@ -166,6 +166,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.llamaAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + public boolean isTraderLlama() { + return false; + } +diff --git a/net/minecraft/world/entity/animal/equine/Mule.java b/net/minecraft/world/entity/animal/equine/Mule.java +index 9bafe3e204b3e4624a95b130552c8230c0835a30..8514c0b7657366a1c40217b950c74c95631c328a 100644 +--- a/net/minecraft/world/entity/animal/equine/Mule.java ++++ b/net/minecraft/world/entity/animal/equine/Mule.java +@@ -53,6 +53,13 @@ public class Mule extends AbstractChestedHorse { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.muleAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public SoundEvent getAmbientSound() { + return SoundEvents.MULE_AMBIENT; +diff --git a/net/minecraft/world/entity/animal/equine/SkeletonHorse.java b/net/minecraft/world/entity/animal/equine/SkeletonHorse.java +index 3865937e4a56636cde44f7d8f16873ae16512323..2502716b8efe4584fba9d9f9989ba9cba67568bc 100644 +--- a/net/minecraft/world/entity/animal/equine/SkeletonHorse.java ++++ b/net/minecraft/world/entity/animal/equine/SkeletonHorse.java +@@ -81,6 +81,13 @@ public class SkeletonHorse extends AbstractHorse { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.skeletonHorseAlwaysDropExp; + } + // Purpur end - Mobs always drop experience + public static AttributeSupplier.Builder createAttributes() { - return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); + return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); } +diff --git a/net/minecraft/world/entity/animal/equine/TraderLlama.java b/net/minecraft/world/entity/animal/equine/TraderLlama.java +index 4c07cd57aa3518adb4bc9b1213cc572a5b81f935..0515d1071324d82c14be4b9e97c8a583dd45a721 100644 +--- a/net/minecraft/world/entity/animal/equine/TraderLlama.java ++++ b/net/minecraft/world/entity/animal/equine/TraderLlama.java +@@ -84,6 +84,13 @@ public class TraderLlama extends Llama { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.traderLlamaAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public boolean isTraderLlama() { + return true; +diff --git a/net/minecraft/world/entity/animal/equine/ZombieHorse.java b/net/minecraft/world/entity/animal/equine/ZombieHorse.java +index b770d3118452b0b7a362b1f541bb602f4d3cbcec..5b671d468698444569b1d97437d746d49c0db757 100644 +--- a/net/minecraft/world/entity/animal/equine/ZombieHorse.java ++++ b/net/minecraft/world/entity/animal/equine/ZombieHorse.java +@@ -95,6 +95,13 @@ public class ZombieHorse extends AbstractHorse { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.zombieHorseAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + public static AttributeSupplier.Builder createAttributes() { + return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 25.0); + } +diff --git a/net/minecraft/world/entity/animal/feline/Cat.java b/net/minecraft/world/entity/animal/feline/Cat.java +index 92b67565485b2fade3e80fb4b944edfc12d9e0a2..4422cc2f0ed1b603348f3f5c0d6650f871190ffd 100644 +--- a/net/minecraft/world/entity/animal/feline/Cat.java ++++ b/net/minecraft/world/entity/animal/feline/Cat.java +@@ -142,6 +142,13 @@ public class Cat extends TamableAnimal { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.catAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); +diff --git a/net/minecraft/world/entity/animal/feline/Ocelot.java b/net/minecraft/world/entity/animal/feline/Ocelot.java +index 13272516003f763d2c69dc599c8ff7696bec718b..8583fefcb37dc043293bf622b5a25adbbcc8128e 100644 +--- a/net/minecraft/world/entity/animal/feline/Ocelot.java ++++ b/net/minecraft/world/entity/animal/feline/Ocelot.java +@@ -105,6 +105,13 @@ public class Ocelot extends Animal { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.ocelotAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + public boolean isTrusting() { + return this.entityData.get(DATA_TRUSTING); + } +diff --git a/net/minecraft/world/entity/animal/fish/Cod.java b/net/minecraft/world/entity/animal/fish/Cod.java +index 8655aae805f239cbd049065232293854b18c73cf..05de579a16726454034dc4a913161676b5c73552 100644 +--- a/net/minecraft/world/entity/animal/fish/Cod.java ++++ b/net/minecraft/world/entity/animal/fish/Cod.java +@@ -39,6 +39,13 @@ public class Cod extends AbstractSchoolingFish { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.codAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public ItemStack getBucketItemStack() { + return new ItemStack(Items.COD_BUCKET); +diff --git a/net/minecraft/world/entity/animal/fish/Pufferfish.java b/net/minecraft/world/entity/animal/fish/Pufferfish.java +index 4d21718441b0272774ec69e9b72a180fe417cbb0..ba648a0ac7c60ddd0f5fb5b327c887f58e79a2eb 100644 +--- a/net/minecraft/world/entity/animal/fish/Pufferfish.java ++++ b/net/minecraft/world/entity/animal/fish/Pufferfish.java +@@ -73,6 +73,13 @@ public class Pufferfish extends AbstractFish { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.pufferfishAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/animal/fish/Salmon.java b/net/minecraft/world/entity/animal/fish/Salmon.java +index 424bd56ec9df8bd0a80d2fa79bc4f482eae2ab5c..b76b2c1e7ac93fe01bdf9ee6e3c811f448babcbb 100644 +--- a/net/minecraft/world/entity/animal/fish/Salmon.java ++++ b/net/minecraft/world/entity/animal/fish/Salmon.java +@@ -66,6 +66,13 @@ public class Salmon extends AbstractSchoolingFish { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.salmonAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public int getMaxSchoolSize() { + return 5; +diff --git a/net/minecraft/world/entity/animal/fish/TropicalFish.java b/net/minecraft/world/entity/animal/fish/TropicalFish.java +index 04c30c60c76122018fa69cf1f3f64cae8ed62fad..c7742f06cf2bed3496c28b541e45948e609c1999 100644 +--- a/net/minecraft/world/entity/animal/fish/TropicalFish.java ++++ b/net/minecraft/world/entity/animal/fish/TropicalFish.java +@@ -103,6 +103,13 @@ public class TropicalFish extends AbstractSchoolingFish { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.tropicalFishAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + public static String getPredefinedName(int variantId) { + return "entity.minecraft.tropical_fish.predefined." + variantId; + } +diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java +index bc119c2f61adb6c6122119fda1df437bab40f9b4..f35f845e3e18c0bb0e4a076298c30be2ae479792 100644 +--- a/net/minecraft/world/entity/animal/fox/Fox.java ++++ b/net/minecraft/world/entity/animal/fox/Fox.java +@@ -211,6 +211,13 @@ public class Fox extends Animal { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.foxAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 60c97b44d3977eda2fa2c302aad3c7e337de51d9..a226956bc47c5f6145c0dd4d3f957be43e60272b 100644 +index e5f5bc2c4b4f36e0e911b2c5ef67ef6e0d4cd0b1..64916356de4b9981e04c5befef15b067914f6d75 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java @@ -146,6 +146,13 @@ public class Goat extends Animal { @@ -490,134 +400,170 @@ index 60c97b44d3977eda2fa2c302aad3c7e337de51d9..a226956bc47c5f6145c0dd4d3f957be4 @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -diff --git a/net/minecraft/world/entity/animal/horse/Donkey.java b/net/minecraft/world/entity/animal/horse/Donkey.java -index 322ff19885fc2a982bc3c4bd7b5588cd2974e425..2e44d50b3a8b3e69602f96d45474d823403547c8 100644 ---- a/net/minecraft/world/entity/animal/horse/Donkey.java -+++ b/net/minecraft/world/entity/animal/horse/Donkey.java -@@ -54,6 +54,13 @@ public class Donkey extends AbstractChestedHorse { +diff --git a/net/minecraft/world/entity/animal/golem/CopperGolem.java b/net/minecraft/world/entity/animal/golem/CopperGolem.java +index 2d0ce5d420f88a95eda34a3fe81c815999bde300..4f92ac01a6d362a7ef748b74b75773575970859f 100644 +--- a/net/minecraft/world/entity/animal/golem/CopperGolem.java ++++ b/net/minecraft/world/entity/animal/golem/CopperGolem.java +@@ -147,6 +147,13 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab } // Purpur end - Toggle for water sensitive mob damage + // Purpur start - Mobs always drop experience + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.donkeyAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - public SoundEvent getAmbientSound() { - return SoundEvents.DONKEY_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/Horse.java b/net/minecraft/world/entity/animal/horse/Horse.java -index 4d8c6eac4d276dac7859bed1a1c83d45f1858b64..e437557688c9726222840c8a2dc94a2b40380b53 100644 ---- a/net/minecraft/world/entity/animal/horse/Horse.java -+++ b/net/minecraft/world/entity/animal/horse/Horse.java -@@ -85,6 +85,13 @@ public class Horse extends AbstractHorse { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.horseAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void randomizeAttributes(RandomSource random) { - this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt)); -diff --git a/net/minecraft/world/entity/animal/horse/Llama.java b/net/minecraft/world/entity/animal/horse/Llama.java -index 32ceec4a08010a2febaac47b6288673cbc71ac90..cd231252ad71334578943325d5f14982af778849 100644 ---- a/net/minecraft/world/entity/animal/horse/Llama.java -+++ b/net/minecraft/world/entity/animal/horse/Llama.java -@@ -168,6 +168,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.llamaAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - public boolean isTraderLlama() { - return false; - } -diff --git a/net/minecraft/world/entity/animal/horse/Mule.java b/net/minecraft/world/entity/animal/horse/Mule.java -index b1c320210e3116249043ef91feb621e1af5afabf..b7ff4f9838581479e773b03922f57f529b1e2ee9 100644 ---- a/net/minecraft/world/entity/animal/horse/Mule.java -+++ b/net/minecraft/world/entity/animal/horse/Mule.java -@@ -53,6 +53,13 @@ public class Mule extends AbstractChestedHorse { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.muleAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - public SoundEvent getAmbientSound() { - return SoundEvents.MULE_AMBIENT; -diff --git a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -index 9cd58494f090dd0d16787b3d739cbaa8bcd92370..986746435e837dd1de8ee86f7dcd796ef095d73b 100644 ---- a/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -+++ b/net/minecraft/world/entity/animal/horse/SkeletonHorse.java -@@ -80,6 +80,13 @@ public class SkeletonHorse extends AbstractHorse { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.skeletonHorseAlwaysDropExp; ++ return this.level().purpurConfig.copperGolemAlwaysDropExp; + } + // Purpur end - Mobs always drop experience + public static AttributeSupplier.Builder createAttributes() { - return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); + return Mob.createMobAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F).add(Attributes.STEP_HEIGHT, 1.0).add(Attributes.MAX_HEALTH, 12.0); } -diff --git a/net/minecraft/world/entity/animal/horse/TraderLlama.java b/net/minecraft/world/entity/animal/horse/TraderLlama.java -index 204dfdeb5c3bb650dbd6c990c6a2e1e4d14b8c77..be8b7e4f449183ce20138ffbdd0c856859455ce8 100644 ---- a/net/minecraft/world/entity/animal/horse/TraderLlama.java -+++ b/net/minecraft/world/entity/animal/horse/TraderLlama.java -@@ -84,6 +84,13 @@ public class TraderLlama extends Llama { +diff --git a/net/minecraft/world/entity/animal/golem/IronGolem.java b/net/minecraft/world/entity/animal/golem/IronGolem.java +index d31c1f1b681922ca8f1657ffa333e8a6794e619f..ddde4297b77d174034300165b591a224c0401743 100644 +--- a/net/minecraft/world/entity/animal/golem/IronGolem.java ++++ b/net/minecraft/world/entity/animal/golem/IronGolem.java +@@ -106,6 +106,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { } // Purpur end - Toggle for water sensitive mob damage + // Purpur start - Mobs always drop experience + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.traderLlamaAlwaysDropExp; ++ return this.level().purpurConfig.ironGolemAlwaysDropExp; + } + // Purpur end - Mobs always drop experience + @Override - public boolean isTraderLlama() { - return true; -diff --git a/net/minecraft/world/entity/animal/horse/ZombieHorse.java b/net/minecraft/world/entity/animal/horse/ZombieHorse.java -index fd8a512910c886af1ae4e66edbf7f8d6fe0bc4f3..384bb954ea633c8e8ac239539925948b9dde6168 100644 ---- a/net/minecraft/world/entity/animal/horse/ZombieHorse.java -+++ b/net/minecraft/world/entity/animal/horse/ZombieHorse.java -@@ -76,6 +76,13 @@ public class ZombieHorse extends AbstractHorse { + protected void registerGoals() { + if (this.level().purpurConfig.ironGolemPoppyCalm) this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.ReceiveFlower(this)); // Purpur - Iron golem calm anger options +diff --git a/net/minecraft/world/entity/animal/golem/SnowGolem.java b/net/minecraft/world/entity/animal/golem/SnowGolem.java +index 0fe7f18390490ccf4e944ac3378150ebcc53991d..846b1a064398b455dbb2f05521870b4519edd5b8 100644 +--- a/net/minecraft/world/entity/animal/golem/SnowGolem.java ++++ b/net/minecraft/world/entity/animal/golem/SnowGolem.java +@@ -87,6 +87,13 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM + } + // Purpur end - Configurable entity base attributes + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.snowGolemAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables +diff --git a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +index bba0dc5e0fd28ce05adb2d4edb9c0c4366dd580e..ababd0d6b83963f8a9129c1a4de801dcf966db1a 100644 +--- a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java ++++ b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +@@ -160,6 +160,13 @@ public class HappyGhast extends Animal { } // Purpur end - Toggle for water sensitive mob damage + // Purpur start - Mobs always drop experience + @Override + protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.zombieHorseAlwaysDropExp; ++ return this.level().purpurConfig.happyGhastAlwaysDropExp; + } + // Purpur end - Mobs always drop experience + - public static AttributeSupplier.Builder createAttributes() { - return createBaseHorseAttributes().add(Attributes.MAX_HEALTH, 15.0).add(Attributes.MOVEMENT_SPEED, 0.2F); + @Override + protected void ageBoundaryReached() { + if (this.isBaby()) { +diff --git a/net/minecraft/world/entity/animal/panda/Panda.java b/net/minecraft/world/entity/animal/panda/Panda.java +index e9aa07dea0515f53a08a7066fa9e23e0ee69d69e..5116e9e16070e23d13b526d21facb7b5ad0988ba 100644 +--- a/net/minecraft/world/entity/animal/panda/Panda.java ++++ b/net/minecraft/world/entity/animal/panda/Panda.java +@@ -157,6 +157,13 @@ public class Panda extends Animal { } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.pandaAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { + return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); +diff --git a/net/minecraft/world/entity/animal/parrot/Parrot.java b/net/minecraft/world/entity/animal/parrot/Parrot.java +index e97782bc8232120d4e7d1feeb8ca87fd37a1fcf9..bbe3977939004b7d77e38b14d48c9c26e596d123 100644 +--- a/net/minecraft/world/entity/animal/parrot/Parrot.java ++++ b/net/minecraft/world/entity/animal/parrot/Parrot.java +@@ -221,6 +221,13 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.parrotAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public @Nullable SpawnGroupData finalizeSpawn( + ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData +diff --git a/net/minecraft/world/entity/animal/pig/Pig.java b/net/minecraft/world/entity/animal/pig/Pig.java +index 8d3ab29cd3eff0cbe08742201836382ba75ad50e..5b1ff534815217ba2a235df0f33f5fbfcd34bb10 100644 +--- a/net/minecraft/world/entity/animal/pig/Pig.java ++++ b/net/minecraft/world/entity/animal/pig/Pig.java +@@ -106,6 +106,13 @@ public class Pig extends Animal implements ItemSteerable { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.pigAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/animal/polarbear/PolarBear.java b/net/minecraft/world/entity/animal/polarbear/PolarBear.java +index 13d26a6981d6907f35f1f2bde93934c7c1fe8120..592711e205ee959cc66de80933ad5a2dcec3092f 100644 +--- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java ++++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java +@@ -140,6 +140,13 @@ public class PolarBear extends Animal implements NeutralMob { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.polarBearAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + return EntityType.POLAR_BEAR.create(level, EntitySpawnReason.BREEDING); +diff --git a/net/minecraft/world/entity/animal/rabbit/Rabbit.java b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +index b1c72047f7aa63f62b0ad0274811b587b1d3486b..c39004a546c28c9f8af26e727c67dbff85ba1212 100644 +--- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java ++++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java +@@ -170,6 +170,13 @@ public class Rabbit extends Animal { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.rabbitAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/animal/sheep/Sheep.java b/net/minecraft/world/entity/animal/sheep/Sheep.java -index 3bdadfed6a06b965193cc615c490f89de65d515e..2f90f1a5e4d2aad7fc1fe84bac6cf18ed8f35f4d 100644 +index 7eca49c9237c61ab12f60ff16085aa8fd10c99ac..d712673d237f4e4d99a714ddf09c4582387f0e3c 100644 --- a/net/minecraft/world/entity/animal/sheep/Sheep.java +++ b/net/minecraft/world/entity/animal/sheep/Sheep.java @@ -102,6 +102,13 @@ public class Sheep extends Animal implements Shearable { @@ -634,11 +580,65 @@ index 3bdadfed6a06b965193cc615c490f89de65d515e..2f90f1a5e4d2aad7fc1fe84bac6cf18e @Override protected void registerGoals() { this.eatBlockGoal = new EatBlockGoal(this); +diff --git a/net/minecraft/world/entity/animal/squid/GlowSquid.java b/net/minecraft/world/entity/animal/squid/GlowSquid.java +index 2aa2a84a7ada369c45a85119a933eb92297af4dc..dd1bd8b1a348a0cc398b123a77d3cb28dd1273ae 100644 +--- a/net/minecraft/world/entity/animal/squid/GlowSquid.java ++++ b/net/minecraft/world/entity/animal/squid/GlowSquid.java +@@ -64,6 +64,13 @@ public class GlowSquid extends Squid { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.glowSquidAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected ParticleOptions getInkParticle() { + return ParticleTypes.GLOW_SQUID_INK; +diff --git a/net/minecraft/world/entity/animal/squid/Squid.java b/net/minecraft/world/entity/animal/squid/Squid.java +index e307ebfb8b2781b6175b520e148e6bd58d2b9dc4..6b5be8e58aa7e3acd14ff3cb1ba25d15f8d37410 100644 +--- a/net/minecraft/world/entity/animal/squid/Squid.java ++++ b/net/minecraft/world/entity/animal/squid/Squid.java +@@ -108,6 +108,13 @@ public class Squid extends AgeableWaterCreature { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.squidAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this)); +diff --git a/net/minecraft/world/entity/animal/turtle/Turtle.java b/net/minecraft/world/entity/animal/turtle/Turtle.java +index 7d5987fe641646ecbf8e389d57a0a9a04e9c0959..a3f2076e6f0e51ac51a8af94cae91baf82c247a1 100644 +--- a/net/minecraft/world/entity/animal/turtle/Turtle.java ++++ b/net/minecraft/world/entity/animal/turtle/Turtle.java +@@ -126,6 +126,13 @@ public class Turtle extends Animal { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.turtleAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + public void setHomePos(BlockPos homePos) { + this.homePos = homePos; + } diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index 9832cafd14d42d3bf92bb5791d6ded4008215998..8160e5f7c5fbc28c61653d8e57807636f6ab0eab 100644 +index 20f945ee06bcdb4736e6d3a8b20a5cbd3d79df0f..7fbe841818d08fd930f7ce405e84e5ed4badb614 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -231,6 +231,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -230,6 +230,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Toggle for water sensitive mob damage @@ -653,10 +653,10 @@ index 9832cafd14d42d3bf92bb5791d6ded4008215998..8160e5f7c5fbc28c61653d8e57807636 protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index e4f3d21422ccf45aee34885cc7633f37ec0c9903..3e5c1a2fc6dba77982d53f75355b3694f7bc289f 100644 +index ef6dcc8183d9963d1e683f2cc74fec6443d175a9..fe4362040da72b51c14b3c65f75fe8a72757bab3 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -229,6 +229,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -228,6 +228,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Toggle for water sensitive mob damage @@ -671,7 +671,7 @@ index e4f3d21422ccf45aee34885cc7633f37ec0c9903..3e5c1a2fc6dba77982d53f75355b3694 protected PathNavigation createNavigation(Level level) { FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); diff --git a/net/minecraft/world/entity/monster/Blaze.java b/net/minecraft/world/entity/monster/Blaze.java -index 8941252b8c91ce26097651ab32c139a53c43feb3..3f8d1c00bfb274edd2d9f5f278d8c5f9ff908584 100644 +index e2afd7677986c70dd924017e8822fd6abd808f48..187da2d55cdb039b62abe708dadd6c05e13ac64f 100644 --- a/net/minecraft/world/entity/monster/Blaze.java +++ b/net/minecraft/world/entity/monster/Blaze.java @@ -84,6 +84,13 @@ public class Blaze extends Monster { @@ -688,26 +688,8 @@ index 8941252b8c91ce26097651ab32c139a53c43feb3..3f8d1c00bfb274edd2d9f5f278d8c5f9 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -diff --git a/net/minecraft/world/entity/monster/CaveSpider.java b/net/minecraft/world/entity/monster/CaveSpider.java -index 239d855df83083e0eb875c430a165427f3a143de..994429d657e3f40b43b2c744112658e510be156c 100644 ---- a/net/minecraft/world/entity/monster/CaveSpider.java -+++ b/net/minecraft/world/entity/monster/CaveSpider.java -@@ -58,6 +58,13 @@ public class CaveSpider extends Spider { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.caveSpiderAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - public boolean doHurtTarget(ServerLevel level, Entity target) { - if (super.doHurtTarget(level, target)) { diff --git a/net/minecraft/world/entity/monster/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index 719c752270c3f1b2496184df0eb728e3c934a3d5..ff85af8c6f8a64e8472377decf47ab667f68a3f0 100644 +index b0ed96c243f9abb3868d92bb513ad1620aa8e269..608d787b73dce1726ccece9e0372acf995f261d4 100644 --- a/net/minecraft/world/entity/monster/Creeper.java +++ b/net/minecraft/world/entity/monster/Creeper.java @@ -273,6 +273,13 @@ public class Creeper extends Monster { @@ -724,24 +706,6 @@ index 719c752270c3f1b2496184df0eb728e3c934a3d5..ff85af8c6f8a64e8472377decf47ab66 @Override public SoundEvent getHurtSound(DamageSource damageSource) { return SoundEvents.CREEPER_HURT; -diff --git a/net/minecraft/world/entity/monster/Drowned.java b/net/minecraft/world/entity/monster/Drowned.java -index 6beaed7f1ce39bef190cfa7e1addc28b929c0747..5a947d7fbf1a08011d87f71b96a8f221130fb583 100644 ---- a/net/minecraft/world/entity/monster/Drowned.java -+++ b/net/minecraft/world/entity/monster/Drowned.java -@@ -130,6 +130,13 @@ public class Drowned extends Zombie implements RangedAttackMob { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.drownedAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void addBehaviourGoals() { - this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0)); diff --git a/net/minecraft/world/entity/monster/ElderGuardian.java b/net/minecraft/world/entity/monster/ElderGuardian.java index 1ea323a17440abbe36c9528e80e169816267005b..abb7496c293175828fde54ae2b4991aa3ff6b30f 100644 --- a/net/minecraft/world/entity/monster/ElderGuardian.java @@ -761,10 +725,10 @@ index 1ea323a17440abbe36c9528e80e169816267005b..abb7496c293175828fde54ae2b4991aa return Guardian.createAttributes().add(Attributes.MOVEMENT_SPEED, 0.3F).add(Attributes.ATTACK_DAMAGE, 8.0).add(Attributes.MAX_HEALTH, 80.0); } diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index f6cc9107702e5cfa985694c7c88ae21622cd39c6..29168e1536550b2e49d86dd17604e2da807495fc 100644 +index 47c621f01658f3392b58f3f5c1f31bd539f63dd6..c90a955b14ae10037f31c7e9b8a86df3323602cc 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -115,6 +115,13 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -114,6 +114,13 @@ public class EnderMan extends Monster implements NeutralMob { } // Purpur end - Configurable entity base attributes @@ -796,26 +760,8 @@ index c79c689cb99ad2a6cab88cf8b583ff0f9e91b115..4a778ad22f92e3fd95665a9b40ae932b @Override protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/monster/Evoker.java b/net/minecraft/world/entity/monster/Evoker.java -index 9015643b47e2d20a5c75c5f4bf2ec66399d4a2e5..274a40f0edc4d928570cf75ee1c51d1d03dabb2f 100644 ---- a/net/minecraft/world/entity/monster/Evoker.java -+++ b/net/minecraft/world/entity/monster/Evoker.java -@@ -80,6 +80,13 @@ public class Evoker extends SpellcasterIllager { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.evokerAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Ghast.java b/net/minecraft/world/entity/monster/Ghast.java -index 544f3564411138c59eaad2b0bf50ec01ceb319bf..eca52dae254689eced7b3ee12b83d193b8d3b49f 100644 +index 443eb9f12d6df950c59c9d4db4853087fd23d24e..673d4e06d6dc4c94ddaafcdc86cbdbd686964ddd 100644 --- a/net/minecraft/world/entity/monster/Ghast.java +++ b/net/minecraft/world/entity/monster/Ghast.java @@ -90,6 +90,13 @@ public class Ghast extends Mob implements Enemy { @@ -851,10 +797,10 @@ index 2204c729ce42e89a0b42b365e0060098afcf68f9..b7edb5db6621e982a6a529c5319ba68a return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 100.0) diff --git a/net/minecraft/world/entity/monster/Guardian.java b/net/minecraft/world/entity/monster/Guardian.java -index 901338319b78e538208f72ead289f7277fd00eb9..7f742ac64be0d4bcfb780da13a0e2f571438442b 100644 +index 9948511659de9222a19f6b9f660e4441ea98a4a9..60490d0611a352ba0546b39fd41259713a7f18b5 100644 --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java -@@ -106,6 +106,13 @@ public class Guardian extends Monster { +@@ -104,6 +104,13 @@ public class Guardian extends Monster { } // Purpur end - Toggle for water sensitive mob damage @@ -868,44 +814,8 @@ index 901338319b78e538208f72ead289f7277fd00eb9..7f742ac64be0d4bcfb780da13a0e2f57 @Override protected void registerGoals() { MoveTowardsRestrictionGoal moveTowardsRestrictionGoal = new MoveTowardsRestrictionGoal(this, 1.0); -diff --git a/net/minecraft/world/entity/monster/Husk.java b/net/minecraft/world/entity/monster/Husk.java -index ac02f6abf186a1f31e48fd4ed8181e22919c2f04..ef261e61358bf466bdfdd6cfe982c5afe53d7c4d 100644 ---- a/net/minecraft/world/entity/monster/Husk.java -+++ b/net/minecraft/world/entity/monster/Husk.java -@@ -75,6 +75,13 @@ public class Husk extends Zombie { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.huskAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - public static boolean checkHuskSpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { -diff --git a/net/minecraft/world/entity/monster/Illusioner.java b/net/minecraft/world/entity/monster/Illusioner.java -index ee5e0b20f65a5f7d7dc2cf8fea2eff56f8f56a41..e34c37a9a2eacc97f44fcb6d911cf215b07414a2 100644 ---- a/net/minecraft/world/entity/monster/Illusioner.java -+++ b/net/minecraft/world/entity/monster/Illusioner.java -@@ -91,6 +91,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.illusionerAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java -index bce9a085dfbe06bd4a869ae8d7d407ebbf7ad6b4..29da12b942736dfe8fa06a9eb5f132ae7c534d72 100644 +index 1bf9d04e5e44272b02753290995795f194cbdae1..765a0d0376e344d2f108a5abe97e654bd972c80b 100644 --- a/net/minecraft/world/entity/monster/MagmaCube.java +++ b/net/minecraft/world/entity/monster/MagmaCube.java @@ -75,6 +75,13 @@ public class MagmaCube extends Slime { @@ -923,12 +833,12 @@ index bce9a085dfbe06bd4a869ae8d7d407ebbf7ad6b4..29da12b942736dfe8fa06a9eb5f132ae return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F); } diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index 332c08a2d0d0fe2e8c7e9461bb73a73ddee91b94..359f376723f1fe8f50643d8eea6f22591580811d 100644 +index e7e3949e4ccea1f5160fc687c2ff2704c1be3b2d..c021ea0a2a9da25ac033451642f61d9f8e3a63f1 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -148,6 +148,13 @@ public class Phantom extends Mob implements Enemy { - public void setShouldBurnInDay(boolean shouldBurnInDay) { this.shouldBurnInDay = shouldBurnInDay; } - // Purpur end - API for any mob to burn daylight +@@ -136,6 +136,13 @@ public class Phantom extends Mob implements Enemy { + } + // Purpur end - Toggle for water sensitive mob damage + // Purpur start - Mobs always drop experience + @Override @@ -940,29 +850,11 @@ index 332c08a2d0d0fe2e8c7e9461bb73a73ddee91b94..359f376723f1fe8f50643d8eea6f2259 @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; -diff --git a/net/minecraft/world/entity/monster/Pillager.java b/net/minecraft/world/entity/monster/Pillager.java -index 1aa2f744b0d875fb874cf23a0601fee48ead66c2..8bc07bbf713ebd3afc8c0e62c92b5e11fb424307 100644 ---- a/net/minecraft/world/entity/monster/Pillager.java -+++ b/net/minecraft/world/entity/monster/Pillager.java -@@ -96,6 +96,13 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.pillagerAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index 2dcf90e3be35290ed9cbe7cf19aa67d1f9acac80..a7deae32d5b1e9622152ec74de085110a8decbce 100644 +index f41df50e74823b2ef13de20721a4f237f6617438..6cb8d589e9e3a1dd7c98fc6dddf4e5705ab7ab6f 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -109,6 +109,13 @@ public class Ravager extends Raider { +@@ -110,6 +110,13 @@ public class Ravager extends Raider { } // Purpur end - Toggle for water sensitive mob damage @@ -977,10 +869,10 @@ index 2dcf90e3be35290ed9cbe7cf19aa67d1f9acac80..a7deae32d5b1e9622152ec74de085110 protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index 21b28d1ba59656b123aef95a7e18075dae9bc236..99589855c69e76ecdfa9bb21b62e59f175b24375 100644 +index 0a5a6f23cd8e4317db4e7c0ba8883e99f3aff148..2b73382e5bcf47da483ea88e2eae480ebb48e8f9 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -141,6 +141,13 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -140,6 +140,13 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Toggle for water sensitive mob damage @@ -995,10 +887,10 @@ index 21b28d1ba59656b123aef95a7e18075dae9bc236..99589855c69e76ecdfa9bb21b62e59f1 protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables diff --git a/net/minecraft/world/entity/monster/Silverfish.java b/net/minecraft/world/entity/monster/Silverfish.java -index 58a759fdfae0ef20decc82842bdf4e9947f51807..60c96e040d6941e66dc51c1b2cd7b85d70313efb 100644 +index 1692e7c93234506e22039da071e9c8e8a8567495..81976287402a701e3ef12c474cb68eb602cc2951 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java -@@ -73,6 +73,13 @@ public class Silverfish extends Monster { +@@ -72,6 +72,13 @@ public class Silverfish extends Monster { } // Purpur end - Toggle for water sensitive mob damage @@ -1012,29 +904,11 @@ index 58a759fdfae0ef20decc82842bdf4e9947f51807..60c96e040d6941e66dc51c1b2cd7b85d @Override protected void registerGoals() { this.friendsGoal = new Silverfish.SilverfishWakeUpFriendsGoal(this); -diff --git a/net/minecraft/world/entity/monster/Skeleton.java b/net/minecraft/world/entity/monster/Skeleton.java -index c7bfa5214fd46c6b5e264314f86ca5c2904bf123..2a380964ae999edfa5260c0730a79d9e8e4c1bfc 100644 ---- a/net/minecraft/world/entity/monster/Skeleton.java -+++ b/net/minecraft/world/entity/monster/Skeleton.java -@@ -57,6 +57,13 @@ public class Skeleton extends AbstractSkeleton { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.skeletonAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java -index 7c5d3c30be47f0cac043e73153a1face837406dd..a03b1d15aa8b41e7c22464e8b66811c41acdcef2 100644 +index c4222e17d9a1f4cba6a74099a167cff13856f3e3..29d6d0c9687b835d24fe51c3824deeb67af1ba4f 100644 --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java -@@ -141,6 +141,13 @@ public class Slime extends Mob implements Enemy { +@@ -142,6 +142,13 @@ public class Slime extends Mob implements Enemy { } // Purpur end - Toggle for water sensitive mob damage @@ -1048,44 +922,8 @@ index 7c5d3c30be47f0cac043e73153a1face837406dd..a03b1d15aa8b41e7c22464e8b66811c4 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -diff --git a/net/minecraft/world/entity/monster/Spider.java b/net/minecraft/world/entity/monster/Spider.java -index 5fa082b5a04d152c72f6053ca6bc4598899ca30c..ae72caa023d3df03b3458baf784dfade9e0b4ecb 100644 ---- a/net/minecraft/world/entity/monster/Spider.java -+++ b/net/minecraft/world/entity/monster/Spider.java -@@ -82,6 +82,13 @@ public class Spider extends Monster { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.spiderAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(1, new FloatGoal(this)); -diff --git a/net/minecraft/world/entity/monster/Stray.java b/net/minecraft/world/entity/monster/Stray.java -index 1d99432da3df434394a746f0bf4d5cc62c90dcba..dff140efcc082d828b26f4f0cbb7084a414d9faf 100644 ---- a/net/minecraft/world/entity/monster/Stray.java -+++ b/net/minecraft/world/entity/monster/Stray.java -@@ -53,6 +53,13 @@ public class Stray extends AbstractSkeleton { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.strayAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - public static boolean checkStraySpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index 1004aaf885268d08e68e5d2465fae2b5566a4eff..da7644dd2b9e86ec8947250ff998fb554e881161 100644 +index 758887f3fcec2bf0946cddb184e19a1c9b64eee3..37b0c8f55ed4ac4feac6a35bd4377007a19ea2ce 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -124,6 +124,13 @@ public class Strider extends Animal implements ItemSteerable { @@ -1103,10 +941,10 @@ index 1004aaf885268d08e68e5d2465fae2b5566a4eff..da7644dd2b9e86ec8947250ff998fb55 EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random ) { diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index 13285c9f233c3240729de4baf5f014e25b245547..4b5b30a0c710e83ce2c193ceb16fc210fe4f87d8 100644 +index 6ead673c44891c6b1c1688f80bf299527d7bc777..acd196d435758a8730569ba4e772bb954c4f85b6 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -119,6 +119,13 @@ public class Vex extends Monster implements TraceableEntity { +@@ -117,6 +117,13 @@ public class Vex extends Monster implements TraceableEntity { } // Purpur end - Toggle for water sensitive mob damage @@ -1120,26 +958,8 @@ index 13285c9f233c3240729de4baf5f014e25b245547..4b5b30a0c710e83ce2c193ceb16fc210 @Override public boolean isFlapping() { return this.tickCount % TICKS_PER_FLAP == 0; -diff --git a/net/minecraft/world/entity/monster/Vindicator.java b/net/minecraft/world/entity/monster/Vindicator.java -index 33452593731c53f404059271b3fbb0407d75517c..e209b0ad1fa95d01387671b7dad4a347bb12ed4c 100644 ---- a/net/minecraft/world/entity/monster/Vindicator.java -+++ b/net/minecraft/world/entity/monster/Vindicator.java -@@ -88,6 +88,13 @@ public class Vindicator extends AbstractIllager { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.vindicatorAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java -index a785deb09373e20c13f8be49626d9619491b02c8..ca1cd20e919d1223cec2756580e588e90d336cba 100644 +index 86d9952ed0f692e8f229b0c0bcb6cacf53a00c8b..97a427faa37ce9b0c558da40d582b16ac1e96da2 100644 --- a/net/minecraft/world/entity/monster/Witch.java +++ b/net/minecraft/world/entity/monster/Witch.java @@ -89,6 +89,13 @@ public class Witch extends Raider implements RangedAttackMob { @@ -1156,26 +976,8 @@ index a785deb09373e20c13f8be49626d9619491b02c8..ca1cd20e919d1223cec2756580e588e9 @Override protected void registerGoals() { super.registerGoals(); -diff --git a/net/minecraft/world/entity/monster/WitherSkeleton.java b/net/minecraft/world/entity/monster/WitherSkeleton.java -index 778779c79c56e2ca438ecbb82fbb16d70d312524..51e2078912991266f2dac79775b1d5701e85fe79 100644 ---- a/net/minecraft/world/entity/monster/WitherSkeleton.java -+++ b/net/minecraft/world/entity/monster/WitherSkeleton.java -@@ -66,6 +66,13 @@ public class WitherSkeleton extends AbstractSkeleton { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.witherSkeletonAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index d9ca3944fce3464be69ca1b3b5191e2d8de01e3d..e2bf2bc45e4f8236ab47cf28c270dad748f80b50 100644 +index e2708eb836d60588c1bedb75c520e5007185034a..d6de61ed4415cd00858375406567ea9407030e1e 100644 --- a/net/minecraft/world/entity/monster/Zoglin.java +++ b/net/minecraft/world/entity/monster/Zoglin.java @@ -119,6 +119,13 @@ public class Zoglin extends Monster implements HoglinBase { @@ -1192,65 +994,11 @@ index d9ca3944fce3464be69ca1b3b5191e2d8de01e3d..e2bf2bc45e4f8236ab47cf28c270dad7 @Override protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index 1280605d393d0afda475c5d54b073824d141a460..2dd08e5ef413c37a682046071b83f595c8499cf2 100644 ---- a/net/minecraft/world/entity/monster/Zombie.java -+++ b/net/minecraft/world/entity/monster/Zombie.java -@@ -150,6 +150,13 @@ public class Zombie extends Monster { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.zombieAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void registerGoals() { - this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index 5ae0e9d5f3c3b7a6f64775396acf061ff0d3561f..9c769b129764b4354f5dcbed821225ed045c86c8 100644 ---- a/net/minecraft/world/entity/monster/ZombieVillager.java -+++ b/net/minecraft/world/entity/monster/ZombieVillager.java -@@ -128,6 +128,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.zombieVillagerAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -diff --git a/net/minecraft/world/entity/monster/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -index 46520af2dcf89a54374b933f5acdb8d2c66abbff..05bbd9588ae85256c46d8b0c2434a3bc8cb5f620 100644 ---- a/net/minecraft/world/entity/monster/ZombifiedPiglin.java -+++ b/net/minecraft/world/entity/monster/ZombifiedPiglin.java -@@ -113,6 +113,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { - } - // Purpur end - Toggle for water sensitive mob damage - -+ // Purpur start - Mobs always drop experience -+ @Override -+ protected boolean isAlwaysExperienceDropper() { -+ return this.level().purpurConfig.zombifiedPiglinAlwaysDropExp; -+ } -+ // Purpur end - Mobs always drop experience -+ - @Override - public void setPersistentAngerTarget(@Nullable UUID target) { - this.persistentAngerTarget = target; diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 053c47fcaf4e5d3bc8f9a3d913508a7816b15747..72dc725b8cd6a2fca26aae376f91ab3e246a810b 100644 +index 5e3f7005a7167c786038823a8437ad2e90a41d2c..460640f5512be6553f1ec69e20e27c7cc797068b 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -135,6 +135,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -136,6 +136,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { } // Purpur end - Toggle for water sensitive mob damage @@ -1264,11 +1012,83 @@ index 053c47fcaf4e5d3bc8f9a3d913508a7816b15747..72dc725b8cd6a2fca26aae376f91ab3e @VisibleForTesting public void setTimeInOverworld(int timeInOverworld) { this.timeInOverworld = timeInOverworld; +diff --git a/net/minecraft/world/entity/monster/illager/Evoker.java b/net/minecraft/world/entity/monster/illager/Evoker.java +index c4f45f6303a46ad54991c9013608a4e5ba8b9fee..1572f7653045902fa05f0499d920eb2b2ff46931 100644 +--- a/net/minecraft/world/entity/monster/illager/Evoker.java ++++ b/net/minecraft/world/entity/monster/illager/Evoker.java +@@ -81,6 +81,13 @@ public class Evoker extends SpellcasterIllager { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.evokerAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/illager/Illusioner.java b/net/minecraft/world/entity/monster/illager/Illusioner.java +index 32278f51f4973d1294e52f0775697e9f5b295ee0..ea9b61b6f8463edf3497d240b010f8da3e04f62f 100644 +--- a/net/minecraft/world/entity/monster/illager/Illusioner.java ++++ b/net/minecraft/world/entity/monster/illager/Illusioner.java +@@ -93,6 +93,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.illusionerAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/illager/Pillager.java b/net/minecraft/world/entity/monster/illager/Pillager.java +index 6190286ab2f454382d497b4fce47632e6f771215..68fe150d0da04084690670f29a0a4ea035e8c921 100644 +--- a/net/minecraft/world/entity/monster/illager/Pillager.java ++++ b/net/minecraft/world/entity/monster/illager/Pillager.java +@@ -97,6 +97,13 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.pillagerAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + super.registerGoals(); +diff --git a/net/minecraft/world/entity/monster/illager/Vindicator.java b/net/minecraft/world/entity/monster/illager/Vindicator.java +index 86b463a16e8630af4918ea43a2546995aa00244f..367c74123ee9d07795527eec6ba2f83a9e953081 100644 +--- a/net/minecraft/world/entity/monster/illager/Vindicator.java ++++ b/net/minecraft/world/entity/monster/illager/Vindicator.java +@@ -89,6 +89,13 @@ public class Vindicator extends AbstractIllager { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.vindicatorAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index 293d6359469095c5faf87ec574ac8a475ce33ba9..9a1f1b8ff394e4849301508dd82669246eeba2de 100644 +index d6c834914ddea76280466bf0f7d001a76af34f08..49ed463ae7ef65b2630a5b914689e04fa729a40c 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -168,6 +168,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -173,6 +173,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento } // Purpur end - Toggle for water sensitive mob damage @@ -1283,7 +1103,7 @@ index 293d6359469095c5faf87ec574ac8a475ce33ba9..9a1f1b8ff394e4849301508dd8266924 protected void addAdditionalSaveData(ValueOutput output) { super.addAdditionalSaveData(output); diff --git a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index e988a65cbd1f71f488fa8221ef11b6b1a05dc554..ebe1b4e0b841906684561151919a5b3f6e206b60 100644 +index 4bf2038fea712e65f420ade915a18470b79318fc..7baccc23f868ac9b8720bfd77b2af6b7dd368820 100644 --- a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java @@ -97,6 +97,13 @@ public class PiglinBrute extends AbstractPiglin { @@ -1300,10 +1120,190 @@ index e988a65cbd1f71f488fa8221ef11b6b1a05dc554..ebe1b4e0b841906684561151919a5b3f public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) -diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 2a145e4eb0474950cbfb4a229891b4b2320d98d2..bfff91e5e252141f887d8965ecf1dd9ff1cebfe3 100644 ---- a/net/minecraft/world/entity/npc/Villager.java -+++ b/net/minecraft/world/entity/npc/Villager.java +diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java +index 30d79be765118a50e2e2c5bfde6bf6bbc957cf40..03e441e7e9033961dbcf60e574fae48621513c87 100644 +--- a/net/minecraft/world/entity/monster/skeleton/Skeleton.java ++++ b/net/minecraft/world/entity/monster/skeleton/Skeleton.java +@@ -57,6 +57,13 @@ public class Skeleton extends AbstractSkeleton { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.skeletonAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java +index ec19c49d195daff5839c991cce63b1ffc15a7e0b..5cea4ff662c7136d2778b84c21f368cb5ac1c81a 100644 +--- a/net/minecraft/world/entity/monster/skeleton/Stray.java ++++ b/net/minecraft/world/entity/monster/skeleton/Stray.java +@@ -54,6 +54,13 @@ public class Stray extends AbstractSkeleton { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.strayAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + public static boolean checkStraySpawnRules( + EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + ) { +diff --git a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java +index 3e8cc658b333f1259784e1426896ac8b8c1537fa..40134013e3254c6c6ed370150adb4bda7c0f2d9a 100644 +--- a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java ++++ b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java +@@ -66,6 +66,13 @@ public class WitherSkeleton extends AbstractSkeleton { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.witherSkeletonAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); +diff --git a/net/minecraft/world/entity/monster/spider/CaveSpider.java b/net/minecraft/world/entity/monster/spider/CaveSpider.java +index fad3e951e443f04f5bf0423cde42c0ae299a4236..fb4caabbbe5bd0befdaba49ee3cfe70c326b50a7 100644 +--- a/net/minecraft/world/entity/monster/spider/CaveSpider.java ++++ b/net/minecraft/world/entity/monster/spider/CaveSpider.java +@@ -58,6 +58,13 @@ public class CaveSpider extends Spider { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.caveSpiderAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public boolean doHurtTarget(ServerLevel level, Entity target) { + if (super.doHurtTarget(level, target)) { +diff --git a/net/minecraft/world/entity/monster/spider/Spider.java b/net/minecraft/world/entity/monster/spider/Spider.java +index 81c500de41b11d4aa6c52dc290f132ad2c23f009..7993ea937772cabe848726c942b6df0ae52e74e2 100644 +--- a/net/minecraft/world/entity/monster/spider/Spider.java ++++ b/net/minecraft/world/entity/monster/spider/Spider.java +@@ -84,6 +84,13 @@ public class Spider extends Monster { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.spiderAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(1, new FloatGoal(this)); +diff --git a/net/minecraft/world/entity/monster/zombie/Drowned.java b/net/minecraft/world/entity/monster/zombie/Drowned.java +index fe02f54adaaed855c5d078281207a5fe8e182087..13ad4cd451c73133956d78261acb60637b006805 100644 +--- a/net/minecraft/world/entity/monster/zombie/Drowned.java ++++ b/net/minecraft/world/entity/monster/zombie/Drowned.java +@@ -133,6 +133,13 @@ public class Drowned extends Zombie implements RangedAttackMob { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.drownedAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void addBehaviourGoals() { + this.goalSelector.addGoal(1, new Drowned.DrownedGoToWaterGoal(this, 1.0)); +diff --git a/net/minecraft/world/entity/monster/zombie/Husk.java b/net/minecraft/world/entity/monster/zombie/Husk.java +index 31b91dbc3f3e1875fbe6750bb815514686d14f7f..ef289dd3fe0be980c200affb0b84a1066fe52232 100644 +--- a/net/minecraft/world/entity/monster/zombie/Husk.java ++++ b/net/minecraft/world/entity/monster/zombie/Husk.java +@@ -83,6 +83,13 @@ public class Husk extends Zombie { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.huskAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + public boolean isSunSensitive() { + return this.shouldBurnInDay; // Purpur - moved to LivingEntity; keep methods for ABI compatibility - API for any mob to burn daylight +diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java +index d32a831ba76f65c4719c2672ffaec81a861cc7e6..f14fc03577a94dc6bd6e536e819a32c2d6144f02 100644 +--- a/net/minecraft/world/entity/monster/zombie/Zombie.java ++++ b/net/minecraft/world/entity/monster/zombie/Zombie.java +@@ -150,6 +150,13 @@ public class Zombie extends Monster { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.zombieAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void registerGoals() { + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables +diff --git a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +index 8ed04b75cc0a2fa0d18eb7929be8f14dc5fb38b8..d5c6db7e598bf03ae1d61ecbf6a003372b96a1db 100644 +--- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java ++++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +@@ -125,6 +125,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.zombieVillagerAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void defineSynchedData(SynchedEntityData.Builder builder) { + super.defineSynchedData(builder); +diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +index 9a1da88752b0dd708365dd41a074cc0e90f36e1c..528baf4ca71725d4af6876d195b6d75fdab5ca58 100644 +--- a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java ++++ b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +@@ -113,6 +113,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { + } + // Purpur end - Toggle for water sensitive mob damage + ++ // Purpur start - Mobs always drop experience ++ @Override ++ protected boolean isAlwaysExperienceDropper() { ++ return this.level().purpurConfig.zombifiedPiglinAlwaysDropExp; ++ } ++ // Purpur end - Mobs always drop experience ++ + @Override + protected void addBehaviourGoals() { + this.goalSelector.addGoal(1, new SpearUseGoal<>(this, 1.0, 1.0, 10.0F, 2.0F)); +diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java +index b8409bb066039766e0b4f680b35c3bc16e5c37d8..a3cd6680ddfe9cb3cb35c7f0cf08a7efc9d37fe1 100644 +--- a/net/minecraft/world/entity/npc/villager/Villager.java ++++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -289,6 +289,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } // Purpur end - Toggle for water sensitive mob damage @@ -1318,11 +1318,11 @@ index 2a145e4eb0474950cbfb4a229891b4b2320d98d2..bfff91e5e252141f887d8965ecf1dd9f @Override public Brain getBrain() { return (Brain)super.getBrain(); -diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java -index 6e5f5711b729b41f5221fb7e7d0c8dad57f790ca..75d8e6d3e89959785fb2c187ec804bb53dba72d1 100644 ---- a/net/minecraft/world/entity/npc/WanderingTrader.java -+++ b/net/minecraft/world/entity/npc/WanderingTrader.java -@@ -105,6 +105,13 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +index cabebbc25788a8c41912f97dac85af41c9433b68..9502fe0c4f125f5802fde032954c447b14435da2 100644 +--- a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java ++++ b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +@@ -106,6 +106,13 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over } // Purpur end - Toggle for water sensitive mob damage