From 465f4d86be422c7e3e025a257851e55d8d76ae8d Mon Sep 17 00:00:00 2001 From: granny Date: Tue, 24 Mar 2026 01:25:28 -0700 Subject: [PATCH] apply minecraft feature patches --- .../0001-Ridables.patch | 1327 +++++++++-------- ...-Configurable-entity-base-attributes.patch | 398 ++--- .../0003-Barrels-and-enderchests-6-rows.patch | 74 +- .../0004-Giants-AI-settings.patch | 4 +- .../0005-Chickens-can-retaliate.patch | 12 +- ...-Minecart-settings-and-WASD-controls.patch | 34 +- ...0007-Villagers-follow-emerald-blocks.patch | 34 +- .../0008-Implement-elytra-settings.patch | 59 +- .../0009-Configurable-jockey-options.patch | 54 +- ...ed-to-crystals-and-crystals-shoot-ph.patch | 30 +- .../0011-Phantoms-burn-in-light.patch | 24 +- ...e-entity-breeding-times-configurable.patch | 202 +-- ...mes-from-item-forms-of-entities-to-e.patch | 54 +- ...Villager-Clerics-to-farm-Nether-Wart.patch | 132 +- ...fing-override-to-everything-affected.patch | 230 +-- ...oggle-for-water-sensitive-mob-damage.patch | 316 ++-- ...017-API-for-any-mob-to-burn-daylight.patch | 129 +- ...turally-aggressive-to-players-chance.patch | 32 +- .../0019-Mobs-always-drop-experience.patch | 302 ++-- ...etting-to-reintroduce-end-void-rings.patch | 14 +- ...ob-mob_griefing-loot-pickup-override.patch | 98 +- 21 files changed, 1777 insertions(+), 1782 deletions(-) rename purpur-server/minecraft-patches/{unapplied-features => features}/0001-Ridables.patch (80%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0002-Configurable-entity-base-attributes.patch (83%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0003-Barrels-and-enderchests-6-rows.patch (75%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0004-Giants-AI-settings.patch (96%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0005-Chickens-can-retaliate.patch (88%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0006-Minecart-settings-and-WASD-controls.patch (84%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0007-Villagers-follow-emerald-blocks.patch (81%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0008-Implement-elytra-settings.patch (57%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0009-Configurable-jockey-options.patch (72%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0010-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch (91%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0011-Phantoms-burn-in-light.patch (68%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0012-Make-entity-breeding-times-configurable.patch (75%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0013-Apply-display-names-from-item-forms-of-entities-to-e.patch (71%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0014-Option-for-Villager-Clerics-to-farm-Nether-Wart.patch (50%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0015-Add-mobGriefing-override-to-everything-affected.patch (66%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0016-Toggle-for-water-sensitive-mob-damage.patch (80%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0017-API-for-any-mob-to-burn-daylight.patch (72%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0018-Cows-naturally-aggressive-to-players-chance.patch (78%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0019-Mobs-always-drop-experience.patch (81%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0020-Setting-to-reintroduce-end-void-rings.patch (86%) rename purpur-server/minecraft-patches/{unapplied-features => features}/0021-Per-mob-mob_griefing-loot-pickup-override.patch (77%) diff --git a/purpur-server/minecraft-patches/unapplied-features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch similarity index 80% rename from purpur-server/minecraft-patches/unapplied-features/0001-Ridables.patch rename to purpur-server/minecraft-patches/features/0001-Ridables.patch index f13921bc2..332426b50 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 05eb0c3273ffa1b5a1ebd8f8ae42c11830d755c7..49d3154afe2ca5789e63bdf972c791969405c16d 100644 +index 64a82b414afd093c010878c150592c681665b735..1db70e2397137158c3df9603ea90743efc2da573 100644 --- a/net/minecraft/gametest/framework/GameTestHelper.java +++ b/net/minecraft/gametest/framework/GameTestHelper.java -@@ -324,6 +324,8 @@ public class GameTestHelper { +@@ -356,6 +356,8 @@ public class GameTestHelper { public void setAfk(final boolean afk) {} // Purpur - AFK API @@ -18,22 +18,22 @@ index 05eb0c3273ffa1b5a1ebd8f8ae42c11830d755c7..49d3154afe2ca5789e63bdf972c79196 public boolean isClientAuthoritative() { return false; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 7a54f6bc2a364c1d3ac1ed58b33ecf720a305840..9f3aec24bd8aa75ea116375c1cf0a54bcc229fa2 100644 +index 8ac4752585f8869d0802a71419499c55c48ba583..0d5558444e9b775c015148d79eb4b04355671cf9 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1831,6 +1831,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 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().identifier()); - /* Drop global time updates - if (this.tickCount % 20 == 0) { +@@ -1682,6 +1682,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - BlockPhysicsEvent + level.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent ++ level.hasRidableMoveEvent = org.purpurmc.purpur.event.entity.RidableMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Purpur - Ridables + level.updateLagCompensationTick(); // Paper - lag compensation + profiler.push(() -> level + " " + level.dimension().identifier()); + profiler.push("tick"); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 5130c0067f01eec31c69b9e71d904f932943b922..853bb92c034b6361ff8c55daf52f38a226fdae2c 100644 +index c04d81aeafeb17458d73620770ca3ae2b40794fb..d2746087c0ab4d0f135dc7907b99a33e7ceb8f80 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java -@@ -230,6 +230,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe +@@ -234,6 +234,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet 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 5130c0067f01eec31c69b9e71d904f932943b922..853bb92c034b6361ff8c55daf52f38a2 @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 a16813766ad244c002a752b0c03779c550d39e75..74f1230a2a7ca443ef4dc9572069529279b89552 100644 +index 25e3229ba9ede30d125e566c06b58a36c96bc776..e5d9c8e6999f3b7a40269fc5b06da4878a114046 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -772,6 +772,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -759,6 +759,15 @@ public class ServerPlayer extends Player { this.trackEnteredOrExitedLavaOnVehicle(); this.updatePlayerAttributes(); this.advancements.flushDirty(this, true); @@ -62,25 +62,25 @@ index a16813766ad244c002a752b0c03779c550d39e75..74f1230a2a7ca443ef4dc95720695292 private void updatePlayerAttributes() { diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index 74f8f1c8a3d688fadcbc266bac126e13d9d93dc5..91f9739bf34b824c5955ad0a9ef04dcb7c2e6736 100644 +index 28f8b8804890cc3607a12ac6c0bfcce1d74a1fd6..b8fb8bcfa15036e031e49e5b17e0aa6ab4a64ed4 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -2916,6 +2916,8 @@ public class ServerGamePacketListenerImpl - ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); - final boolean resendData = event.isCancelled() || !ServerGamePacketListenerImpl.this.player.getItemInHand(hand).is(itemType); +@@ -2930,6 +2930,8 @@ public class ServerGamePacketListenerImpl + ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); + final boolean resendData = event.isCancelled() || !ServerGamePacketListenerImpl.this.player.getItemInHand(hand).is(itemType); -+ player.processClick(hand); // Purpur - Ridables ++ player.processClick(hand); // Purpur - Ridables + - // Entity in bucket - SPIGOT-4048 and SPIGOT-6859 - 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 + // Entity in bucket - SPIGOT-4048 and SPIGOT-6859 + 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 5efb94bf1029fdbbd48937c1f3925421d6daacfd..c8bc831c49df48c3f2ea2ea2d22a0aec5d37923c 100644 +index 9afb6860a93c44ce508a9c1c5df4816d7feb2f4a..afcdf4aa479e27c858afab01191344e14a1f4ecc 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -3373,6 +3373,13 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -3159,6 +3159,13 @@ public abstract class Entity - this.passengers = ImmutableList.copyOf(list); + this.passengers = ImmutableList.copyOf(newPassengers); } + + // Purpur start - Ridables @@ -92,7 +92,7 @@ index 5efb94bf1029fdbbd48937c1f3925421d6daacfd..c8bc831c49df48c3f2ea2ea2d22a0aec } } -@@ -3413,6 +3420,14 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -3200,6 +3207,14 @@ public abstract class Entity return false; } // CraftBukkit end @@ -107,7 +107,7 @@ index 5efb94bf1029fdbbd48937c1f3925421d6daacfd..c8bc831c49df48c3f2ea2ea2d22a0aec if (this.passengers.size() == 1 && this.passengers.get(0) == passenger) { this.passengers = ImmutableList.of(); } else { -@@ -5463,4 +5478,44 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -5157,4 +5172,44 @@ public abstract class Entity return ((ServerLevel) this.level()).isPositionEntityTicking(this.blockPosition()); } // Paper end - Expose entity id counter @@ -153,10 +153,10 @@ index 5efb94bf1029fdbbd48937c1f3925421d6daacfd..c8bc831c49df48c3f2ea2ea2d22a0aec + // Purpur end - Ridables } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 527db90fa6faa6f39a80e64db16e28f1d616ce4d..23b51bcf8397a4fc9fdedbd4fcee379322477d39 100644 +index 61872c754fec8e93ebd187af2f0ebe7548b668d5..e19911cbf8abf29f8182755d96f10507bc3d757b 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -244,9 +244,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -243,9 +243,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin protected int noActionTime; public float lastHurt; public boolean jumping; @@ -166,27 +166,27 @@ index 527db90fa6faa6f39a80e64db16e28f1d616ce4d..23b51bcf8397a4fc9fdedbd4fcee3793 + public float xxa; public float getStrafeMot() { return xxa; } public void setStrafeMot(float strafe) { xxa = strafe; } // Purpur - OBFHELPER + public float yya; public float getVerticalMot() { return yya; } public void setVerticalMot(float vertical) { yya = vertical; } // Purpur - OBFHELPER + public float zza; public float getForwardMot() { return zza; } public void setForwardMot(float forward) { zza = forward; } // Purpur - OBFHELPER - protected InterpolationHandler interpolation = new InterpolationHandler(this); + protected final InterpolationHandler interpolation = new InterpolationHandler(this); protected double lerpYHeadRot; protected int lerpHeadSteps; -@@ -294,7 +294,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -295,7 +295,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - protected LivingEntity(EntityType type, Level level) { + protected LivingEntity(final EntityType type, final Level level) { super(type, level); - this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type)); + this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type), this); // Purpur - Ridables this.craftAttributes = new org.bukkit.craftbukkit.attribute.CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - this.setHealth(this.getMaxHealth()) inlined and simplified to skip the instanceof check for Player, as getBukkitEntity() is not initialized in constructor this.entityData.set(LivingEntity.DATA_HEALTH_ID, this.getMaxHealth()); -@@ -371,6 +371,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -365,6 +365,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin .add(Attributes.CAMERA_DISTANCE) .add(Attributes.WAYPOINT_TRANSMIT_RANGE); } + public boolean shouldSendAttribute(Attribute attribute) { return true; } // Purpur - Ridables @Override - protected void checkFallDamage(double y, boolean onGround, BlockState state, BlockPos pos) { -@@ -3123,6 +3124,20 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + protected void checkFallDamage(final double ya, final boolean onGround, final BlockState onState, final BlockPos pos) { +@@ -3166,6 +3167,20 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.5)); } else { @@ -198,18 +198,18 @@ index 527db90fa6faa6f39a80e64db16e28f1d616ce4d..23b51bcf8397a4fc9fdedbd4fcee3793 + } + + float frictionCompensation = 0.16277137F / (friction * friction * friction); -+ this.moveRelative(this.onGround() ? 0.1F * frictionCompensation : 0.02F, relative); ++ this.moveRelative(this.onGround() ? 0.1F * frictionCompensation : 0.02F, input); + this.move(MoverType.SELF, this.getDeltaMovement()); + this.setDeltaMovement(this.getDeltaMovement().scale(friction)); + return; + } + // Purpur end - Ridables - this.moveRelative(amount, relative); + this.moveRelative(airSpeed, input); this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.91F)); -@@ -3811,8 +3826,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3864,8 +3879,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.pushEntities(); - profilerFiller.pop(); + profiler.pop(); // Paper start - Add EntityMoveEvent - if (((ServerLevel) this.level()).hasEntityMoveEvent && !(this instanceof Player)) { - if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { @@ -220,7 +220,7 @@ index 527db90fa6faa6f39a80e64db16e28f1d616ce4d..23b51bcf8397a4fc9fdedbd4fcee3793 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()); -@@ -3822,6 +3839,21 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3875,6 +3892,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()); } } @@ -243,10 +243,10 @@ index 527db90fa6faa6f39a80e64db16e28f1d616ce4d..23b51bcf8397a4fc9fdedbd4fcee3793 // 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 cf2cbc3bf5e0000737ebeac3867f12d7e07bda01..94e7307c0d15fdef7f7dcb28473cb76661600b0e 100644 +index 3ad8b4973534975fcf313e01f9cf77b447de8a2f..be578b5d4430e934342d3e80b70a1ea56b020a5c 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 +@@ -156,8 +156,8 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs super(type, level); this.goalSelector = new GoalSelector(); this.targetSelector = new GoalSelector(); @@ -257,7 +257,7 @@ index cf2cbc3bf5e0000737ebeac3867f12d7e07bda01..94e7307c0d15fdef7f7dcb28473cb766 this.jumpControl = new JumpControl(this); this.bodyRotationControl = this.createBodyControl(); this.navigation = this.createNavigation(level); -@@ -594,6 +594,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -597,6 +597,7 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs } } } else { @@ -265,16 +265,16 @@ index cf2cbc3bf5e0000737ebeac3867f12d7e07bda01..94e7307c0d15fdef7f7dcb28473cb766 this.igniteForSeconds(8.0F); } } -@@ -1357,7 +1358,7 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -1361,7 +1362,7 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs } - protected InteractionResult mobInteract(Player player, InteractionHand hand) { + protected InteractionResult mobInteract(final Player player, final InteractionHand hand) { - return InteractionResult.PASS; + return tryRide(player, hand); // Purpur - Ridables } - protected void usePlayerItem(Player player, InteractionHand hand, ItemStack stack) { -@@ -1697,4 +1698,58 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + protected void usePlayerItem(final Player player, final InteractionHand hand, final ItemStack itemStack) { +@@ -1704,4 +1705,58 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs public float chargeSpeedModifier() { return 1.0F; } @@ -334,7 +334,7 @@ index cf2cbc3bf5e0000737ebeac3867f12d7e07bda01..94e7307c0d15fdef7f7dcb28473cb766 + // Purpur end - Ridables } diff --git a/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/net/minecraft/world/entity/ai/attributes/AttributeMap.java -index 92b7f4cbd276dad49cba78514db3552af8cdd80c..fd26471047cc5bef28ee9ddba4a8542deef889cc 100644 +index 0c8a719bdfb4932171a8f66d76b00cc499f5beb9..a3a1a5562e4940c96c688820c0fba4cf53fbcd48 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 { @@ -343,7 +343,7 @@ index 92b7f4cbd276dad49cba78514db3552af8cdd80c..fd26471047cc5bef28ee9ddba4a8542d private final AttributeSupplier supplier; + private final net.minecraft.world.entity.LivingEntity entity; // Purpur - Ridables - public AttributeMap(AttributeSupplier supplier) { + public AttributeMap(final AttributeSupplier supplier) { - this.supplier = supplier; + // Purpur start - Ridables + this(supplier, null); @@ -354,11 +354,11 @@ index 92b7f4cbd276dad49cba78514db3552af8cdd80c..fd26471047cc5bef28ee9ddba4a8542d + this.supplier = defaultAttributes; } - private void onAttributeModified(AttributeInstance instance) { - this.attributesToUpdate.add(instance); -- if (instance.getAttribute().value().isClientSyncable()) { -+ if (instance.getAttribute().value().isClientSyncable() && (entity == null || entity.shouldSendAttribute(instance.getAttribute().value()))) { // Purpur - Ridables - this.attributesToSync.add(instance); + private void onAttributeModified(final AttributeInstance attributeInstance) { + this.attributesToUpdate.add(attributeInstance); +- if (attributeInstance.getAttribute().value().isClientSyncable()) { ++ if (attributeInstance.getAttribute().value().isClientSyncable() && (entity == null || entity.shouldSendAttribute(attributeInstance.getAttribute().value()))) { // Purpur - Ridables + this.attributesToSync.add(attributeInstance); } } @@ -39,7 +46,7 @@ public class AttributeMap { @@ -369,9 +369,9 @@ index 92b7f4cbd276dad49cba78514db3552af8cdd80c..fd26471047cc5bef28ee9ddba4a8542d + return this.attributes.values().stream().filter(instance -> instance.getAttribute().value().isClientSyncable() && (entity == null || entity.shouldSendAttribute(instance.getAttribute().value()))).collect(Collectors.toList()); // Purpur - Ridables } - public @Nullable AttributeInstance getInstance(Holder attribute) { + public @Nullable AttributeInstance getInstance(final Holder attribute) { diff --git a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java -index 6cf01fe1aac41af171b444ac737816a06bd80d6f..686776bb00560f9da8838bd5f8dd64aaddfa7a2b 100644 +index 3b122f0bdfd8490297d173c05c1412c9fcfc886e..6b78ddb4ec40d45634288796a98e34714e0deb68 100644 --- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java @@ -142,7 +142,7 @@ public class DefaultAttributes { @@ -384,7 +384,7 @@ index 6cf01fe1aac41af171b444ac737816a06bd80d6f..686776bb00560f9da8838bd5f8dd64aa .put(EntityType.PIGLIN, Piglin.createAttributes().build()) .put(EntityType.PIGLIN_BRUTE, PiglinBrute.createAttributes().build()) diff --git a/net/minecraft/world/entity/ai/control/MoveControl.java b/net/minecraft/world/entity/ai/control/MoveControl.java -index b7a4b5ad718e8f4ea108f606669d4fcaf5219e6f..0604fca0687e02e75c097ff864b13e2763bfeb76 100644 +index 2e32e89ec476ec1a2250f25e7ddcb8b3454a06ef..16290aebce2f45be1c56a57b0d0309ba42bf1a60 100644 --- a/net/minecraft/world/entity/ai/control/MoveControl.java +++ b/net/minecraft/world/entity/ai/control/MoveControl.java @@ -29,6 +29,20 @@ public class MoveControl implements Control { @@ -409,7 +409,7 @@ index b7a4b5ad718e8f4ea108f606669d4fcaf5219e6f..0604fca0687e02e75c097ff864b13e27 return this.operation == MoveControl.Operation.MOVE_TO; } diff --git a/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java b/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java -index d7f9b3b2b1077ea10e8f64b87c8f4c4354e90858..713f62b34a91fa76f40e49a5e390145f70755e58 100644 +index 99493ad5ca4222a2817ee061be01fb888666b3a4..5829ea72b321b2b63f60407aabd83e1b2bd9681c 100644 --- a/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java +++ b/net/minecraft/world/entity/ai/control/SmoothSwimmingLookControl.java @@ -3,7 +3,7 @@ package net.minecraft.world.entity.ai.control; @@ -429,14 +429,14 @@ index d7f9b3b2b1077ea10e8f64b87c8f4c4354e90858..713f62b34a91fa76f40e49a5e390145f + public void vanillaTick() { // Purpur - Ridables if (this.lookAtCooldown > 0) { this.lookAtCooldown--; - this.getYRotD().ifPresent(rotationWanted -> this.mob.yHeadRot = this.rotateTowards(this.mob.yHeadRot, rotationWanted + 20.0F, this.yMaxRotSpeed)); + this.getYRotD().ifPresent(yRotD -> this.mob.yHeadRot = this.rotateTowards(this.mob.yHeadRot, yRotD + 20.0F, this.yMaxRotSpeed)); diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index ca68d356e892e0ac8a651ced92aab7dbfd4699b4..2cfcf1f7473d8612777ca0752f6d1521c231ef42 100644 +index c2831ffb9a4765a628f8f005dc1218405301e926..7f036c3548aea7a23f5a085ce6d9ce987fbc5116 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java @@ -42,11 +42,58 @@ public class Bat extends AmbientCreature { - public Bat(EntityType type, Level level) { + public Bat(final EntityType type, final Level level) { super(type, level); + this.moveControl = new org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD(this, 0.075F); // Purpur - Ridables if (!level.isClientSide()) { @@ -502,10 +502,10 @@ index ca68d356e892e0ac8a651ced92aab7dbfd4699b4..2cfcf1f7473d8612777ca0752f6d1521 } public boolean isResting() { -@@ -128,6 +175,14 @@ public class Bat extends AmbientCreature { +@@ -128,6 +175,13 @@ public class Bat extends AmbientCreature { @Override - protected void customServerAiStep(ServerLevel level) { + protected void customServerAiStep(final ServerLevel level) { + // Purpur start - Ridables + if (getRider() != null && this.isControllable()) { + Vec3 mot = getDeltaMovement(); @@ -513,21 +513,20 @@ index ca68d356e892e0ac8a651ced92aab7dbfd4699b4..2cfcf1f7473d8612777ca0752f6d1521 + return; + } + // Purpur end - Ridables -+ super.customServerAiStep(level); - BlockPos blockPos = this.blockPosition(); - BlockPos blockPos1 = blockPos.above(); + BlockPos pos = this.blockPosition(); + BlockPos above = pos.above(); diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java -index 0591dc9c39f94768c5ebf74cad7bae98921ff66c..6ab6305f0b25f7c860673c70d9ce911688ecf1e6 100644 +index 25b6e4904f0dff6159f3fb99e4226a397ef6a72b..cf1bfb79588236fc648aefcc64bb759862084f58 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 +@@ -100,10 +100,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) { + public Allay(final EntityType type, final Level level) { super(type, level); - this.moveControl = new FlyingMoveControl(this, 20, true); + // Purpur start - Ridables @@ -546,7 +545,7 @@ index 0591dc9c39f94768c5ebf74cad7bae98921ff66c..6ab6305f0b25f7c860673c70d9ce9116 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 +@@ -119,6 +132,28 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS } // CraftBukkit end @@ -573,21 +572,21 @@ index 0591dc9c39f94768c5ebf74cad7bae98921ff66c..6ab6305f0b25f7c860673c70d9ce9116 + // Purpur end - Ridables + @Override - 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"); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); +@@ -209,6 +244,7 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("allayBrain"); + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.pop(); - profilerFiller.push("allayActivityUpdate"); + profiler.pop(); + profiler.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 +index 03ec05a860781f85e58055d6f58893963781bd97..1df0f3e17dadd836dbac39feec56c3b198117340 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 { +@@ -90,6 +90,23 @@ public class Armadillo extends Animal { return Animal.createAnimalAttributes().add(Attributes.MAX_HEALTH, 12.0).add(Attributes.MOVEMENT_SPEED, 0.14); } @@ -609,13 +608,13 @@ index 901e4e9897e76cd4158d7f8bb8ec829df8ff8196..767a730baa8a7694ed7d5f05b70118da + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 2e5291af79a04ff7ebfc533596a008b404571214..3837397563bf3d568c120ae4e4e38d1a6dc7a8b2 100644 +index bcbe1d44871124e0b9b453cb7b7c453fa0144bc6..8704620cd9348d3c417cbc9591e03c70bf4d4f45 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 { +@@ -118,6 +118,23 @@ public class Axolotl extends Animal implements Bucketable { this.lookControl = new Axolotl.AxolotlLookControl(this, 20); } @@ -637,17 +636,17 @@ index 2e5291af79a04ff7ebfc533596a008b404571214..3837397563bf3d568c120ae4e4e38d1a + // Purpur end - Ridables + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final 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"); +@@ -366,6 +383,7 @@ public class Axolotl extends Animal implements Bucketable { + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.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 { + profiler.pop(); + profiler.push("axolotlActivityUpdate"); +@@ -605,23 +623,31 @@ public class Axolotl extends Animal implements Bucketable { } @Override @@ -660,11 +659,11 @@ index 2e5291af79a04ff7ebfc533596a008b404571214..3837397563bf3d568c120ae4e4e38d1a } } - static class AxolotlMoveControl extends SmoothSwimmingMoveControl { + private static class AxolotlMoveControl extends SmoothSwimmingMoveControl { private final Axolotl axolotl; + private final org.purpurmc.purpur.controller.WaterMoveControllerWASD waterController; // Purpur - Ridables - public AxolotlMoveControl(Axolotl axolotl) { + public AxolotlMoveControl(final 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 @@ -682,18 +681,18 @@ index 2e5291af79a04ff7ebfc533596a008b404571214..3837397563bf3d568c120ae4e4e38d1a super.tick(); } diff --git a/net/minecraft/world/entity/animal/bee/Bee.java b/net/minecraft/world/entity/animal/bee/Bee.java -index 7b9280526af353c3ab1f32e5195499e773731352..bd3dc923058b884afcfad08062230182810c65a2 100644 +index 2e53c280911f6c155f92512c77d36601fed220f1..711374cbc982b29800830c856975963a47b63f21 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 { +@@ -154,6 +154,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { - public Bee(EntityType type, Level level) { + public Bee(final EntityType type, final Level level) { super(type, level); + final org.purpurmc.purpur.controller.FlyingMoveControllerWASD flyingController = new org.purpurmc.purpur.controller.FlyingMoveControllerWASD(this, 0.25F, 1.0F, false); // Purpur - Ridables // Paper start - Fix MC-167279 class BeeFlyingMoveControl extends FlyingMoveControl { public BeeFlyingMoveControl(final Mob mob, final int maxTurn, final boolean hoversInPlace) { -@@ -161,11 +162,24 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -162,11 +163,24 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { @Override public void tick() { @@ -718,7 +717,7 @@ index 7b9280526af353c3ab1f32e5195499e773731352..bd3dc923058b884afcfad08062230182 } this.moveControl = new BeeFlyingMoveControl(this, 20, true); // Paper end - Fix MC-167279 -@@ -177,6 +191,40 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -178,6 +192,40 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { this.setPathfindingMalus(PathType.FENCE, -1.0F); } @@ -757,9 +756,9 @@ index 7b9280526af353c3ab1f32e5195499e773731352..bd3dc923058b884afcfad08062230182 + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -@@ -191,6 +239,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); +@@ -192,6 +240,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { @Override protected void registerGoals() { @@ -767,7 +766,7 @@ index 7b9280526af353c3ab1f32e5195499e773731352..bd3dc923058b884afcfad08062230182 this.goalSelector.addGoal(0, new Bee.BeeAttackGoal(this, 1.4F, true)); this.goalSelector.addGoal(1, new Bee.BeeEnterHiveGoal()); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); -@@ -208,6 +257,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -209,6 +258,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { this.goalSelector.addGoal(7, new Bee.BeeGrowCropGoal()); this.goalSelector.addGoal(8, new Bee.BeeWanderGoal()); this.goalSelector.addGoal(9, new FloatGoal(this)); @@ -775,13 +774,14 @@ index 7b9280526af353c3ab1f32e5195499e773731352..bd3dc923058b884afcfad08062230182 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)); -@@ -1085,15 +1135,15 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1119,16 +1169,16 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { } } -- class BeeLookControl extends LookControl { -+ class BeeLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables +- private class BeeLookControl extends LookControl { ++ private class BeeLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables BeeLookControl(final Mob mob) { + Objects.requireNonNull(Bee.this); super(mob); } @@ -795,11 +795,11 @@ index 7b9280526af353c3ab1f32e5195499e773731352..bd3dc923058b884afcfad08062230182 } diff --git a/net/minecraft/world/entity/animal/camel/Camel.java b/net/minecraft/world/entity/animal/camel/Camel.java -index 98721e4d406385108b3d63e9e811f730454090e7..a6a66084323435697b3185d7b86acaf5c7453719 100644 +index 3d3d18a007d23a093f5ae2d8d0c43c022e6efe9f..97279af0178ed202810b37d5b40fe75b223238b8 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); +@@ -96,6 +96,13 @@ public class Camel extends AbstractHorse { + navigation.setCanWalkOverFences(true); } + // Purpur start - Ridables @@ -810,13 +810,13 @@ index 98721e4d406385108b3d63e9e811f730454090e7..a6a66084323435697b3185d7b86acaf5 + // Purpur end - Ridables + @Override - protected void addAdditionalSaveData(ValueOutput output) { + protected void addAdditionalSaveData(final 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 +index 1012283390664fb31bc318864501e14dca5b4208..b0b7398e36a30e5a932ce4a9d531d0c258e64604 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 { +@@ -76,9 +76,27 @@ public class Chicken extends Animal { this.setPathfindingMalus(PathType.WATER, 0.0F); } @@ -843,9 +843,9 @@ index b44367e42793cec9af35f50dffff479b4be7b728..4961bb85b91f68075cf0d22440d6377d + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables 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)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.0, i -> i.is(ItemTags.CHICKEN_FOOD), false)); diff --git a/net/minecraft/world/entity/animal/cow/AbstractCow.java b/net/minecraft/world/entity/animal/cow/AbstractCow.java -index f6f251227db315b58bee45f8011624a347eb8fea..a25ef3bc802759f61947ef8242c19e9320693d35 100644 +index 51e3873470372cbe7ce8b1d484d9235bba1c76a0..d398abfcb198b18fd4e41e3f3ecddb40d069bfb0 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 { @@ -855,16 +855,16 @@ index f6f251227db315b58bee45f8011624a347eb8fea..a25ef3bc802759f61947ef8242c19e93 + 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 { + this.goalSelector.addGoal(3, new TemptGoal(this, 1.25, i -> level().purpurConfig.cowFeedMushrooms > 0 && (i.is(net.minecraft.world.level.block.Blocks.RED_MUSHROOM.asItem()) || i.is(net.minecraft.world.level.block.Blocks.BROWN_MUSHROOM.asItem())) || i.is(ItemTags.COW_FOOD), false)); // Purpur - Cows eat mushrooms +@@ -87,13 +88,14 @@ public abstract class AbstractCow extends Animal { @Override - public InteractionResult mobInteract(Player player, InteractionHand hand) { + public InteractionResult mobInteract(final Player player, final InteractionHand hand) { + if (getRider() != null) return InteractionResult.PASS; // Purpur - Ridables - ItemStack itemInHand = player.getItemInHand(hand); - if (itemInHand.is(Items.BUCKET) && !this.isBaby()) { + ItemStack itemStack = player.getItemInHand(hand); + if (itemStack.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); + org.bukkit.event.player.PlayerBucketFillEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerBucketFillEvent(player.level(), player, this.blockPosition(), this.blockPosition(), null, itemStack, Items.MILK_BUCKET, hand); if (event.isCancelled()) { player.containerMenu.sendAllDataToRemote(); // Paper - Fix inventory desync - return InteractionResult.PASS; @@ -873,10 +873,10 @@ index f6f251227db315b58bee45f8011624a347eb8fea..a25ef3bc802759f61947ef8242c19e93 // 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 +index 340f3b24842a064044f6bf338f3888af90068eac..e200b9a459c3f410d2e9affbad8ba8e37e1a1ca5 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 { +@@ -34,6 +34,23 @@ public class Cow extends AbstractCow { super(type, level); } @@ -898,10 +898,10 @@ index f37322e0d90ea055a643b144dd87578df6a0bcc9..0268063bb0db8c30c594a7d75d0d11f7 + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/cow/MushroomCow.java b/net/minecraft/world/entity/animal/cow/MushroomCow.java -index ea6299e728d7c7e7a52d7c65d759407ba27c8eac..1a9f5f17e46af831bc6621c83c57e5436397dbc2 100644 +index a22c787019d9de651699615947f613b24f0476c8..2131ba3eb10e869ff6dad67fb6b8097a8d6f1ab6 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 { @@ -926,11 +926,11 @@ index ea6299e728d7c7e7a52d7c65d759407ba27c8eac..1a9f5f17e46af831bc6621c83c57e543 + // Purpur end - Ridables + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final 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); + java.util.List drops = this.generateDefaultDrops(level, itemStack); + org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemStack, hand, drops); if (event != null) { - if (event.isCancelled()) return InteractionResult.PASS; + if (event.isCancelled()) return tryRide(player, hand); // Purpur - Ridables @@ -938,16 +938,16 @@ index ea6299e728d7c7e7a52d7c65d759407ba27c8eac..1a9f5f17e46af831bc6621c83c57e543 // 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 50b8abff1e20855ba8c8acb225c251a1223b8b58..90ad3a0115c3cee36a310505d945afd13ae2c817 100644 +index a7f918956bf708f24ffd5599abb9d6e1e463800e..4557453a90f8ee822853cdd236f3c5cd670ba65f 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 { +@@ -78,14 +78,82 @@ public class Dolphin extends AgeableWaterCreature { private static final boolean DEFAULT_GOT_FISH = false; - @Nullable public BlockPos treasurePos; + public @Nullable BlockPos treasurePos; private boolean isNaturallyAggressiveToPlayers; // Purpur - Dolphins naturally aggressive to players chance + private int spitCooldown; // Purpur - Ridables - public Dolphin(EntityType type, Level level) { + public Dolphin(final EntityType type, final Level level) { super(type, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + // Purpur start - Ridables @@ -1024,8 +1024,8 @@ index 50b8abff1e20855ba8c8acb225c251a1223b8b58..90ad3a0115c3cee36a310505d945afd1 + @Override public @Nullable SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData -@@ -158,6 +226,7 @@ public class Dolphin extends AgeableWaterCreature { + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, final @Nullable SpawnGroupData groupData +@@ -160,6 +228,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 @@ -1033,24 +1033,24 @@ index 50b8abff1e20855ba8c8acb225c251a1223b8b58..90ad3a0115c3cee36a310505d945afd1 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)); -@@ -168,6 +237,7 @@ public class Dolphin extends AgeableWaterCreature { - this.goalSelector.addGoal(8, new Dolphin.PlayWithItemsGoal()); - this.goalSelector.addGoal(8, new FollowBoatGoal(this)); +@@ -171,6 +240,7 @@ public class Dolphin extends AgeableWaterCreature { + this.goalSelector.addGoal(8, new FollowPlayerRiddenEntityGoal(this, AbstractBoat.class)); + this.goalSelector.addGoal(8, new FollowPlayerRiddenEntityGoal(this, AbstractNautilus.class)); this.goalSelector.addGoal(9, new AvoidEntityGoal<>(this, Guardian.class, 8.0F, 1.0, 1.0)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables 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 } -@@ -213,7 +283,7 @@ public class Dolphin extends AgeableWaterCreature { +@@ -216,7 +286,7 @@ public class Dolphin extends AgeableWaterCreature { @Override - protected boolean canRide(Entity entity) { + protected boolean canRide(final Entity vehicle) { - return true; + return boardingCooldown <= 0; // Purpur - make dolphin honor ride cooldown like all other non-boss mobs; } @Override -@@ -242,6 +312,11 @@ public class Dolphin extends AgeableWaterCreature { +@@ -245,6 +315,11 @@ public class Dolphin extends AgeableWaterCreature { @Override public void tick() { super.tick(); @@ -1063,12 +1063,12 @@ index 50b8abff1e20855ba8c8acb225c251a1223b8b58..90ad3a0115c3cee36a310505d945afd1 this.setAirSupply(this.getMaxAirSupply()); } else { diff --git a/net/minecraft/world/entity/animal/equine/AbstractHorse.java b/net/minecraft/world/entity/animal/equine/AbstractHorse.java -index e837c63631c637238b9fe0ba05984af5e0d2b833..a1dce0a5ce1fcd0a2ff7104b3592ffd5c948db34 100644 +index f6a04a6e56ad1de9121e9e8aab70277c323c70a7..91a3db41e0ccf2a416fffcd0855f1048e88849b6 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 +@@ -129,11 +129,21 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump - protected AbstractHorse(EntityType type, Level level) { + protected AbstractHorse(final EntityType type, final 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 @@ -1085,10 +1085,10 @@ index e837c63631c637238b9fe0ba05984af5e0d2b833..a1dce0a5ce1fcd0a2ff7104b3592ffd5 @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 + this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.0)); +@@ -143,6 +153,7 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump if (this.canPerformRearing()) { this.goalSelector.addGoal(9, new RandomStandGoal(this)); } @@ -1097,7 +1097,7 @@ index e837c63631c637238b9fe0ba05984af5e0d2b833..a1dce0a5ce1fcd0a2ff7104b3592ffd5 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 +index 1c171229997aa5c8e586918d9ed003b7f3c6e5f3..980160d37a51b862df3bda18a1bdb92e83badf3c 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 { @@ -1115,11 +1115,11 @@ index 55844fe13c403a55d135ec4ff4731d88601b205e..8aec9f254c82993632e68368d37b8c9b 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 +index 87e34dd94340be58ade945992e26dd81ee19b0a4..d2dc51d7a8d97db64bf87f8337b10442acc5bc47 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); +@@ -48,6 +48,13 @@ public class Horse extends AbstractHorse { + super(type, level); } + // Purpur start - Ridables @@ -1130,13 +1130,13 @@ index 1763543942a25a788c0f90241db75ddad70a7da8..cc50151ce6e6daffc1ecd41eb89a0d2f + // Purpur end - Ridables + @Override - protected void randomizeAttributes(RandomSource random) { + protected void randomizeAttributes(final 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 +index 9f7d9d3a4a7a7635cacb66b6839094c1f8d68740..cab5f2ebfdfb58ab322d81702af13a47c2276903 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 { +@@ -81,7 +81,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 @@ -1195,7 +1195,7 @@ index cceb66525a4d017b2db21bd301e63670c639223f..bba6493eee2f605faac0d49d665117d2 public boolean isTraderLlama() { return false; -@@ -120,6 +171,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { +@@ -119,6 +170,7 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -1203,7 +1203,7 @@ index cceb66525a4d017b2db21bd301e63670c639223f..bba6493eee2f605faac0d49d665117d2 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 { +@@ -129,6 +181,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)); @@ -1212,7 +1212,7 @@ index cceb66525a4d017b2db21bd301e63670c639223f..bba6493eee2f605faac0d49d665117d2 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 +index 1ebf80bac3e4cc17bbee795b9cb15c656b168396..ce4c2424cd6922c03cf44cc731526775eba25220 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 { @@ -1230,7 +1230,7 @@ index b5444b88d30e7d375495bdbbe1469beb72beb87a..60c151af9e51ba1dd1063344a3f5c021 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 +index c1bddbaadc8cc6d158ee79c9c37554d138a3dacc..e4ee09f1b51f80d35bd3f80f07d06093acc3bfcf 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 { @@ -1256,7 +1256,7 @@ index 0afb4c836e697f820696bd760cca761520bc8250..3d98259439c3bdb97ab2c66734daf90a @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 +index 95f499b7fdbe1620c6eb13b9a2e86bb6091af085..19497883e03603bc0a0f63c3b3734e32f9ed2e1d 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 { @@ -1289,11 +1289,11 @@ index 44f85dc4075e9fc000dc89ba01e2039c01989dde..68b72c18a3880dead3b32b646a2f6a09 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 +index a279cdff95c37434f44bdda7558286045e606f33..13857de6c4be09b7d0798d2a0fd420c705ac1d5d 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); +@@ -49,6 +49,18 @@ public class ZombieHorse extends AbstractHorse { + super(type, level); } + // Purpur start - Ridables @@ -1312,7 +1312,7 @@ index 4cfae7e877c6545780a8b9fdb3e326edb8cc7943..c1a13047c673cafc5de873215dd368ea 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 +index 2e87f67248e1741b7837c5e292f74db11b893921..4ef7feff4c157aceb1e296b70d492cc098518646 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 { @@ -1346,7 +1346,7 @@ index 6acd39413ab4fed1eaf251d3b6d9b9e184060e5c..2fe8b8382b7cb4056f4d430cf632ecf4 + @Override protected void registerGoals() { - this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); + this.temptGoal = new Cat.CatTemptGoal(this, 0.6, i -> i.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)); @@ -1360,16 +1360,16 @@ index 6acd39413ab4fed1eaf251d3b6d9b9e184060e5c..2fe8b8382b7cb4056f4d430cf632ecf4 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 { +@@ -402,6 +429,7 @@ public class Cat extends TamableAnimal { @Override - public InteractionResult mobInteract(Player player, InteractionHand hand) { + public InteractionResult mobInteract(final Player player, final InteractionHand hand) { + if (getRider() != null) return InteractionResult.PASS; // Purpur - Ridables - ItemStack itemInHand = player.getItemInHand(hand); - Item item = itemInHand.getItem(); + ItemStack itemStack = player.getItemInHand(hand); if (this.isTame()) { + if (this.isOwnedBy(player)) { diff --git a/net/minecraft/world/entity/animal/feline/Ocelot.java b/net/minecraft/world/entity/animal/feline/Ocelot.java -index 94fdbae92dabf7505a7c7b518d4c07b4f68c8e9c..22fa29aa785eda8fb4a895d36413626da8a49a0e 100644 +index 9fb38aaf63588cfe8a6f006a256c54a75ebbef46..93bfc93ae24d483f8a6c856d9ce978e34a064cd4 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 { @@ -1398,7 +1398,7 @@ index 94fdbae92dabf7505a7c7b518d4c07b4f68c8e9c..22fa29aa785eda8fb4a895d36413626d } @@ -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.temptGoal = new Ocelot.OcelotTemptGoal(this, 0.6, i -> i.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); @@ -1412,7 +1412,7 @@ index 94fdbae92dabf7505a7c7b518d4c07b4f68c8e9c..22fa29aa785eda8fb4a895d36413626d 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 +index 62303a59d3e0ec28bc3d6bf6fc459527ad80b1f1..5619119cce83a0c2d5efbb0579345510978716f1 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 { @@ -1426,23 +1426,23 @@ index 7b4215058325812e8dc785277d1ece0fd5dd6ea3..970904ce07ebc6aabc97166284cbb855 @@ -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 + protected void travelInWater(final Vec3 input, final double baseGravity, final boolean isFalling, final double oldY) { +- this.moveRelative(0.01F, input); ++ this.moveRelative(getRider() != null ? getSpeed() : 0.01F, input); // 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) { + protected void playStepSound(final BlockPos pos, final BlockState blockState) { } -- static class FishMoveControl extends MoveControl { -+ static class FishMoveControl extends org.purpurmc.purpur.controller.WaterMoveControllerWASD { // Purpur - Ridables +- private static class FishMoveControl extends MoveControl { ++ private static class FishMoveControl extends org.purpurmc.purpur.controller.WaterMoveControllerWASD { // Purpur - Ridables private final AbstractFish fish; - FishMoveControl(AbstractFish mob) { + FishMoveControl(final AbstractFish fish) { @@ -168,14 +169,22 @@ public abstract class AbstractFish extends WaterAnimal implements Bucketable { - this.fish = mob; + this.fish = fish; } + // Purpur start - Ridables @@ -1461,13 +1461,13 @@ index 7b4215058325812e8dc785277d1ece0fd5dd6ea3..970904ce07ebc6aabc97166284cbb855 } 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(); +- float targetSpeed = (float)(this.speedModifier * this.fish.getAttributeValue(Attributes.MOVEMENT_SPEED)); ++ float targetSpeed = (float)(this.getSpeedModifier() * this.fish.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables + this.fish.setSpeed(Mth.lerp(0.125F, this.fish.getSpeed(), targetSpeed)); + double xd = this.wantedX - this.fish.getX(); + double yd = 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 +index 1909fefa4af14a9aca43ccb8b93317b12ee4a092..becb5c214adacd36372bbe2b21ab15e341640f7d 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 { @@ -1490,7 +1490,7 @@ index 9a473f29931059e36a6fe8fa541c4706ababf59d..f73b3f5ae65f7793ff25145c72fb35e3 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 3acbe72a1c72c83b33671eb15ac76fc7a6135998..aea7887cd88604ed7a36f414221035abf999489d 100644 +index dd9e04e1f67469e7d5c839f8e174db572e6bb353..c31b7369194e9275e15415baa70cbb1b0de995f8 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 { @@ -1510,13 +1510,13 @@ index 3acbe72a1c72c83b33671eb15ac76fc7a6135998..aea7887cd88604ed7a36f414221035ab + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/fish/Salmon.java b/net/minecraft/world/entity/animal/fish/Salmon.java -index c691912a8b109e7430ffb39bb832983cbf33fc8a..b362ce156765ad45b8c29b5dc2c6d9d99d2e1474 100644 +index 9c5979d034c1292d7454f1b0f686fb39e3824ff3..e75e66134026a93e7681befb67abb5783fde37cf 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 { +@@ -41,6 +41,18 @@ public class Salmon extends AbstractSchoolingFish { this.refreshDimensions(); } @@ -1536,7 +1536,7 @@ index c691912a8b109e7430ffb39bb832983cbf33fc8a..b362ce156765ad45b8c29b5dc2c6d9d9 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 +index 28ca7d979776e1efdbeaf2758f0785053d2acb08..3d00bcbb4ac39c7d8b4bacf15d7cfe4ad5a4a706 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 { @@ -1555,14 +1555,14 @@ index e3961892ffc05bef4947bda75445ca5e255dce11..3281e75c48fb6cafdba088254009e5b4 + } + // Purpur end - Ridables + - public static String getPredefinedName(int variantId) { - return "entity.minecraft.tropical_fish.predefined." + variantId; + public static String getPredefinedName(final int index) { + return "entity.minecraft.tropical_fish.predefined." + index; } diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java -index 6d0eb7e0310b3fdd234dee5b8bf993d1c5ef27f1..bf00cf5e6fd8b9143e1b327ef7b90ae055d264ff 100644 +index 5966599df88fc7e1538f28240c127b1444cd748c..09077acab1f3905b7dfc84d36bfac84950baf477 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 { +@@ -155,6 +155,44 @@ public class Fox extends Animal { this.getNavigation().setRequiredPathLength(32.0F); } @@ -1605,17 +1605,17 @@ index 6d0eb7e0310b3fdd234dee5b8bf993d1c5ef27f1..bf00cf5e6fd8b9143e1b327ef7b90ae0 + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -@@ -170,6 +208,7 @@ public class Fox extends Animal { - this, AbstractFish.class, 20, false, false, (entity, level) -> entity instanceof AbstractSchoolingFish + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); +@@ -174,6 +212,7 @@ public class Fox extends Animal { + this, AbstractFish.class, 20, false, false, (target, level) -> target instanceof AbstractSchoolingFish ); this.goalSelector.addGoal(0, new Fox.FoxFloatGoal()); + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables 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)); -@@ -195,6 +234,7 @@ public class Fox extends Animal { +@@ -198,6 +237,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()); @@ -1623,13 +1623,14 @@ index 6d0eb7e0310b3fdd234dee5b8bf993d1c5ef27f1..bf00cf5e6fd8b9143e1b327ef7b90ae0 this.targetSelector .addGoal( 3, -@@ -1119,15 +1159,15 @@ public class Fox extends Animal { +@@ -1141,16 +1181,16 @@ public class Fox extends Animal { } } - public class FoxLookControl extends LookControl { + public class FoxLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables public FoxLookControl() { + Objects.requireNonNull(Fox.this); super(Fox.this); } @@ -1642,13 +1643,14 @@ index 6d0eb7e0310b3fdd234dee5b8bf993d1c5ef27f1..bf00cf5e6fd8b9143e1b327ef7b90ae0 } } -@@ -1163,15 +1203,15 @@ public class Fox extends Animal { +@@ -1187,16 +1227,16 @@ public class Fox extends Animal { } } -- class FoxMoveControl extends MoveControl { -+ class FoxMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables +- private class FoxMoveControl extends MoveControl { ++ private class FoxMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables public FoxMoveControl() { + Objects.requireNonNull(Fox.this); super(Fox.this); } @@ -1662,19 +1664,19 @@ index 6d0eb7e0310b3fdd234dee5b8bf993d1c5ef27f1..bf00cf5e6fd8b9143e1b327ef7b90ae0 } } diff --git a/net/minecraft/world/entity/animal/frog/Frog.java b/net/minecraft/world/entity/animal/frog/Frog.java -index 09d817aa34d4a6d8a49d614087f9942d75e673e8..5b4bb6fd100abc569c5da167735a220014bf5d8c 100644 +index 28b4e183efd851e6d2bb5bb16904817d4c40273b..977ee6a71e0c52f115a221b09248596db2534739 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 { +@@ -82,6 +82,8 @@ public class Frog extends Animal { public final AnimationState croakAnimationState = new AnimationState(); public final AnimationState tongueAnimationState = new AnimationState(); public final AnimationState swimIdleAnimationState = new AnimationState(); + private org.purpurmc.purpur.controller.MoveControllerWASD purpurLandController; // Purpur - Ridables + private org.purpurmc.purpur.controller.WaterMoveControllerWASD purpurWaterController; // Purpur - Ridables - public Frog(EntityType type, Level level) { + public Frog(final EntityType type, final Level level) { super(type, level); -@@ -112,7 +114,55 @@ public class Frog extends Animal { +@@ -89,7 +91,55 @@ public class Frog extends Animal { this.setPathfindingMalus(PathType.WATER, 4.0F); this.setPathfindingMalus(PathType.TRAPDOOR, -1.0F); this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); @@ -1729,35 +1731,35 @@ index 09d817aa34d4a6d8a49d614087f9942d75e673e8..5b4bb6fd100abc569c5da167735a2200 + // Purpur end - Ridables @Override - protected Brain.Provider brainProvider() { -@@ -204,6 +254,7 @@ public class Frog extends Animal { - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("frogBrain"); + protected Brain makeBrain(final Brain.Packed packedBrain) { +@@ -176,6 +226,7 @@ public class Frog extends Animal { + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("frogBrain"); + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.pop(); - profilerFiller.push("frogActivityUpdate"); -@@ -373,7 +424,7 @@ public class Frog extends Animal { + profiler.pop(); + profiler.push("frogActivityUpdate"); +@@ -345,7 +396,7 @@ public class Frog extends Animal { return level.getBlockState(pos.below()).is(BlockTags.FROGS_SPAWNABLE_ON) && isBrightEnoughToSpawn(level, pos); } -- class FrogLookControl extends LookControl { -+ class FrogLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables +- private class FrogLookControl extends LookControl { ++ private class FrogLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables FrogLookControl(final Mob mob) { + Objects.requireNonNull(Frog.this); super(mob); - } diff --git a/net/minecraft/world/entity/animal/frog/Tadpole.java b/net/minecraft/world/entity/animal/frog/Tadpole.java -index f65cfb908aac16e6df4d209c6b5c3ee5065289d3..9b5205d7f481d4cd8fe454ae588dc2a89bc613bf 100644 +index 065be3566f694ff9eb5d3317a995f91249d61df3..e221dd9a18ac8b6c78f9c0d72d2ebe2107aa3081 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 { - MemoryModuleType.IS_PANICKING +@@ -54,13 +54,50 @@ public class Tadpole extends AbstractFish { + List.of(SensorType.NEAREST_LIVING_ENTITIES, SensorType.NEAREST_PLAYERS, SensorType.HURT_BY, SensorType.FROG_TEMPTATIONS), + var0 -> TadpoleAi.getActivities() ); - public boolean ageLocked; // Paper + private org.purpurmc.purpur.controller.WaterMoveControllerWASD purpurController; // Purpur - Ridables - public Tadpole(EntityType type, Level level) { + public Tadpole(final EntityType type, final Level level) { super(type, level); - this.moveControl = new SmoothSwimmingMoveControl(this, 85, 10, 0.02F, 0.1F, true); + // Purpur start - Ridables @@ -1801,21 +1803,21 @@ index f65cfb908aac16e6df4d209c6b5c3ee5065289d3..9b5205d7f481d4cd8fe454ae588dc2a8 + // Purpur end - Ridables + @Override - protected PathNavigation createNavigation(Level level) { + protected PathNavigation createNavigation(final Level level) { return new WaterBoundPathNavigation(this, level); -@@ -101,6 +138,7 @@ public class Tadpole extends AbstractFish { - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("tadpoleBrain"); +@@ -85,6 +122,7 @@ public class Tadpole extends AbstractFish { + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("tadpoleBrain"); + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.pop(); - profilerFiller.push("tadpoleActivityUpdate"); + profiler.pop(); + profiler.push("tadpoleActivityUpdate"); diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 566390c9258c1132c9ffa2df8ecc3e713963787f..6e4d611c959960e8d13f79704c176b41ea5c12c4 100644 +index f7b683d5ca7b08421b642dae698f9e9fdbe57051..82c27c0e6e9f72eceb5a498af4aad6a7bd766513 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 { +@@ -100,6 +100,23 @@ public class Goat extends Animal { .orElseGet(() -> new ItemStack(Items.GOAT_HORN)); } @@ -1837,21 +1839,21 @@ index 566390c9258c1132c9ffa2df8ecc3e713963787f..6e4d611c959960e8d13f79704c176b41 + // Purpur end - Ridables + @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -191,6 +208,7 @@ public class Goat extends Animal { - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("goatBrain"); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); +@@ -170,6 +187,7 @@ public class Goat extends Animal { + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("goatBrain"); + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.pop(); - profilerFiller.push("goatActivityUpdate"); + profiler.pop(); + profiler.push("goatActivityUpdate"); diff --git a/net/minecraft/world/entity/animal/golem/CopperGolem.java b/net/minecraft/world/entity/animal/golem/CopperGolem.java -index 28cd2deeb5c92f599f7f1b19a2794b98994409c3..27b9abe5a2d352bdba5822e840abdccdb995b0f7 100644 +index 4f412c6c661d5972c61ff77fb02e55baa8020c93..dd9d71eebbd9b013ae69db7b9869be8dd30ae0ba 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 +@@ -112,6 +112,28 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab } // Purpur end - Summoner API @@ -1880,34 +1882,34 @@ index 28cd2deeb5c92f599f7f1b19a2794b98994409c3..27b9abe5a2d352bdba5822e840abdccd 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"); +@@ -197,6 +219,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.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); + profiler.pop(); + profiler.push("copperGolemActivityUpdate"); +@@ -236,7 +259,7 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab + java.util.List drops = this.generateDefaultDrops(serverLevel, itemStack); + org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemStack, 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 + this.shear(serverLevel, SoundSource.PLAYERS, itemStack, drops); +@@ -272,6 +295,8 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab } } -+ if (level().purpurConfig.villagerRidable && itemInHand.isEmpty()) return tryRide(player, hand); // Purpur - Ridables ++ if (level().purpurConfig.villagerRidable && itemStack.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 +index f0db017fc24b2b2e078f4bfcf9e06515b4c2ef2f..b9672e22eb3655168db2f85d4a273b3604f04618 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 { @@ -1948,25 +1950,25 @@ index 32425f0aaa748c7f80f2e5cf95ef27238fe50489..363bf7781c8785bc6fdbc65941794a5a 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)) { + protected InteractionResult mobInteract(final Player player, final InteractionHand hand) { + ItemStack itemStack = player.getItemInHand(hand); + if (!itemStack.is(Items.IRON_INGOT)) { - return InteractionResult.PASS; + return tryRide(player, hand); // Purpur - Ridables } else { - float health = this.getHealth(); + float healthBefore = this.getHealth(); this.heal(25.0F); - if (this.getHealth() == health) { + if (this.getHealth() == healthBefore) { - 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); + float pitch = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; + this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, pitch); diff --git a/net/minecraft/world/entity/animal/golem/SnowGolem.java b/net/minecraft/world/entity/animal/golem/SnowGolem.java -index 620af577fa9fa4b16f6651b427d25af93b0e02c6..9b5a531fe67cb17021d5aa1a036ffff36ecb48d5 100644 +index 0993ec37f58cbc6b201ebc9aeb39aee438bd1cf9..6875e40687bbde6aba25da7d3145eccdccea6f52 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 +@@ -62,12 +62,31 @@ public class SnowGolem extends AbstractGolem implements RangedAttackMob, Shearab } // Purpur end - Summoner API @@ -1995,19 +1997,19 @@ index 620af577fa9fa4b16f6651b427d25af93b0e02c6..9b5a531fe67cb17021d5aa1a036ffff3 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)); + this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, Mob.class, 10, true, false, (target, level) -> target instanceof Enemy)); } -@@ -112,6 +131,7 @@ public class SnowGolem extends AbstractGolem implements Shearable, RangedAttackM +@@ -112,6 +131,7 @@ public class SnowGolem extends AbstractGolem implements RangedAttackMob, Shearab return; } + if (getRider() != null && this.isControllable() && !level().purpurConfig.snowGolemLeaveTrailWhenRidden) return; // Purpur - don't leave snow trail when being ridden - BlockState blockState = Blocks.SNOW.defaultBlockState(); + BlockState snow = 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); +@@ -157,7 +177,7 @@ public class SnowGolem extends AbstractGolem implements RangedAttackMob, Shearab + org.bukkit.event.player.PlayerShearEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerShearEntityEvent(player, this, itemStack, hand, drops); if (event != null) { if (event.isCancelled()) { - return InteractionResult.PASS; @@ -2015,7 +2017,7 @@ index 620af577fa9fa4b16f6651b427d25af93b0e02c6..9b5a531fe67cb17021d5aa1a036ffff3 } 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 +@@ -178,7 +198,7 @@ public class SnowGolem extends AbstractGolem implements RangedAttackMob, Shearab return InteractionResult.SUCCESS; // Purpur end - Snowman drop and put back pumpkin } else { @@ -2025,10 +2027,10 @@ index 620af577fa9fa4b16f6651b427d25af93b0e02c6..9b5a531fe67cb17021d5aa1a036ffff3 } diff --git a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java -index 5a4a96895c1d2f7538bf644dd133645bc831b582..0a75d3790a4bf4812e4f3b27ec50d67fdccf812d 100644 +index 0496505710169127733da080ad2663e99f1bf60a..c179923999116c9319bf4cd3d4c66ea2e478805f 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 { +@@ -134,6 +134,13 @@ public class HappyGhast extends Animal { this.removeAllGoals(goal -> true); } @@ -2043,10 +2045,10 @@ index 5a4a96895c1d2f7538bf644dd133645bc831b582..0a75d3790a4bf4812e4f3b27ec50d67f 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 +index ade5f5caeddba935ecd7e50de24e1d25d8405ec6..15db093ca86de470b812206d2bae147968e0d03d 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 { +@@ -111,6 +111,32 @@ public class Panda extends Animal { } } @@ -2077,9 +2079,9 @@ index c5425b36e96e4f41f0ed7d468f53ea3de6b9ef17..93503f6b4eea2cb2ae6c01279e847c30 + // Purpur end - Ridables + @Override - protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { + protected boolean canDispenserEquipIntoSlot(final EquipmentSlot slot) { return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); -@@ -260,6 +286,7 @@ public class Panda extends Animal { +@@ -263,6 +289,7 @@ public class Panda extends Animal { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -2087,7 +2089,7 @@ index c5425b36e96e4f41f0ed7d468f53ea3de6b9ef17..93503f6b4eea2cb2ae6c01279e847c30 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 { +@@ -278,6 +305,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)); @@ -2095,34 +2097,34 @@ index c5425b36e96e4f41f0ed7d468f53ea3de6b9ef17..93503f6b4eea2cb2ae6c01279e847c30 this.targetSelector.addGoal(1, new Panda.PandaHurtByTargetGoal(this).setAlertOthers()); } -@@ -617,7 +645,7 @@ public class Panda extends Animal { - public InteractionResult mobInteract(Player player, InteractionHand hand) { - ItemStack itemInHand = player.getItemInHand(hand); +@@ -616,7 +644,7 @@ public class Panda extends Animal { + public InteractionResult mobInteract(final Player player, final InteractionHand hand) { + ItemStack interactionItemStack = 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 { +@@ -658,7 +686,7 @@ public class Panda extends Animal { return InteractionResult.SUCCESS_SERVER; } else { -- return InteractionResult.PASS; -+ return tryRide(player, hand); // Purpur - Ridables +- return (InteractionResult)(this.isBaby() && player.isHolding(Items.GOLDEN_DANDELION) ? super.mobInteract(player, hand) : InteractionResult.PASS); ++ return tryRide(player, hand, (InteractionResult)(this.isBaby() && player.isHolding(Items.GOLDEN_DANDELION) ? super.mobInteract(player, hand) : InteractionResult.PASS)); // Purpur - Ridables } } -@@ -958,7 +986,7 @@ public class Panda extends Animal { +@@ -965,7 +993,7 @@ public class Panda extends Animal { } } -- static class PandaMoveControl extends MoveControl { -+ static class PandaMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables +- private static class PandaMoveControl extends MoveControl { ++ private 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 { + public PandaMoveControl(final Panda mob) { +@@ -974,9 +1002,9 @@ public class Panda extends Animal { } @Override @@ -2135,12 +2137,12 @@ index c5425b36e96e4f41f0ed7d468f53ea3de6b9ef17..93503f6b4eea2cb2ae6c01279e847c30 } } diff --git a/net/minecraft/world/entity/animal/parrot/Parrot.java b/net/minecraft/world/entity/animal/parrot/Parrot.java -index 0337ddcd664cd0329d98286214d1aa4daf83e1ea..6a4d170cd1e4dde2af30895f9fbac9dd599d0602 100644 +index 24045d497aa11632438d4cbd1088168a7b6866e5..5173a05a15209972905024f9c4fa097e5a95092f 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) { + public Parrot(final EntityType type, final Level level) { super(type, level); - this.moveControl = new FlyingMoveControl(this, 10, false); + // Purpur start - Ridables @@ -2166,8 +2168,8 @@ index 0337ddcd664cd0329d98286214d1aa4daf83e1ea..6a4d170cd1e4dde2af30895f9fbac9dd + } + 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.FIRE_IN_NEIGHBOR, -1.0F); + this.setPathfindingMalus(PathType.FIRE, -1.0F); this.setPathfindingMalus(PathType.COCOA, -1.0F); } @@ -2207,7 +2209,7 @@ index 0337ddcd664cd0329d98286214d1aa4daf83e1ea..6a4d170cd1e4dde2af30895f9fbac9dd + @Override public @Nullable SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, @Nullable SpawnGroupData groupData @@ -162,9 +218,11 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal { @Override @@ -2222,10 +2224,10 @@ index 0337ddcd664cd0329d98286214d1aa4daf83e1ea..6a4d170cd1e4dde2af30895f9fbac9dd 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 943bd459554e9f3374978e595ba369a479d44941..2a3fc6ad3a12a3cc9815b66b659e3c9ce2afa7a8 100644 +index 7cb1b0afd67ab8d1dcddaf685ccb814d1e29961d..57a80fbffd74a4bc0ec9f9e65abd7e2b68ef09a6 100644 --- a/net/minecraft/world/entity/animal/pig/Pig.java +++ b/net/minecraft/world/entity/animal/pig/Pig.java -@@ -63,9 +63,27 @@ public class Pig extends Animal implements ItemSteerable { +@@ -68,9 +68,27 @@ public class Pig extends Animal implements ItemSteerable { super(type, level); } @@ -2252,20 +2254,20 @@ index 943bd459554e9f3374978e595ba369a479d44941..2a3fc6ad3a12a3cc9815b66b659e3c9c + 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)); + this.goalSelector.addGoal(4, new TemptGoal(this, 1.2, i -> i.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 +index 813247e74bddfa600b4d0bcbefd44209dfdae35c..d368954be1fc54052c29dd102e97404a46c87326 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 { +@@ -62,6 +62,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) { + public PolarBear(final EntityType type, final Level level) { super(type, level); -@@ -89,6 +90,34 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -90,6 +91,34 @@ public class PolarBear extends Animal implements NeutralMob { } // Purpur end - Breedable Polar Bears @@ -2298,17 +2300,17 @@ index df4b4a4d32019ef3a667841a0ce4485a8325e897..718531a324c36ac65a93af5c12e0c0a3 + // Purpur end - Ridables + @Override - public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + public @Nullable AgeableMob getBreedOffspring(final ServerLevel level, final AgeableMob partner) { return EntityType.POLAR_BEAR.create(level, EntitySpawnReason.BREEDING); -@@ -103,6 +132,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -104,6 +133,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)); + this.goalSelector.addGoal(1, new PanicGoal(this, 2.0, bear -> bear.isBaby() ? DamageTypeTags.PANIC_CAUSES : DamageTypeTags.PANIC_ENVIRONMENTAL_CAUSES)); // Purpur start - Breedable Polar Bears -@@ -115,6 +145,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -116,6 +146,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)); @@ -2316,7 +2318,7 @@ index df4b4a4d32019ef3a667841a0ce4485a8325e897..718531a324c36ac65a93af5c12e0c0a3 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 { +@@ -233,6 +264,12 @@ public class PolarBear extends Animal implements NeutralMob { if (!this.level().isClientSide()) { this.updatePersistentAnger((ServerLevel)this.level(), true); } @@ -2329,27 +2331,27 @@ index df4b4a4d32019ef3a667841a0ce4485a8325e897..718531a324c36ac65a93af5c12e0c0a3 } @Override -@@ -251,6 +288,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -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 void setStanding(final boolean value) { + this.entityData.set(DATA_STANDING_ID, value); ++ standTimer = value ? 20 : -1; // Purpur - Ridables } - public float getStandingAnimationScale(float partialTick) { + public float getStandingAnimationScale(final float a) { diff --git a/net/minecraft/world/entity/animal/rabbit/Rabbit.java b/net/minecraft/world/entity/animal/rabbit/Rabbit.java -index d5e7599c23405eb5a4519e2dfd93ddbe2853fa3b..16fbee742f28cf4571effb66265daeee64bae9b7 100644 +index ab7e618ab8ef872d794f1ff82de881a5bca04bc5..fa6fd57be6e4a36e701eb61634440a79b47bbd94 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 { +@@ -108,6 +108,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) { + public Rabbit(final EntityType type, final Level level) { super(type, level); -@@ -102,9 +103,55 @@ public class Rabbit extends Animal { +@@ -116,9 +117,55 @@ public class Rabbit extends Animal { // this.setSpeedModifier(0.0); // CraftBukkit } @@ -2405,7 +2407,7 @@ index d5e7599c23405eb5a4519e2dfd93ddbe2853fa3b..16fbee742f28cf4571effb66265daeee 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 { +@@ -138,6 +185,14 @@ public class Rabbit extends Animal { @Override protected float getJumpPower() { @@ -2417,13 +2419,13 @@ index d5e7599c23405eb5a4519e2dfd93ddbe2853fa3b..16fbee742f28cf4571effb66265daeee + return actualJump ? 0.5F : 0.3F; + } + // Purpur end - Ridables - float f = 0.3F; + float baseJumpPower = 0.3F; if (this.moveControl.getSpeedModifier() <= 0.6) { - f = 0.2F; -@@ -186,6 +241,12 @@ public class Rabbit extends Animal { + baseJumpPower = 0.2F; +@@ -205,6 +260,12 @@ public class Rabbit extends Animal { @Override - public void customServerAiStep(ServerLevel level) { + public void customServerAiStep(final ServerLevel level) { + // Purpur start - Ridables + if (getRider() != null && this.isControllable()) { + handleJumping(); @@ -2433,16 +2435,16 @@ index d5e7599c23405eb5a4519e2dfd93ddbe2853fa3b..16fbee742f28cf4571effb66265daeee if (this.jumpDelayTicks > 0) { this.jumpDelayTicks--; } -@@ -511,7 +572,7 @@ public class Rabbit extends Animal { +@@ -559,7 +620,7 @@ public class Rabbit extends Animal { } } -- static class RabbitMoveControl extends MoveControl { -+ static class RabbitMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables +- private static class RabbitMoveControl extends MoveControl { ++ private 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 { +@@ -569,14 +630,14 @@ public class Rabbit extends Animal { } @Override @@ -2460,7 +2462,7 @@ index d5e7599c23405eb5a4519e2dfd93ddbe2853fa3b..16fbee742f28cf4571effb66265daeee @Override diff --git a/net/minecraft/world/entity/animal/sheep/Sheep.java b/net/minecraft/world/entity/animal/sheep/Sheep.java -index 8f4e68b1a910cd56d4c57540c0a09a8724d13738..a33800517d5fb5ab008e22b77be2f079901c1a99 100644 +index 5e719f09de951164076026f5fc9e06ab8d8261d5..f9483c914d3923c38d405093df45f84a7e20ef7e 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 { @@ -2491,12 +2493,12 @@ index 8f4e68b1a910cd56d4c57540c0a09a8724d13738..a33800517d5fb5ab008e22b77be2f079 + 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(2, new BreedGoal(this, 1.0)); - this.goalSelector.addGoal(3, new TemptGoal(this, 1.1, stack -> stack.is(ItemTags.SHEEP_FOOD), false)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.1, i -> i.is(ItemTags.SHEEP_FOOD), false)); diff --git a/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index a4d60a0dddabd7981d2db28af6b1d88d64d6e806..3d5cf62bd9bd99a978b7dc535675178deb695af0 100644 +index c947f26f57de71ac0eafc0f56a96fec12ce5dba5..0f6f2b3818001ee786c941fdffccec80fb966e52 100644 --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -89,6 +89,23 @@ public class Sniffer extends Animal { +@@ -94,6 +94,23 @@ public class Sniffer extends Animal { this.setPathfindingMalus(PathType.DAMAGE_CAUTIOUS, -1.0F); } @@ -2518,18 +2520,18 @@ index a4d60a0dddabd7981d2db28af6b1d88d64d6e806..3d5cf62bd9bd99a978b7dc535675178d + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); @@ -467,6 +484,7 @@ public class Sniffer extends Animal { - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("snifferBrain"); + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("snifferBrain"); + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.popPush("snifferActivityUpdate"); + profiler.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 +index 7db02196ed1dd9057c9418d3d96164bb5082380b..51a0771819abfdde5043eaeca62b0ce45c40039e 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 { @@ -2553,10 +2555,10 @@ index 2b1ece8ff62376a0851c18c39f43882abf2abaca..c5a8080aa0fa1014602ba76fb4d8ad69 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 +index 62ca3c9ecfd7a9863ca21b50061c03ba99a440b4..94aa3f10cc0ff44ec95ba56e4dbf1894cd538f71 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 { +@@ -74,9 +74,32 @@ public class Squid extends AgeableWaterCreature { } // Purpur end - Flying squids! Oh my! @@ -2589,7 +2591,7 @@ index 504573bf4cbdf1debfa9f9bd071fa40d443b860d..69d87bd27a95bb9e92cd24fb7973a9b0 this.goalSelector.addGoal(1, new Squid.SquidFleeGoal()); } -@@ -325,6 +348,37 @@ public class Squid extends AgeableWaterCreature { +@@ -338,6 +361,37 @@ public class Squid extends AgeableWaterCreature { @Override public void tick() { @@ -2628,7 +2630,7 @@ index 504573bf4cbdf1debfa9f9bd071fa40d443b860d..69d87bd27a95bb9e92cd24fb7973a9b0 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 +index d03a219af35e3c577386b87d553cc53c1e922553..53fc1012d46e20b623246cecae87b3feb1a0fda6 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 { @@ -2652,8 +2654,8 @@ index fdbc70322eb653d2cc576090c27d1cb67bfce1f6..7699967db327cf80940bf30d8e0c734b + } + // Purpur end - Ridables + - public void setHomePos(BlockPos homePos) { - this.homePos = homePos; + public void setHomePos(final BlockPos pos) { + this.homePos = pos; } @@ -145,6 +162,7 @@ public class Turtle extends Animal { @@ -2667,14 +2669,14 @@ index fdbc70322eb653d2cc576090c27d1cb67bfce1f6..7699967db327cf80940bf30d8e0c734b } } -- static class TurtleMoveControl extends MoveControl { -+ static class TurtleMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables +- private static class TurtleMoveControl extends MoveControl { ++ private 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; + TurtleMoveControl(final Turtle turtle) { + super(turtle); + this.turtle = turtle; + waterController = new org.purpurmc.purpur.controller.WaterMoveControllerWASD(turtle, 0.25D); // Purpur - Ridables } @@ -2687,21 +2689,21 @@ index fdbc70322eb653d2cc576090c27d1cb67bfce1f6..7699967db327cf80940bf30d8e0c734b + 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(); + double xd = 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)); + float yRotD = (float)(Mth.atan2(zd, xd) * 180.0F / (float)Math.PI) - 90.0F; + this.turtle.setYRot(this.rotlerp(this.turtle.getYRot(), yRotD, 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)); +- float targetSpeed = (float)(this.speedModifier * this.turtle.getAttributeValue(Attributes.MOVEMENT_SPEED)); ++ float targetSpeed = (float)(this.getSpeedModifier() * this.turtle.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables + this.turtle.setSpeed(Mth.lerp(0.125F, this.turtle.getSpeed(), targetSpeed)); + this.turtle.setDeltaMovement(this.turtle.getDeltaMovement().add(0.0, this.turtle.getSpeed() * yd * 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 725624f63a2fbf0bd489a92e2c5862c82d72556c..44b650de646ea605e41f39f3d99d8f550c9a8e19 100644 +index 96707c6f2375754d001eafbf4bd0773df6843b38..97cd55916166ffabdfdc50a493ff1642d952001e 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -186,9 +186,32 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -183,9 +183,32 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Configurable default collar color @@ -2734,7 +2736,7 @@ index 725624f63a2fbf0bd489a92e2c5862c82d72556c..44b650de646ea605e41f39f3d99d8f55 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)); -@@ -201,6 +224,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -198,6 +221,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)); @@ -2743,7 +2745,7 @@ index 725624f63a2fbf0bd489a92e2c5862c82d72556c..44b650de646ea605e41f39f3d99d8f55 this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); this.targetSelector.addGoal(3, new HurtByTargetGoal(this).setAlertOthers()); diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 9c38e3b8c09caa2701a207b91761f344c5e53385..eae6f063a2148ac1ac1689d65d3f80bad79f1ae8 100644 +index 6f12d8dc51e1052abb9ce7d4170efda3fe9e05f9..366ca403757c274fadae2578772d97a903da3174 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -90,6 +90,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -2752,7 +2754,7 @@ index 9c38e3b8c09caa2701a207b91761f344c5e53385..eae6f063a2148ac1ac1689d65d3f80ba // Paper end + private boolean hadRider; // Purpur - Ridables - public EnderDragon(EntityType type, Level level) { + public EnderDragon(final EntityType type, final Level level) { super(EntityType.ENDER_DRAGON, level); @@ -106,6 +107,37 @@ public class EnderDragon extends Mob implements Enemy { this.noPhysics = true; @@ -2791,7 +2793,7 @@ index 9c38e3b8c09caa2701a207b91761f344c5e53385..eae6f063a2148ac1ac1689d65d3f80ba + return level().purpurConfig.useDismountsUnderwaterTag ? super.dismountsUnderwater() : !level().purpurConfig.enderDragonRidableInWater; } - public void setDragonFight(EndDragonFight dragonFight) { + public void setDragonFight(final EnderDragonFight fight) { @@ -120,6 +152,17 @@ public class EnderDragon extends Mob implements Enemy { return this.fightOrigin; } @@ -2848,59 +2850,58 @@ index 9c38e3b8c09caa2701a207b91761f344c5e53385..eae6f063a2148ac1ac1689d65d3f80ba this.processFlappingMovement(); if (this.level().isClientSide()) { this.setHealth(this.getHealth()); -@@ -197,6 +271,8 @@ public class EnderDragon extends Mob implements Enemy { +@@ -197,6 +271,7 @@ public class EnderDragon extends Mob implements Enemy { this.oFlapTime = this.flapTime; if (this.isDeadOrDying()) { + if (hasRider) ejectPassengers(); // Purpur - Ridables -+ - 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; -@@ -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); + float xo = (this.random.nextFloat() - 0.5F) * 8.0F; + float yo = (this.random.nextFloat() - 0.5F) * 4.0F; + float zo = (this.random.nextFloat() - 0.5F) * 8.0F; +@@ -206,9 +281,9 @@ public class EnderDragon extends Mob implements Enemy { + Vec3 movement = this.getDeltaMovement(); + float flapSpeed = 0.2F / ((float)movement.horizontalDistance() * 10.0F + 1.0F); + flapSpeed *= (float)Math.pow(2.0, movement.y); - if (this.phaseManager.getCurrentPhase().isSitting()) { + if (!hasRider && this.phaseManager.getCurrentPhase().isSitting()) { // Purpur - Ridables this.flapTime += 0.1F; - } else if (this.inWall) { + } else if (!hasRider && this.inWall) { // Purpur - Ridables - this.flapTime += f1 * 0.5F; + this.flapTime += flapSpeed * 0.5F; } else { - this.flapTime += f1; -@@ -219,7 +295,7 @@ public class EnderDragon extends Mob implements Enemy { + this.flapTime += flapSpeed; +@@ -219,7 +294,7 @@ public class EnderDragon extends Mob implements Enemy { this.flapTime = 0.5F; } else { this.flightHistory.record(this.getY(), this.getYRot()); -- if (this.level() instanceof ServerLevel serverLevel1) { -+ if (this.level() instanceof ServerLevel serverLevel1 && !hasRider) { // Purpur - Ridables +- if (this.level() instanceof ServerLevel level) { ++ if (this.level() instanceof ServerLevel level && !hasRider) { // Purpur - Ridables DragonPhaseInstance currentPhase = this.phaseManager.getCurrentPhase(); - currentPhase.doServerTick(serverLevel1); + currentPhase.doServerTick(level); if (this.phaseManager.getCurrentPhase() != currentPhase) { -@@ -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); -- if (this.level() instanceof ServerLevel serverLevel2 && this.hurtTime == 0) { -+ if (this.level() instanceof ServerLevel serverLevel2 && this.hurtTime == 0 && !hasRider) { // Purpur - Ridables +@@ -296,7 +371,7 @@ public class EnderDragon extends Mob implements Enemy { + this.tickPart(this.body, ss1 * 0.5F, 0.0, -cc1 * 0.5F); + this.tickPart(this.wing1, cc1 * 4.5F, 2.0, ss1 * 4.5F); + this.tickPart(this.wing2, cc1 * -4.5F, 2.0, ss1 * -4.5F); +- if (this.level() instanceof ServerLevel serverLevelx && this.hurtTime == 0) { ++ if (this.level() instanceof ServerLevel serverLevelx && this.hurtTime == 0 && !hasRider) { // Purpur - Ridables this.knockBack( - serverLevel2, - serverLevel2.getEntities( -@@ -344,9 +420,9 @@ public class EnderDragon extends Mob implements Enemy { + serverLevelx, + serverLevelx.getEntities( +@@ -344,9 +419,9 @@ public class EnderDragon extends Mob implements Enemy { } - if (this.level() instanceof ServerLevel serverLevel3) { -- this.inWall = this.checkWalls(serverLevel3, this.head.getBoundingBox()) -+ this.inWall = !hasRider && this.checkWalls(serverLevel3, this.head.getBoundingBox()) - | this.checkWalls(serverLevel3, this.neck.getBoundingBox()) -- | this.checkWalls(serverLevel3, this.body.getBoundingBox()); -+ | this.checkWalls(serverLevel3, this.body.getBoundingBox()); // Purpur - Ridables + if (this.level() instanceof ServerLevel level) { +- this.inWall = this.checkWalls(level, this.head.getBoundingBox()) ++ this.inWall = !hasRider && this.checkWalls(level, this.head.getBoundingBox()) + | this.checkWalls(level, this.neck.getBoundingBox()) +- | this.checkWalls(level, this.body.getBoundingBox()); ++ | this.checkWalls(level, this.body.getBoundingBox()); // Purpur - Ridables 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 +index a8e3df21c27b9c86f9f03ea436ef4099a0805b71..a677aed54e16f3150ea1eabe22935a3d0d1507c4 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 { @@ -2909,33 +2910,33 @@ index 41200efbaa29ee487c0383b261122e0701413865..871adbd10f49a4d59820c089da149a47 + // Purpur start - Ridables + @Override -+ public net.minecraft.world.InteractionResult interact(net.minecraft.world.entity.player.Player player, net.minecraft.world.InteractionHand hand) { ++ public net.minecraft.world.InteractionResult interact(final net.minecraft.world.entity.player.Player player, final net.minecraft.world.InteractionHand hand, final net.minecraft.world.phys.Vec3 location) { + return parentMob.isAlive() ? parentMob.tryRide(player, hand) : net.minecraft.world.InteractionResult.PASS; + } + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { } diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index be74b2f6e21e9adb1e5c96414854a5c4f07655fc..5164a251c67bd3c1ccb8a49a2f1c1196a8a9764e 100644 +index a762f8d9dbb476d4be56c48c2354d5328bab9743..6f77b7cb072cbccd104f905f148694028bd5124a 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 { +@@ -74,6 +74,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { private final int[] nextHeadUpdate = new int[2]; private final int[] idleHeadUpdates = new int[2]; private int destroyBlocksTick; + private int shootCooldown = 0; // Purpur - Ridables private boolean canPortal = false; // Paper - public final ServerBossEvent bossEvent = (ServerBossEvent)new ServerBossEvent( - this.getDisplayName(), BossEvent.BossBarColor.PURPLE, BossEvent.BossBarOverlay.PROGRESS -@@ -81,10 +82,23 @@ public class WitherBoss extends Monster implements RangedAttackMob { - && entity.attackable(); + public final ServerBossEvent bossEvent = Util.make( + new ServerBossEvent(Mth.createInsecureUUID(this.random), this.getDisplayName(), BossEvent.BossBarColor.PURPLE, BossEvent.BossBarOverlay.PROGRESS), +@@ -83,10 +84,23 @@ public class WitherBoss extends Monster implements RangedAttackMob { + && target.attackable(); private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0).selector(LIVING_ENTITY_SELECTOR); private java.util.@Nullable UUID summoner; // Purpur - Summoner API + private org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD purpurController; // Purpur - Ridables - public WitherBoss(EntityType type, Level level) { + public WitherBoss(final EntityType type, final Level level) { super(type, level); - this.moveControl = new FlyingMoveControl(this, 10, false); + // Purpur start - Ridables @@ -2954,7 +2955,7 @@ index be74b2f6e21e9adb1e5c96414854a5c4f07655fc..5164a251c67bd3c1ccb8a49a2f1c1196 this.setHealth(this.getMaxHealth()); this.xpReward = 50; } -@@ -99,6 +113,105 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -101,6 +115,105 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Summoner API @@ -3058,9 +3059,9 @@ index be74b2f6e21e9adb1e5c96414854a5c4f07655fc..5164a251c67bd3c1ccb8a49a2f1c1196 + // Purpur end - Ridables + @Override - protected PathNavigation createNavigation(Level level) { + protected PathNavigation createNavigation(final Level level) { FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); -@@ -109,11 +222,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -111,11 +224,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { @Override protected void registerGoals() { @@ -3074,10 +3075,10 @@ index be74b2f6e21e9adb1e5c96414854a5c4f07655fc..5164a251c67bd3c1ccb8a49a2f1c1196 this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 0, false, false, LIVING_ENTITY_SELECTOR)); } -@@ -273,6 +388,15 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -275,6 +390,15 @@ public class WitherBoss extends Monster implements RangedAttackMob { @Override - protected void customServerAiStep(ServerLevel level) { + protected void customServerAiStep(final ServerLevel level) { + // Purpur start - Ridables + if (getRider() != null && this.isControllable()) { + Vec3 mot = getDeltaMovement(); @@ -3088,34 +3089,34 @@ index be74b2f6e21e9adb1e5c96414854a5c4f07655fc..5164a251c67bd3c1ccb8a49a2f1c1196 + } + // Purpur end - Ridables if (this.getInvulnerableTicks() > 0) { - int i = this.getInvulnerableTicks() - 1; - this.bossEvent.setProgress(1.0F - i / 220.0F); -@@ -579,11 +703,11 @@ public class WitherBoss extends Monster implements RangedAttackMob { + int newCount = this.getInvulnerableTicks() - 1; + this.bossEvent.setProgress(1.0F - newCount / 220.0F); +@@ -578,11 +702,11 @@ public class WitherBoss extends Monster implements RangedAttackMob { } - public int getAlternativeTarget(int head) { -- return this.entityData.get(DATA_TARGETS.get(head)); -+ return getRider() != null && this.isControllable() ? 0 : this.entityData.get(DATA_TARGETS.get(head)); // Purpur - Ridables + public int getAlternativeTarget(final int headIndex) { +- return this.entityData.get(DATA_TARGETS.get(headIndex)); ++ return getRider() != null && this.isControllable() ? 0 : this.entityData.get(DATA_TARGETS.get(headIndex)); // Purpur - Ridables } - public void setAlternativeTarget(int targetOffset, int newId) { -- this.entityData.set(DATA_TARGETS.get(targetOffset), newId); -+ if (getRider() == null || !this.isControllable()) this.entityData.set(DATA_TARGETS.get(targetOffset), newId); // Purpur - Ridables + public void setAlternativeTarget(final int headIndex, final int entityId) { +- this.entityData.set(DATA_TARGETS.get(headIndex), entityId); ++ if (getRider() == null || !this.isControllable()) this.entityData.set(DATA_TARGETS.get(headIndex), entityId); // Purpur - Ridables } public boolean isPowered() { diff --git a/net/minecraft/world/entity/monster/Blaze.java b/net/minecraft/world/entity/monster/Blaze.java -index f5539b27261755380312b392fee836cbaaff2e56..1febee23188d91e2a27c182b97502e8c7ab696a2 100644 +index d48e066e8c43494aa74158452da369e5617d6a7e..c1acc0a648493ec33ef4fc4a48b52fe0b3dc04b2 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 { - public Blaze(EntityType type, Level level) { - super(type, level); + public Blaze(final EntityType blaze, final Level level) { + super(blaze, level); + this.moveControl = new org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD(this, 0.3F); // Purpur - Ridables this.setPathfindingMalus(PathType.WATER, -1.0F); this.setPathfindingMalus(PathType.LAVA, 8.0F); - this.setPathfindingMalus(PathType.DANGER_FIRE, 0.0F); + this.setPathfindingMalus(PathType.FIRE_IN_NEIGHBOR, 0.0F); @@ -41,19 +42,55 @@ public class Blaze extends Monster { this.xpReward = 10; } @@ -3176,7 +3177,7 @@ index f5539b27261755380312b392fee836cbaaff2e56..1febee23188d91e2a27c182b97502e8c @@ -118,6 +155,13 @@ public class Blaze extends Monster { @Override - protected void customServerAiStep(ServerLevel level) { + protected void customServerAiStep(final ServerLevel level) { + // Purpur start - Ridables + if (getRider() != null && this.isControllable()) { + Vec3 mot = getDeltaMovement(); @@ -3188,7 +3189,7 @@ index f5539b27261755380312b392fee836cbaaff2e56..1febee23188d91e2a27c182b97502e8c if (this.nextHeightOffsetChangeTick <= 0) { this.nextHeightOffsetChangeTick = 100; diff --git a/net/minecraft/world/entity/monster/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index 168003b7159b5e9ea3e3ca19d0b939ed1cfd2311..cfd09a5ff326cf4ecc248901696ce1f623a8e7c0 100644 +index 47f8a3415016831f90ba55c5d7331248f870689c..654e923ce9fb8a725077acc8e9c9b8c7658e23f9 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 { @@ -3201,7 +3202,7 @@ index 168003b7159b5e9ea3e3ca19d0b939ed1cfd2311..cfd09a5ff326cf4ecc248901696ce1f6 + private int powerToggleDelay = 0; + // Purpur end - Ridables - public Creeper(EntityType type, Level level) { + public Creeper(final EntityType type, final Level level) { super(type, level); } @@ -3299,7 +3300,7 @@ index 168003b7159b5e9ea3e3ca19d0b939ed1cfd2311..cfd09a5ff326cf4ecc248901696ce1f6 } } diff --git a/net/minecraft/world/entity/monster/ElderGuardian.java b/net/minecraft/world/entity/monster/ElderGuardian.java -index 3a16eb269b733fcf1db5dbc2dfae13009e2278b5..e5d16ca14a40d520dce43dd3d9b6347aefbd25d7 100644 +index ed994bae12ccf0500fb01ca84d40177b067b9ac2..b86f600b1101fe1fc9f7cac5cc47c3f048e0f885 100644 --- a/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/net/minecraft/world/entity/monster/ElderGuardian.java @@ -31,6 +31,18 @@ public class ElderGuardian extends Guardian { @@ -3322,7 +3323,7 @@ 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 2d903c77017ae356eb309df3c2c43b91c4e52f2f..bd78d8c3e8c1d9b581c751d336322fbfe20dacef 100644 +index f7a99b4a33b10a1791137282183888cf453b1c95..36aa44008e98e3a717cbf93d29f3e8780219dc6e 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java @@ -89,9 +89,27 @@ public class EnderMan extends Monster implements NeutralMob { @@ -3364,22 +3365,22 @@ index 2d903c77017ae356eb309df3c2c43b91c4e52f2f..bd78d8c3e8c1d9b581c751d336322fbf @@ -263,7 +282,7 @@ public class EnderMan extends Monster implements NeutralMob { @Override - protected void customServerAiStep(ServerLevel level) { + protected void customServerAiStep(final ServerLevel level) { - if (level.isBrightOutside() && this.tickCount >= this.targetChangeTime + 600) { + if ((getRider() == null || !this.isControllable()) && level.isBrightOutside() && this.tickCount >= this.targetChangeTime + 600) { // Purpur - Ridables - no random teleporting - float lightLevelDependentMagicValue = this.getLightLevelDependentMagicValue(); - if (lightLevelDependentMagicValue > 0.5F - && level.canSeeSky(this.blockPosition()) -@@ -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)) { + float br = this.getLightLevelDependentMagicValue(); + if (br > 0.5F && level.canSeeSky(this.blockPosition()) && this.random.nextFloat() * 30.0F < (br - 0.4F) * 2.0F && this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.RUNAWAY)) { // Paper - EndermanEscapeEvent + this.setTarget(null); +@@ -373,6 +392,7 @@ public class EnderMan extends Monster implements NeutralMob { + public boolean hurtServer(final ServerLevel level, final DamageSource source, final float damage) { + if (this.isInvulnerableTo(level, source)) { return false; -+ } else if (getRider() != null && this.isControllable()) { return super.hurtServer(level, damageSource, amount); // Purpur - no teleporting on damage - } else if (org.purpurmc.purpur.PurpurConfig.endermanShortHeight && damageSource.is(net.minecraft.world.damagesource.DamageTypes.IN_WALL)) { return false; // Purpur - no suffocation damage if short height - Short enderman height ++ } else if (getRider() != null && this.isControllable()) { return super.hurtServer(level, source, damage); // Purpur - no teleporting on damage + } else if (org.purpurmc.purpur.PurpurConfig.endermanShortHeight && source.is(net.minecraft.world.damagesource.DamageTypes.IN_WALL)) { return false; // Purpur - no suffocation damage if short height - Short enderman height } else { - AbstractThrownPotion abstractThrownPotion1 = damageSource.getDirectEntity() instanceof AbstractThrownPotion abstractThrownPotion + AbstractThrownPotion thrownPotion = source.getDirectEntity() instanceof AbstractThrownPotion potion ? potion : null; diff --git a/net/minecraft/world/entity/monster/Endermite.java b/net/minecraft/world/entity/monster/Endermite.java -index 815649e51cc2748f8672441ce709e08365294787..06687be7b218a2a3140924f5e7216199d85d35be 100644 +index f507c54b8b9f4560a20462f4a76bd5b104e2ba15..c66b18f8f71ecf2c1d91b46eb8c9c0b5cb865c06 100644 --- a/net/minecraft/world/entity/monster/Endermite.java +++ b/net/minecraft/world/entity/monster/Endermite.java @@ -47,14 +47,33 @@ public class Endermite extends Monster { @@ -3417,7 +3418,7 @@ index 815649e51cc2748f8672441ce709e08365294787..06687be7b218a2a3140924f5e7216199 this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); } diff --git a/net/minecraft/world/entity/monster/Ghast.java b/net/minecraft/world/entity/monster/Ghast.java -index b8774eb91d21e9f154cc70c5d3bd26de25be41c4..451627153610f2c8db2403f73545c9af6dfd2e4b 100644 +index c13c7e43076a71fab7e1e22354b9ec3d543fe126..32c21974784cedb9a772c2bc178c5b4ca129e771 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 { @@ -3454,12 +3455,12 @@ index b8774eb91d21e9f154cc70c5d3bd26de25be41c4..451627153610f2c8db2403f73545c9af this.goalSelector.addGoal(7, new Ghast.GhastShootFireballGoal(this)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables this.targetSelector - .addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entity, level) -> Math.abs(entity.getY() - this.getY()) <= 4.0)); + .addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (target, level) -> Math.abs(target.getY() - this.getY()) <= 4.0)); } @@ -102,6 +126,15 @@ public class Ghast extends Mob implements Enemy { @Override - public void travel(Vec3 travelVector) { - this.travelFlying(travelVector, 0.02F); + public void travel(final Vec3 input) { + this.travelFlying(input, 0.02F); + // Purpur start - Ridables + if (getRider() != null && this.isControllable() && !onGround) { + float speed = (float) getAttributeValue(Attributes.FLYING_SPEED); @@ -3491,7 +3492,7 @@ index b8774eb91d21e9f154cc70c5d3bd26de25be41c4..451627153610f2c8db2403f73545c9af this.operation = MoveControl.Operation.WAIT; this.ghast.stopInPlace(); diff --git a/net/minecraft/world/entity/monster/Giant.java b/net/minecraft/world/entity/monster/Giant.java -index 0de6a20a3fed53bd11a0152de6953bfaecc85289..dcbe6bbce0baa4fad7fe180944beeb6ca4026f7d 100644 +index 5f8074c93d2ad3d163bb416b16711d82edd7dacc..1b7a75a2be45928093382fa2f2da079ffc5d190d 100644 --- a/net/minecraft/world/entity/monster/Giant.java +++ b/net/minecraft/world/entity/monster/Giant.java @@ -12,6 +12,29 @@ public class Giant extends Monster { @@ -3525,7 +3526,7 @@ 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 9c91fbfd39af513668bd94578810cef7e283abd9..4cf54e55de1ecc57061ad0c09e7966d6104f1cc2 100644 +index b36340a51bbeba4ae12966d45d04ad1fd18303de..0d2a323f11996fad9c4916e05e1812b1998a1be2 100644 --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java @@ -65,14 +65,35 @@ public class Guardian extends Monster { @@ -3558,40 +3559,40 @@ index 9c91fbfd39af513668bd94578810cef7e283abd9..4cf54e55de1ecc57061ad0c09e7966d6 + @Override protected void registerGoals() { - MoveTowardsRestrictionGoal moveTowardsRestrictionGoal = new MoveTowardsRestrictionGoal(this, 1.0); + MoveTowardsRestrictionGoal goal = new MoveTowardsRestrictionGoal(this, 1.0); this.randomStrollGoal = new RandomStrollGoal(this, 1.0, 80); + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables this.goalSelector.addGoal(4, this.guardianAttackGoal = new Guardian.GuardianAttackGoal(this)); // CraftBukkit - assign field - this.goalSelector.addGoal(5, moveTowardsRestrictionGoal); + this.goalSelector.addGoal(5, goal); this.goalSelector.addGoal(7, this.randomStrollGoal); @@ -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)); + goal.setFlags(EnumSet.of(Goal.Flag.MOVE, Goal.Flag.LOOK)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new Guardian.GuardianAttackSelector(this))); } -@@ -346,7 +368,7 @@ public class Guardian extends Monster { +@@ -342,7 +364,7 @@ public class Guardian extends Monster { @Override - 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 + protected void travelInWater(final Vec3 input, final double baseGravity, final boolean isFalling, final double oldY) { +- this.moveRelative(0.1F, input); ++ this.moveRelative(getRider() != null && this.isControllable() ? getSpeed() : 0.1F, input); // 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 { +@@ -447,7 +469,7 @@ public class Guardian extends Monster { } } -- static class GuardianMoveControl extends MoveControl { -+ static class GuardianMoveControl extends org.purpurmc.purpur.controller.WaterMoveControllerWASD { // Purpur - Ridables +- private static class GuardianMoveControl extends MoveControl { ++ private static class GuardianMoveControl extends org.purpurmc.purpur.controller.WaterMoveControllerWASD { // Purpur - Ridables private final Guardian guardian; - public GuardianMoveControl(Guardian mob) { -@@ -459,8 +481,17 @@ public class Guardian extends Monster { - this.guardian = mob; + public GuardianMoveControl(final Guardian guardian) { +@@ -455,8 +477,17 @@ public class Guardian extends Monster { + this.guardian = guardian; } + // Purpur start - Ridables @@ -3607,19 +3608,19 @@ index 9c91fbfd39af513668bd94578810cef7e283abd9..4cf54e55de1ecc57061ad0c09e7966d6 + @Override + public void vanillaTick() { // Purpur - Ridables 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(); -@@ -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)); + Vec3 delta = new Vec3(this.wantedX - this.guardian.getX(), this.wantedY - this.guardian.getY(), this.wantedZ - this.guardian.getZ()); + double length = delta.length(); +@@ -466,7 +497,7 @@ public class Guardian extends Monster { + float yRotD = (float)(Mth.atan2(delta.z, delta.x) * 180.0F / (float)Math.PI) - 90.0F; + this.guardian.setYRot(this.rotlerp(this.guardian.getYRot(), yRotD, 90.0F)); this.guardian.yBodyRot = this.guardian.getYRot(); -- float f1 = (float)(this.speedModifier * this.guardian.getAttributeValue(Attributes.MOVEMENT_SPEED)); -+ float f1 = (float)(this.getSpeedModifier() * this.guardian.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables - 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; +- float targetSpeed = (float)(this.speedModifier * this.guardian.getAttributeValue(Attributes.MOVEMENT_SPEED)); ++ float targetSpeed = (float)(this.getSpeedModifier() * this.guardian.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables + float newSpeed = Mth.lerp(0.125F, this.guardian.getSpeed(), targetSpeed); + this.guardian.setSpeed(newSpeed); + double push = Math.sin((this.guardian.tickCount + this.guardian.getId()) * 0.5) * 0.05; diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java -index 969736a46c85b2fcaa641c2863e6000b51611df5..a3cd6d4b999fc49893794838c73370c19c6a66b6 100644 +index f6021d3e41bcf7c65c708f9937bafafecea34ce3..600da11f46673177a0ff1f56c93a60d94df40025 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 { @@ -3652,18 +3653,18 @@ index 969736a46c85b2fcaa641c2863e6000b51611df5..a3cd6d4b999fc49893794838c73370c1 return Monster.createMonsterAttributes().add(Attributes.MOVEMENT_SPEED, 0.2F); } @@ -76,6 +98,7 @@ public class MagmaCube extends Slime { - float f = this.getSize() * 0.1F; - this.setDeltaMovement(deltaMovement.x, this.getJumpPower() + f, deltaMovement.z); + float sizeJumpBoostPower = this.getSize() * 0.1F; + this.setDeltaMovement(movement.x, this.getJumpPower() + sizeJumpBoostPower, movement.z); 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 d26b7970490a2a108affee11c3fb74e38509d92b..64e55d48bc81d6237970e86e6e1cc719831902fd 100644 +index c651d3681ab8103550f71a89e80582414a1b76bf..f3b91fa31c4ee7a7dadaebc0adea4c47c66365cf 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -61,6 +61,52 @@ public class Phantom extends Mob implements Enemy { +@@ -62,6 +62,52 @@ public class Phantom extends Mob implements Enemy { this.lookControl = new Phantom.PhantomLookControl(this); } @@ -3716,7 +3717,7 @@ index d26b7970490a2a108affee11c3fb74e38509d92b..64e55d48bc81d6237970e86e6e1cc719 @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; -@@ -73,9 +119,11 @@ public class Phantom extends Mob implements Enemy { +@@ -74,9 +120,11 @@ public class Phantom extends Mob implements Enemy { @Override protected void registerGoals() { @@ -3728,7 +3729,7 @@ index d26b7970490a2a108affee11c3fb74e38509d92b..64e55d48bc81d6237970e86e6e1cc719 this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -91,6 +139,7 @@ public class Phantom extends Mob implements Enemy { +@@ -92,6 +140,7 @@ public class Phantom extends Mob implements Enemy { private void updatePhantomSizeInfo() { this.refreshDimensions(); @@ -3736,10 +3737,10 @@ index d26b7970490a2a108affee11c3fb74e38509d92b..64e55d48bc81d6237970e86e6e1cc719 this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(6 + this.getPhantomSize()); } -@@ -159,6 +208,15 @@ public class Phantom extends Mob implements Enemy { +@@ -160,6 +209,15 @@ public class Phantom extends Mob implements Enemy { @Override - public void travel(Vec3 travelVector) { - this.travelFlying(travelVector, 0.2F); + public void travel(final Vec3 input) { + this.travelFlying(input, 0.2F); + // Purpur start - Ridables + if (this.getRider() != null && this.isControllable() && !this.onGround) { + float speed = (float) this.getAttributeValue(Attributes.FLYING_SPEED); @@ -3752,13 +3753,13 @@ index d26b7970490a2a108affee11c3fb74e38509d92b..64e55d48bc81d6237970e86e6e1cc719 } @Override -@@ -412,25 +470,42 @@ public class Phantom extends Mob implements Enemy { +@@ -419,17 +477,23 @@ public class Phantom extends Mob implements Enemy { } } -- static class PhantomLookControl extends LookControl { -+ static class PhantomLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables - public PhantomLookControl(Mob mob) { +- private static class PhantomLookControl extends LookControl { ++ private static class PhantomLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables + public PhantomLookControl(final Mob mob) { super(mob); } @@ -3774,12 +3775,13 @@ index d26b7970490a2a108affee11c3fb74e38509d92b..64e55d48bc81d6237970e86e6e1cc719 } } -- class PhantomMoveControl extends MoveControl { -+ class PhantomMoveControl extends org.purpurmc.purpur.controller.FlyingMoveControllerWASD { // Purpur - Ridables - private float speed = 0.1F; +- private class PhantomMoveControl extends MoveControl { ++ private class PhantomMoveControl extends org.purpurmc.purpur.controller.FlyingMoveControllerWASD { // Purpur - Ridables + private float speed; public PhantomMoveControl(final Mob mob) { - super(mob); +@@ -438,8 +502,19 @@ public class Phantom extends Mob implements Enemy { + this.speed = 0.1F; } + // Purpur start - Ridables @@ -3800,10 +3802,10 @@ index d26b7970490a2a108affee11c3fb74e38509d92b..64e55d48bc81d6237970e86e6e1cc719 Phantom.this.setYRot(Phantom.this.getYRot() + 180.0F); this.speed = 0.1F; diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index a10c693a8948d1b7c4bd06b957a08a9cea9170ad..f7807aac5a8f9c92ba77ac38c469ef14948197ac 100644 +index ffcf170d94c1747669b50747ac6f4432381b5553..6de264683da8b502a8b73208a53ff79c54c4de44 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -72,15 +72,40 @@ public class Ravager extends Raider { +@@ -70,15 +70,40 @@ public class Ravager extends Raider { this.setPathfindingMalus(PathType.LEAVES, 0.0F); } @@ -3843,8 +3845,8 @@ index a10c693a8948d1b7c4bd06b957a08a9cea9170ad..f7807aac5a8f9c92ba77ac38c469ef14 + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables 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())); -@@ -137,7 +162,7 @@ public class Ravager extends Raider { + this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true, (target, level) -> !target.isBaby())); +@@ -135,7 +160,7 @@ public class Ravager extends Raider { @Override public void aiStep() { super.aiStep(); @@ -3854,10 +3856,10 @@ index a10c693a8948d1b7c4bd06b957a08a9cea9170ad..f7807aac5a8f9c92ba77ac38c469ef14 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 6e8400c4d523da8799d586c5c9019ae78710fbcb..9647741b67e1b4b7bbff0df22fc1bf3fb26afa73 100644 +index 7d4abd0c806d41a631c9ff1b99df9e50fd55d933..eed74304cff4f121e8376236f53bf786e3be5759 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -108,12 +108,31 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -110,12 +110,31 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Shulker change color with dye @@ -3889,17 +3891,17 @@ index 6e8400c4d523da8799d586c5c9019ae78710fbcb..9647741b67e1b4b7bbff0df22fc1bf3f 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)); -@@ -708,7 +727,7 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -712,7 +731,7 @@ public class Shulker extends AbstractGolem implements Enemy { } } -- class ShulkerLookControl extends LookControl { -+ class ShulkerLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables +- private class ShulkerLookControl extends LookControl { ++ private class ShulkerLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables public ShulkerLookControl(final Mob mob) { + Objects.requireNonNull(Shulker.this); super(mob); - } diff --git a/net/minecraft/world/entity/monster/Silverfish.java b/net/minecraft/world/entity/monster/Silverfish.java -index 142f776ea2bfcd434d045a78d5629cd05b006b20..99b1f5009a14dab2641c1f9096d819538545989e 100644 +index ba4ba5dfb1e51e2f45b0b81012ed6be27362c55c..68080332052f1e18d7be7d5c4c27347f3d57ddcc 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java @@ -38,14 +38,33 @@ public class Silverfish extends Monster { @@ -3937,7 +3939,7 @@ index 142f776ea2bfcd434d045a78d5629cd05b006b20..99b1f5009a14dab2641c1f9096d81953 this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); } diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java -index e433eacd865f620a9c336a1976fd017b8053cf6a..0c56f9ae47b9263ac65fd3593911e2c8479fc157 100644 +index 81a3afb804ac9c438de46a7ea145c54e4580e54b..828d7b9985b95f898cc9ee2ae3a30dee55188538 100644 --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java @@ -60,6 +60,7 @@ public class Slime extends Mob implements Enemy { @@ -3946,7 +3948,7 @@ index e433eacd865f620a9c336a1976fd017b8053cf6a..0c56f9ae47b9263ac65fd3593911e2c8 private boolean canWander = true; // Paper - Slime pathfinder events + protected boolean actualJump; // Purpur - Ridables - public Slime(EntityType type, Level level) { + public Slime(final EntityType type, final Level level) { super(type, level); @@ -67,12 +68,48 @@ public class Slime extends Mob implements Enemy { this.moveControl = new Slime.SlimeMoveControl(this); @@ -3995,29 +3997,29 @@ index e433eacd865f620a9c336a1976fd017b8053cf6a..0c56f9ae47b9263ac65fd3593911e2c8 this.goalSelector.addGoal(5, new Slime.SlimeKeepOnJumpingGoal(this)); + this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables this.targetSelector - .addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (entity, level) -> Math.abs(entity.getY() - this.getY()) <= 4.0)); + .addGoal(1, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, (target, level) -> Math.abs(target.getY() - this.getY()) <= 4.0)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); -@@ -359,6 +396,7 @@ public class Slime extends Mob implements Enemy { - Vec3 deltaMovement = this.getDeltaMovement(); - this.setDeltaMovement(deltaMovement.x, this.getJumpPower(), deltaMovement.z); +@@ -356,6 +393,7 @@ public class Slime extends Mob implements Enemy { + Vec3 movement = this.getDeltaMovement(); + this.setDeltaMovement(movement.x, this.getJumpPower(), movement.z); this.needsSync = true; + this.actualJump = false; // Purpur - Ridables } @Override -@@ -522,7 +560,7 @@ public class Slime extends Mob implements Enemy { +@@ -519,7 +557,7 @@ public class Slime extends Mob implements Enemy { } } -- static class SlimeMoveControl extends MoveControl { -+ static class SlimeMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables +- private static class SlimeMoveControl extends MoveControl { ++ private static class SlimeMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables private float yRot; private int jumpDelay; private final Slime slime; -@@ -540,21 +578,33 @@ public class Slime extends Mob implements Enemy { +@@ -537,21 +575,33 @@ public class Slime extends Mob implements Enemy { } - public void setWantedMovement(double speedModifier) { + public void setWantedMovement(final double speedModifier) { - this.speedModifier = speedModifier; + this.setSpeedModifier(speedModifier); // Purpur - Ridables this.operation = MoveControl.Operation.MOVE_TO; @@ -4051,7 +4053,7 @@ index e433eacd865f620a9c336a1976fd017b8053cf6a..0c56f9ae47b9263ac65fd3593911e2c8 if (this.jumpDelay-- <= 0) { this.jumpDelay = this.slime.getJumpDelay(); if (this.isAggressive) { -@@ -571,7 +621,7 @@ public class Slime extends Mob implements Enemy { +@@ -568,7 +618,7 @@ public class Slime extends Mob implements Enemy { this.mob.setSpeed(0.0F); } } else { @@ -4061,11 +4063,11 @@ index e433eacd865f620a9c336a1976fd017b8053cf6a..0c56f9ae47b9263ac65fd3593911e2c8 } } diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index beaffb771e6c8d4b992437997ab27be218425c5a..46121b018c5dd87d888a3724df12a9af0d007772 100644 +index d09c1aabd5d11498a65b53fc080a1a3dea2187a3..76180ed355b0d3cb52bfebc7cbf32b91486d6f5b 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 { - this.setPathfindingMalus(PathType.DAMAGE_FIRE, 0.0F); +@@ -93,6 +93,23 @@ public class Strider extends Animal implements ItemSteerable { + this.setPathfindingMalus(PathType.FIRE, 0.0F); } + // Purpur start - Ridables @@ -4086,30 +4088,30 @@ index beaffb771e6c8d4b992437997ab27be218425c5a..46121b018c5dd87d888a3724df12a9af + // Purpur end - Ridables + public static boolean checkStriderSpawnRules( - EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { -@@ -138,6 +155,7 @@ public class Strider extends Animal implements ItemSteerable { + final EntityType ignoredType, + final LevelAccessor level, +@@ -143,6 +160,7 @@ public class Strider extends Animal implements ItemSteerable { @Override protected void registerGoals() { this.goalSelector.addGoal(1, new PanicGoal(this, 1.65)); + this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables 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.temptGoal = new TemptGoal(this, 1.4, i -> i.is(ItemTags.STRIDER_TEMPT_ITEMS), false); this.goalSelector.addGoal(3, this.temptGoal); -@@ -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) +@@ -424,7 +442,7 @@ public class Strider extends Animal implements ItemSteerable { + ItemStack itemStack = player.getItemInHand(hand); + return (InteractionResult)(this.isEquippableInSlot(itemStack, EquipmentSlot.SADDLE) + ? itemStack.interactLivingEntity(player, this, hand) - : InteractionResult.PASS); + : tryRide(player, hand)); // Purpur - Ridables } else { - if (isFood && !this.isSilent()) { + if (hasFood && !this.isSilent()) { this.level() diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index a6bfb39305732068c50ae99a28114b58b76d2cf7..d567e2b9843606c36a61c83a3a4e2d181f3eefd9 100644 +index d234046881b3cb075f09f4b360a938da32634bc7..aa36980d1a3ac6972559b905a1454df24b081306 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -58,6 +58,50 @@ public class Vex extends Monster implements TraceableEntity { +@@ -59,6 +59,50 @@ public class Vex extends Monster implements TraceableEntity { this.xpReward = 3; } @@ -4160,7 +4162,7 @@ index a6bfb39305732068c50ae99a28114b58b76d2cf7..d567e2b9843606c36a61c83a3a4e2d18 @Override public boolean isFlapping() { return this.tickCount % TICKS_PER_FLAP == 0; -@@ -70,7 +114,7 @@ public class Vex extends Monster implements TraceableEntity { +@@ -71,7 +115,7 @@ public class Vex extends Monster implements TraceableEntity { @Override public void tick() { @@ -4169,7 +4171,7 @@ index a6bfb39305732068c50ae99a28114b58b76d2cf7..d567e2b9843606c36a61c83a3a4e2d18 super.tick(); this.noPhysics = false; this.setNoGravity(true); -@@ -84,17 +128,19 @@ public class Vex extends Monster implements TraceableEntity { +@@ -85,17 +129,19 @@ public class Vex extends Monster implements TraceableEntity { protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -4190,33 +4192,34 @@ index a6bfb39305732068c50ae99a28114b58b76d2cf7..d567e2b9843606c36a61c83a3a4e2d18 } @Override -@@ -293,13 +339,13 @@ public class Vex extends Monster implements TraceableEntity { +@@ -298,14 +344,14 @@ public class Vex extends Monster implements TraceableEntity { } } -- class VexMoveControl extends MoveControl { -+ class VexMoveControl extends org.purpurmc.purpur.controller.FlyingMoveControllerWASD { // Purpur - Ridables - public VexMoveControl(final Vex mob) { - super(mob); +- private class VexMoveControl extends MoveControl { ++ private class VexMoveControl extends org.purpurmc.purpur.controller.FlyingMoveControllerWASD { // Purpur - Ridables + public VexMoveControl(final Vex vex) { + Objects.requireNonNull(Vex.this); + super(vex); } @Override - public void tick() { + public void vanillaTick() { // Purpur - Ridables 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(); -@@ -307,7 +353,7 @@ public class Vex extends Monster implements TraceableEntity { + Vec3 delta = new Vec3(this.wantedX - Vex.this.getX(), this.wantedY - Vex.this.getY(), this.wantedZ - Vex.this.getZ()); + double deltaLength = delta.length(); +@@ -313,7 +359,7 @@ public class Vex extends Monster implements TraceableEntity { this.operation = MoveControl.Operation.WAIT; Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().scale(0.5)); } else { -- Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().add(vec3.scale(this.speedModifier * 0.05 / len))); -+ Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().add(vec3.scale(this.getSpeedModifier() * 0.05 / len))); // Purpur - Ridables +- Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().add(delta.scale(this.speedModifier * 0.05 / deltaLength))); ++ Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().add(delta.scale(this.getSpeedModifier() * 0.05 / deltaLength))); // Purpur - Ridables 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)); + Vec3 movement = Vex.this.getDeltaMovement(); + Vex.this.setYRot(-((float)Mth.atan2(movement.x, movement.z)) * (180.0F / (float)Math.PI)); diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java -index 38991c0c17554c0b58980759eaeb3e9fee774420..bcb136e71db2272dc107304b52be41f83d6772b7 100644 +index 205b55db821ab81883c23c194cdb12cd57061fb9..7551dcf0bd8d0ff6deffb298211788d5ff91d93b 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 { @@ -4257,10 +4260,10 @@ index 38991c0c17554c0b58980759eaeb3e9fee774420..bcb136e71db2272dc107304b52be41f8 this.targetSelector.addGoal(2, this.healRaidersGoal); this.targetSelector.addGoal(3, this.attackPlayersGoal); diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index 201ccf4f20bd9e48ed8c1d59d70f843c74e5287f..c4f009357e416ed4052e058d8bf3b8c3e9dfd4ae 100644 +index 95e5773fe060bdc42847fdf56801eb4fe1494c56..1a5e3a38671602e097e1e7f00d8f80e46b1596a0 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 { +@@ -76,6 +76,23 @@ public class Zoglin extends Monster implements HoglinBase { this.xpReward = 5; } @@ -4282,33 +4285,33 @@ index 201ccf4f20bd9e48ed8c1d59d70f843c74e5287f..c4f009357e416ed4052e058d8bf3b8c3 + // Purpur end - Ridables + @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); -@@ -251,6 +268,7 @@ public class Zoglin extends Monster implements HoglinBase { - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("zoglinBrain"); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); +@@ -227,6 +244,7 @@ public class Zoglin extends Monster implements HoglinBase { + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("zoglinBrain"); + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.pop(); + profiler.pop(); this.updateActivity(); diff --git a/net/minecraft/world/entity/monster/breeze/Breeze.java b/net/minecraft/world/entity/monster/breeze/Breeze.java -index d0019ebf0469f4070d323d03dbe54375b8d2ce73..6f22312d0a5ab38be4a07b93fdb29b7f36f67c71 100644 +index c1e995f5605748a02e2725cb7340ae4f7b1182c2..a1f6bc282a20bf69955082632f560123edf7f791 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 { - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("breezeBrain"); +@@ -233,6 +233,7 @@ public class Breeze extends Monster { + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("breezeBrain"); + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.popPush("breezeActivityUpdate"); + profiler.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 6775e62ae5b133bc44d730924b4821e0c0b8497c..01d3d638e194ec5e812eea0ab96b100f4752ea18 100644 +index 6c46a3d57201c3f83cb5269dc9aef4023d20d8e9..d7a2e2a660d9844e159ca196d155ed76d277040d 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 { +@@ -107,6 +107,29 @@ public class Creaking extends Monster { return this.getHomePos() != null; } @@ -4338,14 +4341,15 @@ index 6775e62ae5b133bc44d730924b4821e0c0b8497c..01d3d638e194ec5e812eea0ab96b100f @Override protected BodyRotationControl createBodyControl() { return new Creaking.CreakingBodyRotationControl(this); -@@ -547,28 +570,28 @@ public class Creaking extends Monster { +@@ -548,30 +571,30 @@ public class Creaking extends Monster { } } -- class CreakingLookControl extends LookControl { -+ class CreakingLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables { - public CreakingLookControl(final Creaking mob) { - super(mob); +- private class CreakingLookControl extends LookControl { ++ private class CreakingLookControl extends org.purpurmc.purpur.controller.LookControllerWASD { // Purpur - Ridables { + public CreakingLookControl(final Creaking creaking) { + Objects.requireNonNull(Creaking.this); + super(creaking); } @Override @@ -4358,10 +4362,11 @@ index 6775e62ae5b133bc44d730924b4821e0c0b8497c..01d3d638e194ec5e812eea0ab96b100f } } -- class CreakingMoveControl extends MoveControl { -+ class CreakingMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables - public CreakingMoveControl(final Creaking mob) { - super(mob); +- private class CreakingMoveControl extends MoveControl { ++ private class CreakingMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables + public CreakingMoveControl(final Creaking creaking) { + Objects.requireNonNull(Creaking.this); + super(creaking); } @Override @@ -4374,10 +4379,10 @@ index 6775e62ae5b133bc44d730924b4821e0c0b8497c..01d3d638e194ec5e812eea0ab96b100f } } diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index d1749ac82cdbd73422e6229e98eb034978f50fc2..c84f009cb0498e9c1898e310f19cff80ec6989ea 100644 +index e3f59999c9592af213b21afb43bcaddb94fd8279..7ba62badc9b832bdedbec5984421abfee242fa16 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -97,6 +97,23 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -73,6 +73,23 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { this.xpReward = 5; } @@ -4399,21 +4404,21 @@ index d1749ac82cdbd73422e6229e98eb034978f50fc2..c84f009cb0498e9c1898e310f19cff80 + // Purpur end - Ridables + @VisibleForTesting - public void setTimeInOverworld(int timeInOverworld) { + public void setTimeInOverworld(final int timeInOverworld) { this.timeInOverworld = timeInOverworld; -@@ -165,6 +182,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("hoglinBrain"); +@@ -136,6 +153,7 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("hoglinBrain"); + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.pop(); + profiler.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 +index f9f8f562c4c59b69ed5ab29f9042bec9125e29ab..ebc966bf72c0150904d3c804a5cb8bc8f9842bc6 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 { +@@ -50,10 +50,28 @@ public class Evoker extends SpellcasterIllager { this.xpReward = 10; } @@ -4442,7 +4447,7 @@ index f291887c07fee2ad8d00bc79822e709777dc3fc3..e40434d24c7a9ffe76c3410601942d0c 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 { +@@ -63,6 +81,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)); @@ -4451,10 +4456,10 @@ index f291887c07fee2ad8d00bc79822e709777dc3fc3..e40434d24c7a9ffe76c3410601942d0c 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 +index bc64ea6051d9d1401ff0192456564b05b53e6d8f..6a9f25c465a2b54969d7ec3b658355f485f36722 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 { +@@ -60,10 +60,28 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } } @@ -4483,7 +4488,7 @@ index 1f80b1732ae809ce9ea26b0e8ddd507d0a96dbef..8a80c202752f56ba174c00531993795a 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 { +@@ -72,6 +90,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)); @@ -4492,7 +4497,7 @@ index 1f80b1732ae809ce9ea26b0e8ddd507d0a96dbef..8a80c202752f56ba174c00531993795a 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 +index 0385a6d602d80cb0f19b8ec4c982641c2f7e9f23..510a1d4e1e44bda60ee05f0799a8930403f3eb7e 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 @@ -4532,7 +4537,7 @@ index e9207ed52cdf28bffcc6e6d9fc550285e1ee6294..0b97c4fe89c8549841cbb79ecb9383a9 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 +index 4404765ba6b971f5525d3fba73a57d17d5f16dec..c3164a33fd8010e1920eead11c482641f17b3a65 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 { @@ -4571,10 +4576,10 @@ index 0cdc52cf3b1bb9c00e6ca8c8e564de60e195d6fc..4162e7ee482829f0c5276a31d44ed4c5 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 fb2ff2b9712f95429bde04d35baddc2da3e3fb52..a42b84611836b970d0d7ddb602bd04d9ec850712 100644 +index 0cbe847539e81784050c25873d11133f24f80f82..f53cf55c490585595381c184e6dced8d9dcc0439 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -141,6 +141,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -108,6 +108,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento this.xpReward = 5; } @@ -4596,21 +4601,21 @@ index fb2ff2b9712f95429bde04d35baddc2da3e3fb52..a42b84611836b970d0d7ddb602bd04d9 + // Purpur end - Ridables + @Override - protected void addAdditionalSaveData(ValueOutput output) { + protected void addAdditionalSaveData(final ValueOutput output) { super.addAdditionalSaveData(output); -@@ -319,6 +336,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("piglinBrain"); +@@ -287,6 +304,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("piglinBrain"); + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.pop(); + profiler.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 d33c4d32c99b0b4553ce89746b443820f586ce73..e33809e9ccc4a65909f1c12ec4b0fdc4050aeee7 100644 +index ca543d886dee48a03175d0c96051d4f956d33a9d..75fea76d60b76a81646aa3ae4defa6cc5385d78c 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 { +@@ -50,6 +50,23 @@ public class PiglinBrute extends AbstractPiglin { this.xpReward = 20; } @@ -4634,19 +4639,19 @@ index d33c4d32c99b0b4553ce89746b443820f586ce73..e33809e9ccc4a65909f1c12ec4b0fdc4 public static AttributeSupplier.Builder createAttributes() { return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) -@@ -116,6 +133,7 @@ public class PiglinBrute extends AbstractPiglin { - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("piglinBruteBrain"); +@@ -96,6 +113,7 @@ public class PiglinBrute extends AbstractPiglin { + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("piglinBruteBrain"); + if (getRider() == null || this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.pop(); + profiler.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 +index f8f300faa99bd5314ae272f404567636b7c73cc4..32da5212c85c829eeedc9d0f7904bbcaa3ce5ed3 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 +@@ -80,12 +80,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo @Override protected void registerGoals() { @@ -4662,7 +4667,7 @@ index 1ba7777164c7fd8516c97e1bd964183df37c029f..1ab860be69bcc1ab5cc07418c2d7e733 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 +index f157729acf531c08543d800c824b462dc4e080f0..87b03adc6b8c18e489b3bcdc04d155719ab59e98 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 { @@ -4687,10 +4692,10 @@ index c54ad2d6a271d70cc9eeb284f13e5d143f81a084..10e66643a918184d858a4e6c9de7a6c2 + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java -index d995572427844540a98d76b2926eb15a018230fa..7f8298892565b073373ad68f9c1399a9c565c29a 100644 +index 96da8225680bdc7c6b2c337a931858e383f329e3..06bae8a804bc7ac47dc21c915f386ca1dd07cd7f 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 { @@ -4715,10 +4720,10 @@ index d995572427844540a98d76b2926eb15a018230fa..7f8298892565b073373ad68f9c1399a9 + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java -index 24ae7263b2661899e7824ab5877f9b1c9f04d80f..23ceecffe8f1b758433e02b61cae421c518cc841 100644 +index dd5db995d603cc9c8a263255a16dedb766244499..1d706fe3bca726a4e606232039beeadedf75b499 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 { @@ -4743,10 +4748,10 @@ index 24ae7263b2661899e7824ab5877f9b1c9f04d80f..23ceecffe8f1b758433e02b61cae421c + // Purpur end - Ridables + public static boolean checkStraySpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + final EntityType type, final ServerLevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final 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 +index 27f0e22f015aad556bff6dac404b6ed2df04e486..fc4ed0855a00a90cb7232ac9e28510b09163a74d 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 { @@ -4774,7 +4779,7 @@ index 79326303fc1adf5a35343847a2401d193368b64f..d49200718e7fab29ce5e55278b758445 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 +index fe82f97689305de64caa52ef648308431f4aebb1..59265f8286a32a1fe7de1986df78b441861e9367 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 { @@ -4799,10 +4804,10 @@ index 6a1714d093fc35e6ca840b769723f7bffaea7ba6..17a9b046ccd8de37aa79501f7556a5a8 + // Purpur end - Ridables + @Override - public boolean doHurtTarget(ServerLevel level, Entity target) { + public boolean doHurtTarget(final ServerLevel level, final 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 +index 90b9d94aec11bc3c83601290dfa2522c4ed63682..66189a304eb7f59da08679a7157ec882aa7396fc 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 { @@ -4830,7 +4835,7 @@ index 64a84f73d48deb254345a5c25f3fe650591e64a1..7a8b9c83490a05629e4996844a575ba4 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(2, new AvoidEntityGoal<>(this, Armadillo.class, 6.0F, 1.0, 1.2, entity -> !((Armadillo)entity).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)); @@ -4841,13 +4846,13 @@ index 64a84f73d48deb254345a5c25f3fe650591e64a1..7a8b9c83490a05629e4996844a575ba4 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 3b931c6105ea14add0d2a60dc19cc3601a092a3b..4f4bf16cfa1390f19a7e8745d86e42e24ffb3bbc 100644 +index 5f36339497ef65aa26fb763b5beb20443382a0b9..8354768aefe6967942059331ea42a9c2a519f893 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 { +@@ -133,8 +133,32 @@ public class Warden extends Monster implements VibrationSystem { this.setPathfindingMalus(PathType.LAVA, 8.0F); - this.setPathfindingMalus(PathType.DAMAGE_FIRE, 0.0F); - this.setPathfindingMalus(PathType.DANGER_FIRE, 0.0F); + this.setPathfindingMalus(PathType.FIRE, 0.0F); + this.setPathfindingMalus(PathType.FIRE_IN_NEIGHBOR, 0.0F); + this.moveControl = new org.purpurmc.purpur.controller.MoveControllerWASD(this, 0.5F); // Purpur - Ridables } @@ -4875,29 +4880,29 @@ index 3b931c6105ea14add0d2a60dc19cc3601a092a3b..4f4bf16cfa1390f19a7e8745d86e42e2 + // Purpur end - Ridables + @Override - public Packet getAddEntityPacket(ServerEntity entity) { - return new ClientboundAddEntityPacket(this, entity, this.hasPose(Pose.EMERGING) ? 1 : 0); -@@ -280,6 +304,7 @@ public class Warden extends Monster implements VibrationSystem { - protected void customServerAiStep(ServerLevel level) { - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("wardenBrain"); + public Packet getAddEntityPacket(final ServerEntity serverEntity) { + return new ClientboundAddEntityPacket(this, serverEntity, this.hasPose(Pose.EMERGING) ? 1 : 0); +@@ -289,6 +313,7 @@ public class Warden extends Monster implements VibrationSystem { + protected void customServerAiStep(final ServerLevel level) { + ProfilerFiller profiler = Profiler.get(); + profiler.push("wardenBrain"); + if (getRider() == null || !this.isControllable()) // Purpur - only use brain if no rider this.getBrain().tick(level, this); - profilerFiller.pop(); + profiler.pop(); super.customServerAiStep(level); -@@ -382,6 +407,7 @@ public class Warden extends Monster implements VibrationSystem { +@@ -391,6 +416,7 @@ public class Warden extends Monster implements VibrationSystem { @Contract("null->false") - public boolean canTargetEntity(@Nullable Entity entity) { + public boolean canTargetEntity(final @Nullable Entity entity) { + if (getRider() != null && isControllable()) return false; // Purpur - Ridables return entity instanceof LivingEntity livingEntity && this.level() == entity.level() && EntitySelector.NO_CREATIVE_OR_SPECTATOR.test(entity) diff --git a/net/minecraft/world/entity/monster/zombie/Drowned.java b/net/minecraft/world/entity/monster/zombie/Drowned.java -index 604d5e6a4962de61fb97988a2f3de2965908bada..03c801d5982eed73fd8f56f63ccab570e83b8a53 100644 +index 4d1ac2c1c0a5dee069c632ce4d92ea0aa4b63b6f..4b033392e1ba25dbcfd7710d3a8bfbc040d42938 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 { +@@ -81,6 +81,23 @@ public class Drowned extends Zombie implements RangedAttackMob { return Zombie.createAttributes().add(Attributes.STEP_HEIGHT, 1.0); } @@ -4919,18 +4924,18 @@ index 604d5e6a4962de61fb97988a2f3de2965908bada..03c801d5982eed73fd8f56f63ccab570 + // Purpur end - Ridables + @Override - protected PathNavigation createNavigation(Level level) { + protected PathNavigation createNavigation(final Level level) { return new AmphibiousPathNavigation(this, level); -@@ -433,7 +450,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -445,7 +462,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 static class DrownedMoveControl extends MoveControl { ++ private static class DrownedMoveControl extends org.purpurmc.purpur.controller.MoveControllerWASD { // Purpur - Ridables private final Drowned drowned; - public DrownedMoveControl(Drowned mob) { -@@ -442,7 +459,7 @@ public class Drowned extends Zombie implements RangedAttackMob { + public DrownedMoveControl(final Drowned drowned) { +@@ -454,7 +471,7 @@ public class Drowned extends Zombie implements RangedAttackMob { } @Override @@ -4939,16 +4944,16 @@ index 604d5e6a4962de61fb97988a2f3de2965908bada..03c801d5982eed73fd8f56f63ccab570 LivingEntity target = this.drowned.getTarget(); if (this.drowned.wantsToSwim() && this.drowned.isInWater()) { if (target != null && target.getY() > this.drowned.getY() || this.drowned.searchingForLand) { -@@ -462,7 +479,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)); +@@ -474,7 +491,7 @@ public class Drowned extends Zombie implements RangedAttackMob { + float yRotD = (float)(Mth.atan2(zd, xd) * 180.0F / (float)Math.PI) - 90.0F; + this.drowned.setYRot(this.rotlerp(this.drowned.getYRot(), yRotD, 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)); -@@ -471,7 +488,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +- float targetSpeed = (float)(this.speedModifier * this.drowned.getAttributeValue(Attributes.MOVEMENT_SPEED)); ++ float targetSpeed = (float)(this.getSpeedModifier() * this.drowned.getAttributeValue(Attributes.MOVEMENT_SPEED)); // Purpur - Ridables + float newSpeed = Mth.lerp(0.125F, this.drowned.getSpeed(), targetSpeed); + this.drowned.setSpeed(newSpeed); + this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(newSpeed * xd * 0.005, newSpeed * yd * 0.1, newSpeed * zd * 0.005)); +@@ -483,7 +500,7 @@ public class Drowned extends Zombie implements RangedAttackMob { this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(0.0, -0.008, 0.0)); } @@ -4958,10 +4963,10 @@ index 604d5e6a4962de61fb97988a2f3de2965908bada..03c801d5982eed73fd8f56f63ccab570 } } diff --git a/net/minecraft/world/entity/monster/zombie/Husk.java b/net/minecraft/world/entity/monster/zombie/Husk.java -index 93fd34d12c1b9702ff7480f434648d70638bf1a9..ee66242db5ada8e5f8ab7ddc452c2fa818ebef89 100644 +index 4e5f6cf6c8ffc965fd3e6b3069998d2b39e4e779..dfb43d27865674f4f13050682eda38afe2731f00 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 { +@@ -37,6 +37,23 @@ public class Husk extends Zombie { super(type, level); } @@ -4986,10 +4991,10 @@ index 93fd34d12c1b9702ff7480f434648d70638bf1a9..ee66242db5ada8e5f8ab7ddc452c2fa8 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 34891f05809550256c07683c2d0c28d55c342758..15f2e24e8b8ef367a134d88e7c47a3377beceaea 100644 +index 84aeb8f0a7418843f28a13f433532bda1ea40ce1..004c70e25fbcf269cf5d8b7b5961341fd3f4e374 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 { +@@ -113,11 +113,30 @@ public class Zombie extends Monster { this(EntityType.ZOMBIE, level); } @@ -5021,7 +5026,7 @@ index 34891f05809550256c07683c2d0c28d55c342758..15f2e24e8b8ef367a134d88e7c47a337 } diff --git a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java -index c6f271a921fde124df1a7c5d175cb83b420cd2e3..00c8d2cbc5acca9062d8a7029e84fdb575a9130b 100644 +index 591df33e1f0c8d49633180c2a10555072e4304e3..b3735610f347cb6275314dc7cd3dab56e26db85a 100644 --- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java @@ -85,6 +85,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -5046,13 +5051,13 @@ index c6f271a921fde124df1a7c5d175cb83b420cd2e3..00c8d2cbc5acca9062d8a7029e84fdb5 + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java -index ef6a4aff03c1a85535b15e653714751e79f61090..e2c5301a465e28cea057f9afec7e9d78090e1c9e 100644 +index 2d294595b2d9e4daaf221482514329126d59f077..eb3ec4314603f61a041740d5b5e52165dac6ebc6 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 { +@@ -68,6 +68,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { this.setPathfindingMalus(PathType.LAVA, 8.0F); } @@ -5077,10 +5082,10 @@ index ef6a4aff03c1a85535b15e653714751e79f61090..e2c5301a465e28cea057f9afec7e9d78 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 e117ae1b114c7e2ca314a00335473efc41137f7f..6d4ef7b5d64639eb7fe400b2ed612c3b3552aa52 100644 +index 6f7499343ee271486b1a7bc697df94871ee92204..a711cfcce0130dbc8e758568215e7a411774c5e4 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 +@@ -252,6 +252,28 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } // Purpur end - Lobotomize stuck villagers @@ -5108,8 +5113,8 @@ index e117ae1b114c7e2ca314a00335473efc41137f7f..6d4ef7b5d64639eb7fe400b2ed612c3b + @Override public Brain getBrain() { - return (Brain)super.getBrain(); -@@ -357,7 +379,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + return (Brain) super.getBrain(); +@@ -332,7 +354,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } else { this.isLobotomized = false; } @@ -5118,7 +5123,7 @@ index e117ae1b114c7e2ca314a00335473efc41137f7f..6d4ef7b5d64639eb7fe400b2ed612c3b this.getBrain().tick(level, this); // Paper - EAR 2 } else if (this.isLobotomized && shouldRestock(level)) restock(); -@@ -417,7 +439,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -392,7 +414,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re return super.mobInteract(player, hand); } else if (this.isBaby()) { this.setUnhappy(); @@ -5126,22 +5131,22 @@ index e117ae1b114c7e2ca314a00335473efc41137f7f..6d4ef7b5d64639eb7fe400b2ed612c3b + return tryRide(player, hand, InteractionResult.SUCCESS); // Purpur - Ridables } else { if (!this.level().isClientSide()) { - boolean isEmpty = this.getOffers().isEmpty(); -@@ -430,9 +452,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + boolean noOffers = this.getOffers().isEmpty(); +@@ -405,9 +427,11 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } - if (isEmpty) { + if (noOffers) { - return InteractionResult.CONSUME; + return tryRide(player, hand, InteractionResult.CONSUME); // Purpur - Ridables } -+ if (level().purpurConfig.villagerRidable && itemInHand.isEmpty()) return tryRide(player, hand); // Purpur - Ridables ++ if (level().purpurConfig.villagerRidable && itemStack.isEmpty()) return tryRide(player, hand); // Purpur - Ridables + if (this.level().purpurConfig.villagerAllowTrading) // Purpur - Add config for villager trading this.startTrading(player); } diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java -index aceeb9919473f5ff1b84efe950d10aa4dbc10121..5c7da654ef967356173a9d85a8675a7dc61ef395 100644 +index a37fa3473db1f48212eecea683aea53284d50f15..2d0203b256080c3779331ff686714ae491d7b3ec 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 @@ -5168,22 +5173,22 @@ index aceeb9919473f5ff1b84efe950d10aa4dbc10121..5c7da654ef967356173a9d85a8675a7d @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); -@@ -128,8 +145,9 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +@@ -125,8 +142,9 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over if (!this.level().isClientSide()) { if (this.getOffers().isEmpty()) { - return InteractionResult.CONSUME; + return tryRide(player, hand, InteractionResult.CONSUME); // Purpur - Ridables } -+ if (level().purpurConfig.wanderingTraderRidable && itemInHand.isEmpty()) return tryRide(player, hand); // Purpur - Ridables ++ if (level().purpurConfig.wanderingTraderRidable && itemStack.isEmpty()) return tryRide(player, hand); // Purpur - Ridables 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 616c1aafcda05ae1d2a833f2f725b9eefb52cbc6..98078f38f4b24484f615fb02fe11618ad3b4a133 100644 +index 4c0dcce0fc3f410a57b6a280c5199333d8cf9a33..d4b7f1a861e67a00f7d8022b8198e04c1d279393 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -199,6 +199,19 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -194,6 +194,19 @@ public abstract class Player extends Avatar implements ContainerUser { } // CraftBukkit end @@ -5200,11 +5205,11 @@ index 616c1aafcda05ae1d2a833f2f725b9eefb52cbc6..98078f38f4b24484f615fb02fe11618a + } + // Purpur end - Ridables + - public Player(Level level, GameProfile gameProfile) { + public Player(final Level level, final GameProfile gameProfile) { 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 b8e3616de5f07e49a8bbab314329157e4268fb1e..56d78249c3fd7da0ff963712fe3a5c722b907c09 100644 +index 53b40993a59f3add0887088dc4200ad20417c85b..be021954f5af9dbf4cc18ae77aa59be2d0ff6bb6 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 { @@ -5221,7 +5226,7 @@ index b8e3616de5f07e49a8bbab314329157e4268fb1e..56d78249c3fd7da0ff963712fe3a5c72 protected double getDefaultGravity() { return 0.06; diff --git a/net/minecraft/world/entity/projectile/hurtingprojectile/WitherSkull.java b/net/minecraft/world/entity/projectile/hurtingprojectile/WitherSkull.java -index 1020e835f24bc25e032335f739d526bc0bd4ecc4..fced6e9df3239ffff9f297706c764cb9675c0ebb 100644 +index 92ef3b07a79b9a274675f9db54444a8083b15cf5..d713721f92717df7d184d790ff14e6b87ba832de 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 { @@ -5237,5 +5242,5 @@ index 1020e835f24bc25e032335f739d526bc0bd4ecc4..fced6e9df3239ffff9f297706c764cb9 + // Purpur end - Ridables + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - builder.define(DATA_DANGEROUS, false); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + entityData.define(DATA_DANGEROUS, false); 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 83% 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 89dd398bb..44493d3c4 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 @@ -5,28 +5,28 @@ Subject: [PATCH] Configurable entity base attributes diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 23b51bcf8397a4fc9fdedbd4fcee379322477d39..82e11df2c44a19f9643e98d0be9b7000caadda48 100644 +index e19911cbf8abf29f8182755d96f10507bc3d757b..7119a83b5b9811ab3ef2622f91c966741818e48f 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -295,6 +295,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin - protected LivingEntity(EntityType type, Level level) { +@@ -296,6 +296,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + protected LivingEntity(final EntityType type, final Level level) { super(type, level); this.attributes = new AttributeMap(DefaultAttributes.getSupplier(type), this); // Purpur - Ridables + this.initAttributes(); // Purpur - Configurable entity base attributes this.craftAttributes = new org.bukkit.craftbukkit.attribute.CraftAttributeMap(this.attributes); // CraftBukkit // CraftBukkit - this.setHealth(this.getMaxHealth()) inlined and simplified to skip the instanceof check for Player, as getBukkitEntity() is not initialized in constructor this.entityData.set(LivingEntity.DATA_HEALTH_ID, this.getMaxHealth()); -@@ -316,6 +317,8 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -317,6 +318,8 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin return new EntityEquipment(); } + protected void initAttributes() {}// Purpur - Configurable entity base attributes + - public Brain getBrain() { - return this.brain; + public Brain getBrain() { + return (Brain)this.brain; } diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index 2cfcf1f7473d8612777ca0752f6d1521c231ef42..a09b5035e91d50e12f613a7a1211c6869fbbf4df 100644 +index 7f036c3548aea7a23f5a085ce6d9ce987fbc5116..f40892bbe424408e3d11c887d5bd0fef179aaced 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java @@ -94,6 +94,21 @@ public class Bat extends AmbientCreature { @@ -52,10 +52,10 @@ index 2cfcf1f7473d8612777ca0752f6d1521c231ef42..a09b5035e91d50e12f613a7a1211c686 public boolean isFlapping() { return !this.isResting() && this.tickCount % 10.0F == 0.0F; diff --git a/net/minecraft/world/entity/animal/allay/Allay.java b/net/minecraft/world/entity/animal/allay/Allay.java -index 6ab6305f0b25f7c860673c70d9ce911688ecf1e6..ea7666cc10aee49e13dbdd6e3367fabaa0dcbc17 100644 +index cf1bfb79588236fc648aefcc64bb759862084f58..3a78175273efa24a6bf98ee44fe24a4df71e63ed 100644 --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java -@@ -167,6 +167,14 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS +@@ -154,6 +154,14 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS } // Purpur end - Ridables @@ -68,13 +68,13 @@ index 6ab6305f0b25f7c860673c70d9ce911688ecf1e6..ea7666cc10aee49e13dbdd6e3367faba + // Purpur end - Configurable entity base attributes + @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index 767a730baa8a7694ed7d5f05b70118da1f4288cc..1f6b28531127ea2e5b291583f6bb6a236868fbf0 100644 +index 1df0f3e17dadd836dbac39feec56c3b198117340..7c2c71a57b9278aea428e314462cebc08e168b50 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -99,6 +99,14 @@ public class Armadillo extends Animal { +@@ -107,6 +107,14 @@ public class Armadillo extends Animal { } // Purpur end - Ridables @@ -87,13 +87,13 @@ index 767a730baa8a7694ed7d5f05b70118da1f4288cc..1f6b28531127ea2e5b291583f6bb6a23 + // Purpur end - Configurable entity base attributes + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 3837397563bf3d568c120ae4e4e38d1a6dc7a8b2..3f9e15685ba52a5b9bd4282ba6de6751296975bf 100644 +index 8704620cd9348d3c417cbc9591e03c70bf4d4f45..c10b06f8adcd59869d043e48cfe3fdb60051c3db 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 { +@@ -135,6 +135,14 @@ public class Axolotl extends Animal implements Bucketable { } // Purpur end - Ridables @@ -106,13 +106,13 @@ index 3837397563bf3d568c120ae4e4e38d1a6dc7a8b2..3f9e15685ba52a5b9bd4282ba6de6751 + // Purpur end - Configurable entity base attributes + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final 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 bd3dc923058b884afcfad08062230182810c65a2..7d7ab4c5092ac085e8cd6d3a432feb683db5a282 100644 +index 711374cbc982b29800830c856975963a47b63f21..f31b67e2bd4b0279f52bd7c2ee0e63c49fbcec17 100644 --- a/net/minecraft/world/entity/animal/bee/Bee.java +++ b/net/minecraft/world/entity/animal/bee/Bee.java -@@ -477,6 +477,14 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -480,6 +480,14 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { return beehiveBlockEntity != null && beehiveBlockEntity.isFireNearby(); } @@ -128,10 +128,10 @@ index bd3dc923058b884afcfad08062230182810c65a2..7d7ab4c5092ac085e8cd6d3a432feb68 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 a6a66084323435697b3185d7b86acaf5c7453719..95e86330e1e973c43e50bd4ac310212b8a057430 100644 +index 97279af0178ed202810b37d5b40fe75b223238b8..aeb8c71596a2393ac1fc67768052ce319fc25d6d 100644 --- a/net/minecraft/world/entity/animal/camel/Camel.java +++ b/net/minecraft/world/entity/animal/camel/Camel.java -@@ -343,6 +343,23 @@ public class Camel extends AbstractHorse { +@@ -349,6 +349,23 @@ public class Camel extends AbstractHorse { return this.dashCooldown; } @@ -156,10 +156,10 @@ index a6a66084323435697b3185d7b86acaf5c7453719..95e86330e1e973c43e50bd4ac310212b public SoundEvent getAmbientSound() { return SoundEvents.CAMEL_AMBIENT; diff --git a/net/minecraft/world/entity/animal/chicken/Chicken.java b/net/minecraft/world/entity/animal/chicken/Chicken.java -index 4961bb85b91f68075cf0d22440d6377d9fcb7721..bfc5c6639ef1005d2752d5164f3613ddacc46bf1 100644 +index b0b7398e36a30e5a932ce4a9d531d0c258e64604..3e1e904d9401bef41271fe8d29a22b6cd944e766 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 { +@@ -93,6 +93,14 @@ public class Chicken extends Animal { } // Purpur end - Ridables @@ -175,10 +175,10 @@ index 4961bb85b91f68075cf0d22440d6377d9fcb7721..bfc5c6639ef1005d2752d5164f3613dd 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 +index e200b9a459c3f410d2e9affbad8ba8e37e1a1ca5..33c0b8f2c43065ea89b3f9c6a519dde27620ed07 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 { +@@ -51,6 +51,14 @@ public class Cow extends AbstractCow { } // Purpur end - Ridables @@ -191,10 +191,10 @@ index 0268063bb0db8c30c594a7d75d0d11f7236c3a68..5e5b239ebc774ae66f8c35a725ea9179 + // Purpur end - Configurable entity base attributes + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/cow/MushroomCow.java b/net/minecraft/world/entity/animal/cow/MushroomCow.java -index 1a9f5f17e46af831bc6621c83c57e5436397dbc2..85ad44eb3e64232cf1ea326257078c46288a613a 100644 +index 2131ba3eb10e869ff6dad67fb6b8097a8d6f1ab6..d6ec397a14753526dd34ab3a7e69ae4be36c04a6 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 { @@ -209,13 +209,13 @@ index 1a9f5f17e46af831bc6621c83c57e5436397dbc2..85ad44eb3e64232cf1ea326257078c46 + // Purpur end - Configurable entity base attributes + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final 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 90ad3a0115c3cee36a310505d945afd13ae2c817..a5305e057d7f557bedca71962ebf19b0d7344abf 100644 +index 4557453a90f8ee822853cdd236f3c5cd670ba65f..857bafb865b78d83716d2d5f491c0928ae6951ca 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 { +@@ -154,6 +154,14 @@ public class Dolphin extends AgeableWaterCreature { } // Purpur end - Ridables @@ -229,12 +229,12 @@ index 90ad3a0115c3cee36a310505d945afd13ae2c817..a5305e057d7f557bedca71962ebf19b0 + @Override public @Nullable SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, final @Nullable SpawnGroupData groupData diff --git a/net/minecraft/world/entity/animal/equine/AbstractHorse.java b/net/minecraft/world/entity/animal/equine/AbstractHorse.java -index a1dce0a5ce1fcd0a2ff7104b3592ffd5c948db34..5bd1e0f20a9553ae20db1d72d0b2a88bd92db723 100644 +index 91a3db41e0ccf2a416fffcd0855f1048e88849b6..f588fbcf5be44d7897c42a7521c1b4bcae7b38dc 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 +@@ -141,6 +141,46 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump } // Purpur end - Ridables @@ -281,17 +281,17 @@ index a1dce0a5ce1fcd0a2ff7104b3592ffd5c948db34..5bd1e0f20a9553ae20db1d72d0b2a88b @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur - Ridables -@@ -1050,7 +1090,7 @@ public abstract class AbstractHorse extends Animal implements HasCustomInventory - spawnGroupData = new AgeableMob.AgeableMobGroupData(0.2F); +@@ -1057,7 +1097,7 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump + groupData = new AgeableMob.AgeableMobGroupData(0.2F); } - this.randomizeAttributes(level.getRandom()); + //this.randomizeAttributes(level.getRandom()); // Purpur - replaced by initAttributes() - return super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData); + return super.finalizeSpawn(level, difficulty, spawnReason, groupData); } diff --git a/net/minecraft/world/entity/animal/equine/Donkey.java b/net/minecraft/world/entity/animal/equine/Donkey.java -index 8aec9f254c82993632e68368d37b8c9bee7869cc..b85d967c7c809683e4576be30ed855941c6e68cc 100644 +index 980160d37a51b862df3bda18a1bdb92e83badf3c..1a130fc107315b40b4e34a97beb53f7fe0ced14f 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 { @@ -319,10 +319,10 @@ index 8aec9f254c82993632e68368d37b8c9bee7869cc..b85d967c7c809683e4576be30ed85594 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 cc50151ce6e6daffc1ecd41eb89a0d2f159f651e..9a97cd588fb2dc0f393b2c8768f4e45066a34850 100644 +index d2dc51d7a8d97db64bf87f8337b10442acc5bc47..8ba8430f41ce74736f405bfac2ef5de6fffe7d49 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 { +@@ -55,6 +55,23 @@ public class Horse extends AbstractHorse { } // Purpur end - Ridables @@ -344,13 +344,13 @@ index cc50151ce6e6daffc1ecd41eb89a0d2f159f651e..9a97cd588fb2dc0f393b2c8768f4e450 + // Purpur end - Configurable entity base attributes + @Override - protected void randomizeAttributes(RandomSource random) { + protected void randomizeAttributes(final 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 bba6493eee2f605faac0d49d665117d2f2c41213..b54a535add643390a6164ab3f4a2fdd475d60162 100644 +index cab5f2ebfdfb58ab322d81702af13a47c2276903..12abeae3623b49819ab6f852c88ee86ed8c69948 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 { +@@ -134,6 +134,23 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { } // Purpur end - Ridables @@ -375,7 +375,7 @@ index bba6493eee2f605faac0d49d665117d2f2c41213..b54a535add643390a6164ab3f4a2fdd4 return false; } diff --git a/net/minecraft/world/entity/animal/equine/Mule.java b/net/minecraft/world/entity/animal/equine/Mule.java -index 60c151af9e51ba1dd1063344a3f5c021b6a48440..f49c8a61ac3883f7ff8ad8193ae9ea9136f54c45 100644 +index ce4c2424cd6922c03cf44cc731526775eba25220..a866b93312391142b030605e2108fe522d3d8ddd 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 { @@ -403,7 +403,7 @@ index 60c151af9e51ba1dd1063344a3f5c021b6a48440..f49c8a61ac3883f7ff8ad8193ae9ea91 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 3d98259439c3bdb97ab2c66734daf90a56b290ef..d8b7b787b98b86d16578abe1cd19321ad2c176c0 100644 +index e4ee09f1b51f80d35bd3f80f07d06093acc3bfcf..fcc9b9f884aed489ab6016d1de3dfd861781d8e5 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 { @@ -431,7 +431,7 @@ index 3d98259439c3bdb97ab2c66734daf90a56b290ef..d8b7b787b98b86d16578abe1cd19321a 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 68b72c18a3880dead3b32b646a2f6a09d4b98c44..deb0a1eb867daec57a644ce698fe50d79fd8960e 100644 +index 19497883e03603bc0a0f63c3b3734e32f9ed2e1d..bfae12b0a2b094dcd5953058f4d6245077a04fd7 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 { @@ -459,10 +459,10 @@ index 68b72c18a3880dead3b32b646a2f6a09d4b98c44..deb0a1eb867daec57a644ce698fe50d7 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 c1a13047c673cafc5de873215dd368eae6ac8b5e..8b8580f8c082a40f958ec61adf32dc7d1485ea68 100644 +index 13857de6c4be09b7d0798d2a0fd420c705ac1d5d..ae429aec9be39d9af7da4671db15a4506da135d9 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 { +@@ -61,6 +61,23 @@ public class ZombieHorse extends AbstractHorse { } // Purpur end - Ridables @@ -487,7 +487,7 @@ index c1a13047c673cafc5de873215dd368eae6ac8b5e..8b8580f8c082a40f958ec61adf32dc7d 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 +index 4ef7feff4c157aceb1e296b70d492cc098518646..4ae9c5e823fefbf5bc7efdfbab27ccd166a70b8b 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 { @@ -504,9 +504,9 @@ index 2fe8b8382b7cb4056f4d430cf632ecf413e8e25b..b7c17aed96dce39cb03780ff251e0e38 + @Override protected void registerGoals() { - this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); + this.temptGoal = new Cat.CatTemptGoal(this, 0.6, i -> i.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 +index 93bfc93ae24d483f8a6c856d9ce978e34a064cd4..4bf42db19d0f58338f32af1ab7c802c274a8581c 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 { @@ -525,7 +525,7 @@ index 22fa29aa785eda8fb4a895d36413626da8a49a0e..c9a8dcfd1e46f97dee0393db3205049c 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 +index becb5c214adacd36372bbe2b21ab15e341640f7d..948d6a8e3465fd5985e91ca7eaa5f02258ad9625 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 { @@ -543,7 +543,7 @@ index f73b3f5ae65f7793ff25145c72fb35e3daec8494..e00e623d7df9e179d8bb5ee481253857 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 aea7887cd88604ed7a36f414221035abf999489d..8bd92b3a28ffe70cb9753050c2128c2e744fb1ee 100644 +index c31b7369194e9275e15415baa70cbb1b0de995f8..3ed54f746305a284177b609f410e2b7e9a6e6796 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 { @@ -558,13 +558,13 @@ index aea7887cd88604ed7a36f414221035abf999489d..8bd92b3a28ffe70cb9753050c2128c2e + // Purpur end - Configurable entity base attributes + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/fish/Salmon.java b/net/minecraft/world/entity/animal/fish/Salmon.java -index b362ce156765ad45b8c29b5dc2c6d9d99d2e1474..97194d5c844bf96ba431c12ccc1a82cb8944c52b 100644 +index e75e66134026a93e7681befb67abb5783fde37cf..d9276ab9af526f1714d3241bbf6f9c7906adec70 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 { +@@ -53,6 +53,13 @@ public class Salmon extends AbstractSchoolingFish { } // Purpur end - Ridables @@ -579,7 +579,7 @@ index b362ce156765ad45b8c29b5dc2c6d9d99d2e1474..97194d5c844bf96ba431c12ccc1a82cb 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 +index 3d00bcbb4ac39c7d8b4bacf15d7cfe4ad5a4a706..fbe7b76aac06bb0dce7ae53dea85e947a53d1b64 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 { @@ -593,14 +593,14 @@ index 3281e75c48fb6cafdba088254009e5b4285b3819..8ffb253c114d882c9459f74a27bd8a08 + } + // Purpur end - Configurable entity base attributes + - public static String getPredefinedName(int variantId) { - return "entity.minecraft.tropical_fish.predefined." + variantId; + public static String getPredefinedName(final int index) { + return "entity.minecraft.tropical_fish.predefined." + index; } diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java -index bf00cf5e6fd8b9143e1b327ef7b90ae055d264ff..6819bcb15ad6c85f41a098a9fdb73ce5a7987d8f 100644 +index 09077acab1f3905b7dfc84d36bfac84950baf477..51b6e7ea13b03e0d64ec70f37ae6394be64bf247 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 { +@@ -193,6 +193,14 @@ public class Fox extends Animal { } // Purpur end - Ridables @@ -613,13 +613,13 @@ index bf00cf5e6fd8b9143e1b327ef7b90ae055d264ff..6819bcb15ad6c85f41a098a9fdb73ce5 + // Purpur end - Configurable entity base attributes + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/golem/CopperGolem.java b/net/minecraft/world/entity/animal/golem/CopperGolem.java -index 27b9abe5a2d352bdba5822e840abdccdb995b0f7..b32932f1d7c9c0bbd4814eb145339a9a183ff9b9 100644 +index dd9d71eebbd9b013ae69db7b9869be8dd30ae0ba..bc66450f8d1be97f11f8380755a9973e8ef4befa 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 +@@ -134,6 +134,16 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab } // Purpur end - Ridables @@ -637,7 +637,7 @@ index 27b9abe5a2d352bdba5822e840abdccdb995b0f7..b32932f1d7c9c0bbd4814eb145339a9a 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 +index b9672e22eb3655168db2f85d4a273b3604f04618..ec08c9c2ac32863807061d93ec8894bd094f7ab4 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 { @@ -656,10 +656,10 @@ index 363bf7781c8785bc6fdbc65941794a5a02f8a57a..677f584b38aeb6805db0bb867f62d561 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 9b5a531fe67cb17021d5aa1a036ffff36ecb48d5..aa53ee0586a85a64e8c6471735e29b2694f61b9d 100644 +index 6875e40687bbde6aba25da7d3145eccdccea6f52..bd594838ae25f16e6e16335e06c4d981c5ecdc2a 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 +@@ -79,6 +79,14 @@ public class SnowGolem extends AbstractGolem implements RangedAttackMob, Shearab } // Purpur end - Ridables @@ -675,10 +675,10 @@ index 9b5a531fe67cb17021d5aa1a036ffff36ecb48d5..aa53ee0586a85a64e8c6471735e29b26 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 0a75d3790a4bf4812e4f3b27ec50d67fdccf812d..cd888e070a72ff46d35a4425a0013c617b31e159 100644 +index c179923999116c9319bf4cd3d4c66ea2e478805f..a8e242fcf7a52fb51bd686f257f7e3d5380e38d5 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 { +@@ -141,6 +141,19 @@ public class HappyGhast extends Animal { } // Purpur end - Ridables @@ -698,20 +698,20 @@ index 0a75d3790a4bf4812e4f3b27ec50d67fdccf812d..cd888e070a72ff46d35a4425a0013c61 @Override protected void ageBoundaryReached() { if (this.isBaby()) { -@@ -156,7 +169,7 @@ public class HappyGhast extends Animal { +@@ -164,7 +177,7 @@ public class HappyGhast extends Animal { @Override - protected float sanitizeScale(float scale) { + protected float sanitizeScale(final 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/nautilus/Nautilus.java b/net/minecraft/world/entity/animal/nautilus/Nautilus.java -index a02a4b47cf02cd7eaa76d25af2dccb50ad884504..a32ac3907883f65c2a00173128a4a011fd552932 100644 +index 19e8de70183a159057d542dd057996355df6794d..cc38312d0a59529e7b8f799ffec2f917c9aa0e9b 100644 --- a/net/minecraft/world/entity/animal/nautilus/Nautilus.java +++ b/net/minecraft/world/entity/animal/nautilus/Nautilus.java -@@ -21,6 +21,17 @@ public class Nautilus extends AbstractNautilus { +@@ -28,6 +28,17 @@ public class Nautilus extends AbstractNautilus { super(type, level); } @@ -727,13 +727,13 @@ index a02a4b47cf02cd7eaa76d25af2dccb50ad884504..a32ac3907883f65c2a00173128a4a011 + // Purpur end - Configurable entity base attributes + @Override - protected Brain.Provider brainProvider() { - return NautilusAi.brainProvider(); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java b/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java -index 83c16a44b230efd010e06cabb428954d157cea47..7ef4a15ba2b315a41480484572a6c6898340466b 100644 +index c4661d5d89d1a5f4b106a9a015cdaed1976efce4..087e768c35c2c2af191c75648b278154ce5e593c 100644 --- a/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java +++ b/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java -@@ -43,6 +43,17 @@ public class ZombieNautilus extends AbstractNautilus { +@@ -48,6 +48,17 @@ public class ZombieNautilus extends AbstractNautilus { super(type, level); } @@ -752,10 +752,10 @@ index 83c16a44b230efd010e06cabb428954d157cea47..7ef4a15ba2b315a41480484572a6c689 return AbstractNautilus.createAttributes().add(Attributes.MOVEMENT_SPEED, 1.1F); } diff --git a/net/minecraft/world/entity/animal/panda/Panda.java b/net/minecraft/world/entity/animal/panda/Panda.java -index 93503f6b4eea2cb2ae6c01279e847c307920c35d..d5060fb8e9a711e6230f2c4950521d8b4f5c01d2 100644 +index 15db093ca86de470b812206d2bae147968e0d03d..8844c9279dcdc2d81a63f665d96e9d60f0ab125b 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 { +@@ -137,6 +137,15 @@ public class Panda extends Animal { } // Purpur end - Ridables @@ -769,9 +769,9 @@ index 93503f6b4eea2cb2ae6c01279e847c307920c35d..d5060fb8e9a711e6230f2c4950521d8b + // Purpur end - Configurable entity base attributes + @Override - protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { + protected boolean canDispenserEquipIntoSlot(final EquipmentSlot slot) { return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); -@@ -625,7 +634,11 @@ public class Panda extends Animal { +@@ -624,7 +633,11 @@ public class Panda extends Animal { public void setAttributes() { if (this.isWeak()) { @@ -785,7 +785,7 @@ index 93503f6b4eea2cb2ae6c01279e847c307920c35d..d5060fb8e9a711e6230f2c4950521d8b 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 +index 5173a05a15209972905024f9c4fa097e5a95092f..d3b9a3ac77f03e3b6b580a678283f85a19cb660e 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 { @@ -802,12 +802,12 @@ index 6a4d170cd1e4dde2af30895f9fbac9dd599d0602..7480a491533a47882eaf4b36c320adf4 + @Override public @Nullable SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, @Nullable SpawnGroupData groupData diff --git a/net/minecraft/world/entity/animal/pig/Pig.java b/net/minecraft/world/entity/animal/pig/Pig.java -index 2a3fc6ad3a12a3cc9815b66b659e3c9ce2afa7a8..aeb9e57db2233bff20fa5208a679ac9bcb8d5026 100644 +index 57a80fbffd74a4bc0ec9f9e65abd7e2b68ef09a6..02ed5052bd06844ec6811c4249398ba8ba8c4ea6 100644 --- a/net/minecraft/world/entity/animal/pig/Pig.java +++ b/net/minecraft/world/entity/animal/pig/Pig.java -@@ -80,6 +80,14 @@ public class Pig extends Animal implements ItemSteerable { +@@ -85,6 +85,14 @@ public class Pig extends Animal implements ItemSteerable { } // Purpur end - Ridables @@ -823,10 +823,10 @@ index 2a3fc6ad3a12a3cc9815b66b659e3c9ce2afa7a8..aeb9e57db2233bff20fa5208a679ac9b 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 +index d368954be1fc54052c29dd102e97404a46c87326..e50c934e2c9959f843aae2b2dd05a682ca5f59fc 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 { +@@ -119,6 +119,14 @@ public class PolarBear extends Animal implements NeutralMob { } // Purpur end - Ridables @@ -839,13 +839,13 @@ index 718531a324c36ac65a93af5c12e0c0a3948606cb..904e4c641f1892220f263528c65f6f81 + // Purpur end - Configurable entity base attributes + @Override - public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + public @Nullable AgeableMob getBreedOffspring(final ServerLevel level, final 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 +index fa6fd57be6e4a36e701eb61634440a79b47bbd94..bf643b9e6929890f061ac2c44b196460234095c4 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 { +@@ -162,6 +162,14 @@ public class Rabbit extends Animal { } // Purpur end - Ridables @@ -861,7 +861,7 @@ index 16fbee742f28cf4571effb66265daeee64bae9b7..cfbab57dd0527c5e2f17718f3974059e 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 a33800517d5fb5ab008e22b77be2f079901c1a99..1d60d35c1330418009f7d1d0b60d263559b68b7f 100644 +index f9483c914d3923c38d405093df45f84a7e20ef7e..8d2b5a60ff267452a9724159db8df956a3fc576c 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 { @@ -880,10 +880,10 @@ index a33800517d5fb5ab008e22b77be2f079901c1a99..1d60d35c1330418009f7d1d0b60d2635 protected void registerGoals() { this.eatBlockGoal = new EatBlockGoal(this); diff --git a/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index 3d5cf62bd9bd99a978b7dc535675178deb695af0..eb6675394ecc5bba67e0f8bb0220ad92ef2b5e4f 100644 +index 0f6f2b3818001ee786c941fdffccec80fb966e52..7335e46f249b9a88ca0401493636f6e06c0e196d 100644 --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -106,6 +106,14 @@ public class Sniffer extends Animal { +@@ -111,6 +111,14 @@ public class Sniffer extends Animal { } // Purpur end - Ridables @@ -896,10 +896,10 @@ index 3d5cf62bd9bd99a978b7dc535675178deb695af0..eb6675394ecc5bba67e0f8bb0220ad92 + // Purpur end - Configurable entity base attributes + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/squid/GlowSquid.java b/net/minecraft/world/entity/animal/squid/GlowSquid.java -index c5a8080aa0fa1014602ba76fb4d8ad69b926dbfa..7d41aaa0546a9ca02e46ce46e61ecc57120bfca9 100644 +index 51a0771819abfdde5043eaeca62b0ce45c40039e..cb3d0bd838473af87af74c7d1bab38593a6c8f6d 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 { @@ -917,10 +917,10 @@ index c5a8080aa0fa1014602ba76fb4d8ad69b926dbfa..7d41aaa0546a9ca02e46ce46e61ecc57 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 +index 94aa3f10cc0ff44ec95ba56e4dbf1894cd538f71..cc0a1aaa6aa710c0f0b4df0e46e8ad7931f26b2f 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 { +@@ -96,6 +96,14 @@ public class Squid extends AgeableWaterCreature { } // Purpur end - Ridables @@ -936,7 +936,7 @@ index 69d87bd27a95bb9e92cd24fb7973a9b06714567e..5e4181f95711c6b0299f28de14d95da4 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 +index 53fc1012d46e20b623246cecae87b3feb1a0fda6..2dfcf0c9f8eb762d1683d2841a05219c497fddfc 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 { @@ -951,14 +951,14 @@ index 7699967db327cf80940bf30d8e0c734b43fd1e8f..8d9a1fe887c39588e43e4ccfc46151a0 + } + // Purpur end - Configurable entity base attributes + - public void setHomePos(BlockPos homePos) { - this.homePos = homePos; + public void setHomePos(final BlockPos pos) { + this.homePos = pos; } diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index 44b650de646ea605e41f39f3d99d8f550c9a8e19..7bccee8b5dd689bbff18f34d3afac52bfe34aa42 100644 +index 97cd55916166ffabdfdc50a493ff1642d952001e..5605c3ecb8ffaace4b21e3bd5bd3d7714b7ea83c 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -208,6 +208,14 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -205,6 +205,14 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Ridables @@ -974,7 +974,7 @@ index 44b650de646ea605e41f39f3d99d8f550c9a8e19..7bccee8b5dd689bbff18f34d3afac52b 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 eae6f063a2148ac1ac1689d65d3f80bad79f1ae8..9a8da85462dd74eed8c158ea3343354a255d320d 100644 +index 366ca403757c274fadae2578772d97a903da3174..7e39604a02561880a10d4bcebcd76135f9c1a122 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -163,6 +163,13 @@ public class EnderDragon extends Mob implements Enemy { @@ -991,20 +991,20 @@ index eae6f063a2148ac1ac1689d65d3f80bad79f1ae8..9a8da85462dd74eed8c158ea3343354a public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 200.0).add(Attributes.CAMERA_DISTANCE, 16.0); } -@@ -1059,7 +1066,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -1065,7 +1072,7 @@ public class EnderDragon extends Mob implements Enemy { @Override - protected float sanitizeScale(float scale) { + protected float sanitizeScale(final float scale) { - return 1.0F; + return 1.0F; // Purpur - Configurable entity base attributes } // 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 5164a251c67bd3c1ccb8a49a2f1c1196a8a9764e..1f777f69e37291c9367969f52aef11fe270541b7 100644 +index 6f77b7cb072cbccd104f905f148694028bd5124a..141b64eb1f320d2bc773e99826fc97cc10f39bcd 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -212,6 +212,14 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -214,6 +214,14 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Ridables @@ -1017,11 +1017,11 @@ index 5164a251c67bd3c1ccb8a49a2f1c1196a8a9764e..1f777f69e37291c9367969f52aef11fe + // Purpur end - Configurable entity base attributes + @Override - protected PathNavigation createNavigation(Level level) { + protected PathNavigation createNavigation(final Level level) { FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); -@@ -434,7 +442,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -436,7 +444,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { - this.setInvulnerableTicks(i); + this.setInvulnerableTicks(newCount); if (this.tickCount % 10 == 0) { - this.heal(10.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit + this.heal(this.getMaxHealth() / 30, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit // Purpur - Configurable entity base attributes @@ -1029,7 +1029,7 @@ index 5164a251c67bd3c1ccb8a49a2f1c1196a8a9764e..1f777f69e37291c9367969f52aef11fe } else { super.customServerAiStep(level); diff --git a/net/minecraft/world/entity/monster/Blaze.java b/net/minecraft/world/entity/monster/Blaze.java -index 1febee23188d91e2a27c182b97502e8c7ab696a2..4cd7975a8e9e55d6b6ded0b7e13d8da436e49c6c 100644 +index c1acc0a648493ec33ef4fc4a48b52fe0b3dc04b2..b553c6dd60bd23fba7ee3df9886561fc7640f104 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 { @@ -1048,7 +1048,7 @@ index 1febee23188d91e2a27c182b97502e8c7ab696a2..4cd7975a8e9e55d6b6ded0b7e13d8da4 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/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index cfd09a5ff326cf4ecc248901696ce1f623a8e7c0..ed1ccd712a2fe00740beeee4fe615976258f5c6c 100644 +index 654e923ce9fb8a725077acc8e9c9b8c7658e23f9..73b0efd692205f56862c7287d7222efebe3faf73 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 { @@ -1067,7 +1067,7 @@ index cfd09a5ff326cf4ecc248901696ce1f623a8e7c0..ed1ccd712a2fe00740beeee4fe615976 protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/monster/ElderGuardian.java b/net/minecraft/world/entity/monster/ElderGuardian.java -index e5d16ca14a40d520dce43dd3d9b6347aefbd25d7..57fb334f670d35aa181b13e12fa2c5f36da1dda6 100644 +index b86f600b1101fe1fc9f7cac5cc47c3f048e0f885..ffcfe02c51f6df1bd238c821a8d6535f4ccf019c 100644 --- a/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/net/minecraft/world/entity/monster/ElderGuardian.java @@ -43,6 +43,14 @@ public class ElderGuardian extends Guardian { @@ -1086,7 +1086,7 @@ 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 bd78d8c3e8c1d9b581c751d336322fbfe20dacef..29570047bfc78a8993b0bbd7168cb4fe318a6be6 100644 +index 36aa44008e98e3a717cbf93d29f3e8780219dc6e..30450300bdf9e4b5ef4293e9c371484ba6aabebc 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java @@ -106,6 +106,14 @@ public class EnderMan extends Monster implements NeutralMob { @@ -1105,7 +1105,7 @@ index bd78d8c3e8c1d9b581c751d336322fbfe20dacef..29570047bfc78a8993b0bbd7168cb4fe protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/monster/Endermite.java b/net/minecraft/world/entity/monster/Endermite.java -index 06687be7b218a2a3140924f5e7216199d85d35be..f92dfcf9e296714f3802264406d8ab627c9bf067 100644 +index c66b18f8f71ecf2c1d91b46eb8c9c0b5cb865c06..040f0b59d93b1b94495253f3286bdba123c22ef4 100644 --- a/net/minecraft/world/entity/monster/Endermite.java +++ b/net/minecraft/world/entity/monster/Endermite.java @@ -64,6 +64,14 @@ public class Endermite extends Monster { @@ -1124,7 +1124,7 @@ index 06687be7b218a2a3140924f5e7216199d85d35be..f92dfcf9e296714f3802264406d8ab62 protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/monster/Ghast.java b/net/minecraft/world/entity/monster/Ghast.java -index 451627153610f2c8db2403f73545c9af6dfd2e4b..7d97c00ae49629b97104631317aa6174741cdd5e 100644 +index 32c21974784cedb9a772c2bc178c5b4ca129e771..254548dd024e4963bbcb1b1fce99194461d3f54d 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 { @@ -1143,7 +1143,7 @@ index 451627153610f2c8db2403f73545c9af6dfd2e4b..7d97c00ae49629b97104631317aa6174 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/Giant.java b/net/minecraft/world/entity/monster/Giant.java -index dcbe6bbce0baa4fad7fe180944beeb6ca4026f7d..416bb85fc87b5f9e372f33df8fe27f12e83834b9 100644 +index 1b7a75a2be45928093382fa2f2da079ffc5d190d..7b6952f13e18548d0e71035d6cd6cfb24c03e6ee 100644 --- a/net/minecraft/world/entity/monster/Giant.java +++ b/net/minecraft/world/entity/monster/Giant.java @@ -35,6 +35,16 @@ public class Giant extends Monster { @@ -1164,7 +1164,7 @@ 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 4cf54e55de1ecc57061ad0c09e7966d6104f1cc2..1eaa4f255b01eddc93ddbc5615ad05e7d8273581 100644 +index 0d2a323f11996fad9c4916e05e1812b1998a1be2..12f6b4bf9fa011db34617e2115206202d7f2d32e 100644 --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java @@ -89,6 +89,14 @@ public class Guardian extends Monster { @@ -1181,9 +1181,9 @@ index 4cf54e55de1ecc57061ad0c09e7966d6104f1cc2..1eaa4f255b01eddc93ddbc5615ad05e7 + @Override protected void registerGoals() { - MoveTowardsRestrictionGoal moveTowardsRestrictionGoal = new MoveTowardsRestrictionGoal(this, 1.0); + MoveTowardsRestrictionGoal goal = new MoveTowardsRestrictionGoal(this, 1.0); diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java -index a3cd6d4b999fc49893794838c73370c19c6a66b6..e0fda9a975e00c49ba09db65d7b3fba8fa434757 100644 +index 600da11f46673177a0ff1f56c93a60d94df40025..d40a4daeec1500f2d9865022ee6e3c386ad7533e 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 { @@ -1216,10 +1216,10 @@ index a3cd6d4b999fc49893794838c73370c19c6a66b6..e0fda9a975e00c49ba09db65d7b3fba8 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 64e55d48bc81d6237970e86e6e1cc719831902fd..046d6d3b665d0dbb5403ebe91d18503ec7613936 100644 +index f3b91fa31c4ee7a7dadaebc0adea4c47c66365cf..b45eb26fa78a4bafa247c3cf8f20fb2f076646c5 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -140,7 +140,10 @@ public class Phantom extends Mob implements Enemy { +@@ -141,7 +141,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 @@ -1231,7 +1231,7 @@ index 64e55d48bc81d6237970e86e6e1cc719831902fd..046d6d3b665d0dbb5403ebe91d18503e } public int getPhantomSize() { -@@ -160,6 +163,23 @@ public class Phantom extends Mob implements Enemy { +@@ -161,6 +164,23 @@ public class Phantom extends Mob implements Enemy { return this.getId() * 3; } @@ -1256,10 +1256,10 @@ index 64e55d48bc81d6237970e86e6e1cc719831902fd..046d6d3b665d0dbb5403ebe91d18503e public void tick() { super.tick(); diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index f7807aac5a8f9c92ba77ac38c469ef14948197ac..86c55955ff6c0a411cde34999c7bd6ad07be5d4e 100644 +index 6de264683da8b502a8b73208a53ff79c54c4de44..878fee0c45a34c334d30239711231f2ef990e926 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -95,6 +95,14 @@ public class Ravager extends Raider { +@@ -93,6 +93,14 @@ public class Ravager extends Raider { } // Purpur end - Ridables @@ -1275,10 +1275,10 @@ index f7807aac5a8f9c92ba77ac38c469ef14948197ac..86c55955ff6c0a411cde34999c7bd6ad protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index 9647741b67e1b4b7bbff0df22fc1bf3fb26afa73..30f2503ebd045b05f5594cef28389a694338d13a 100644 +index eed74304cff4f121e8376236f53bf786e3be5759..84e27edf490fbe4ed0142b9bb90aab37151acf3d 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -125,6 +125,14 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -127,6 +127,14 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Ridables @@ -1293,17 +1293,17 @@ index 9647741b67e1b4b7bbff0df22fc1bf3fb26afa73..30f2503ebd045b05f5594cef28389a69 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -601,7 +609,7 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -603,7 +611,7 @@ public class Shulker extends AbstractGolem implements Enemy { @Override - protected float sanitizeScale(float scale) { + protected float sanitizeScale(final float scale) { - return Math.min(scale, 3.0F); + return Math.min(scale, MAX_SCALE); // Purpur - Configurable entity base attributes } - private void setVariant(Optional variant) { + private void setVariant(final Optional color) { diff --git a/net/minecraft/world/entity/monster/Silverfish.java b/net/minecraft/world/entity/monster/Silverfish.java -index 99b1f5009a14dab2641c1f9096d819538545989e..6f708c041679c0926282241c637162b141d06f64 100644 +index 68080332052f1e18d7be7d5c4c27347f3d57ddcc..355475b12c6f3fcc9fe88ca63ab88cabac9d6fb1 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java @@ -55,6 +55,16 @@ public class Silverfish extends Monster { @@ -1324,7 +1324,7 @@ index 99b1f5009a14dab2641c1f9096d819538545989e..6f708c041679c0926282241c637162b1 protected void registerGoals() { this.friendsGoal = new Silverfish.SilverfishWakeUpFriendsGoal(this); diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java -index 0c56f9ae47b9263ac65fd3593911e2c8479fc157..f93a2c58b5835e9ce8318d28e944533ef69df8ef 100644 +index 828d7b9985b95f898cc9ee2ae3a30dee55188538..0713239089bac454b3228d80aaabfd1fca4bd08b 100644 --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java @@ -102,6 +102,39 @@ public class Slime extends Mob implements Enemy { @@ -1368,22 +1368,22 @@ index 0c56f9ae47b9263ac65fd3593911e2c8479fc157..f93a2c58b5835e9ce8318d28e944533e protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables @@ -132,9 +165,9 @@ public class Slime extends Mob implements Enemy { - this.entityData.set(ID_SIZE, i); + this.entityData.set(ID_SIZE, actualSize); this.reapplyPosition(); this.refreshDimensions(); -- this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(i * i); +- this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(actualSize * actualSize); + this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(getFromCache(this::getMaxHealthEquation, this::getMaxHealthCache, () -> (double) (size * size))); // Purpur - Configurable entity base attributes - this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.2F + 0.1F * i); -- this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(i); -+ this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(getFromCache(this::getAttackDamageEquation, this::getAttackDamageCache, () -> (double) i)); // Purpur - Configurable entity base attributes - if (resetHealth) { + this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.2F + 0.1F * actualSize); +- this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(actualSize); ++ this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(getFromCache(this::getAttackDamageEquation, this::getAttackDamageCache, () -> (double) actualSize)); // Purpur - Configurable entity base attributes + if (updateHealth) { this.setHealth(this.getMaxHealth()); } diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index 46121b018c5dd87d888a3724df12a9af0d007772..3308e954c8f6deff89c6df0af01f7774e36b0385 100644 +index 76180ed355b0d3cb52bfebc7cbf32b91486d6f5b..f8134a362a2faa49beccb840ea8a899aa4681638 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 { +@@ -110,6 +110,14 @@ public class Strider extends Animal implements ItemSteerable { } // Purpur end - Ridables @@ -1396,13 +1396,13 @@ index 46121b018c5dd87d888a3724df12a9af0d007772..3308e954c8f6deff89c6df0af01f7774 + // Purpur end - Configurable entity base attributes + public static boolean checkStriderSpawnRules( - EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { + final EntityType ignoredType, + final LevelAccessor level, diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index d567e2b9843606c36a61c83a3a4e2d181f3eefd9..32759864a8ff0c4e28ce80ae8906cbcf1927094e 100644 +index aa36980d1a3ac6972559b905a1454df24b081306..62fe1bb1632fbe8edf901c22c7972e729a5f6100 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -102,6 +102,14 @@ public class Vex extends Monster implements TraceableEntity { +@@ -103,6 +103,14 @@ public class Vex extends Monster implements TraceableEntity { } // Purpur end - Ridables @@ -1418,7 +1418,7 @@ index d567e2b9843606c36a61c83a3a4e2d181f3eefd9..32759864a8ff0c4e28ce80ae8906cbcf public boolean isFlapping() { return this.tickCount % TICKS_PER_FLAP == 0; diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java -index bcb136e71db2272dc107304b52be41f83d6772b7..3c3c258d4cc7cf7376d0d3ad0794ec3611ab81ce 100644 +index 7551dcf0bd8d0ff6deffb298211788d5ff91d93b..6b17c2135397f349670a7180e88db4794d3902a8 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 { @@ -1437,10 +1437,10 @@ index bcb136e71db2272dc107304b52be41f83d6772b7..3c3c258d4cc7cf7376d0d3ad0794ec36 protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index c4f009357e416ed4052e058d8bf3b8c3e9dfd4ae..e0192a13b8d7131024471569bf34329ba0f28287 100644 +index 1a5e3a38671602e097e1e7f00d8f80e46b1596a0..4d4593f89e20e8e72a979cc2dee54566ef380462 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 { +@@ -93,6 +93,14 @@ public class Zoglin extends Monster implements HoglinBase { } // Purpur end - Ridables @@ -1453,13 +1453,13 @@ index c4f009357e416ed4052e058d8bf3b8c3e9dfd4ae..e0192a13b8d7131024471569bf34329b + // Purpur end - Configurable entity base attributes + @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/monster/creaking/Creaking.java b/net/minecraft/world/entity/monster/creaking/Creaking.java -index 01d3d638e194ec5e812eea0ab96b100f4752ea18..a84edd4953e59daed6816531545a6ec1c914bce6 100644 +index d7a2e2a660d9844e159ca196d155ed76d277040d..c4f29fac9e5c636248e22345c61fb89b45b9eefd 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 { +@@ -130,6 +130,14 @@ public class Creaking extends Monster { } // Purpur end - Ridables @@ -1475,10 +1475,10 @@ index 01d3d638e194ec5e812eea0ab96b100f4752ea18..a84edd4953e59daed6816531545a6ec1 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 c84f009cb0498e9c1898e310f19cff80ec6989ea..baf81e1919e64af9d6da0a49b19e5f34cf962a79 100644 +index 7ba62badc9b832bdedbec5984421abfee242fa16..352139672f2cf1a7d624db4cc5bdef3ab0c9b942 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -114,6 +114,14 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -90,6 +90,14 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { } // Purpur end - Ridables @@ -1491,13 +1491,13 @@ index c84f009cb0498e9c1898e310f19cff80ec6989ea..baf81e1919e64af9d6da0a49b19e5f34 + // Purpur end - Configurable entity base attributes + @VisibleForTesting - public void setTimeInOverworld(int timeInOverworld) { + public void setTimeInOverworld(final 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 +index ebc966bf72c0150904d3c804a5cb8bc8f9842bc6..4de0c340b1fb8baa9ed379ea010ca6d314530268 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 { +@@ -67,6 +67,14 @@ public class Evoker extends SpellcasterIllager { } // Purpur end - Ridables @@ -1513,10 +1513,10 @@ index e40434d24c7a9ffe76c3410601942d0c8a963e30..46f79ed345ec51125364b49b244d6d00 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 +index 6a9f25c465a2b54969d7ec3b658355f485f36722..bc19b4c293a4101abd559c61c59021e076420b32 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 { +@@ -77,6 +77,16 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } // Purpur end - Ridables @@ -1534,7 +1534,7 @@ index 8a80c202752f56ba174c00531993795a4e621910..8fa53cccb73b2d8c599c898f29868173 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 +index 510a1d4e1e44bda60ee05f0799a8930403f3eb7e..134650a5866459881c1dca4b77b47110fd67420a 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 @@ -1553,7 +1553,7 @@ index 0b97c4fe89c8549841cbb79ecb9383a9be7a44af..1e43c69366287c7a191a6f8e3a7d5459 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 +index c3164a33fd8010e1920eead11c482641f17b3a65..865395b9ceddfaac4fc88701878a1cf349556fe1 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 { @@ -1572,10 +1572,10 @@ index 4162e7ee482829f0c5276a31d44ed4c5ee24c3cf..5f3857186e86e27fe237c62cec4af13e 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 a42b84611836b970d0d7ddb602bd04d9ec850712..98241af88cc961470e07df47d128d8912338bd44 100644 +index f53cf55c490585595381c184e6dced8d9dcc0439..0d0a86b5c485a60d0e85b3acc6f0cc01ce6c0bfe 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -158,6 +158,14 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -125,6 +125,14 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento } // Purpur end - Ridables @@ -1588,13 +1588,13 @@ index a42b84611836b970d0d7ddb602bd04d9ec850712..98241af88cc961470e07df47d128d891 + // Purpur end - Configurable entity base attributes + @Override - protected void addAdditionalSaveData(ValueOutput output) { + protected void addAdditionalSaveData(final 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 e33809e9ccc4a65909f1c12ec4b0fdc4050aeee7..3d34bef7ffe9e66e77e3fc10b2c5869d98a4a5c9 100644 +index 75fea76d60b76a81646aa3ae4defa6cc5385d78c..4d82bf4283cb3ff26d5a9c367a28b4debed6cb0d 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 { +@@ -67,6 +67,14 @@ public class PiglinBrute extends AbstractPiglin { } // Purpur end - Ridables @@ -1610,7 +1610,7 @@ index e33809e9ccc4a65909f1c12ec4b0fdc4050aeee7..3d34bef7ffe9e66e77e3fc10b2c5869d return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) diff --git a/net/minecraft/world/entity/monster/skeleton/Bogged.java b/net/minecraft/world/entity/monster/skeleton/Bogged.java -index 10e66643a918184d858a4e6c9de7a6c2664fbcaf..f1e9cec85ce911a50bb83eff9228d6b98aa00d44 100644 +index 87b03adc6b8c18e489b3bcdc04d155719ab59e98..50dd01a2092f87fd9015c982f728f14965be5b81 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 { @@ -1626,10 +1626,10 @@ index 10e66643a918184d858a4e6c9de7a6c2664fbcaf..f1e9cec85ce911a50bb83eff9228d6b9 + // Purpur end - Configurable entity base attributes + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java -index 7f8298892565b073373ad68f9c1399a9c565c29a..96d989cffc6ff72954ed92e2535c72992d489372 100644 +index 06bae8a804bc7ac47dc21c915f386ca1dd07cd7f..76b16400085d237194ed646b04210c8eca8398d3 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 { @@ -1644,10 +1644,10 @@ index 7f8298892565b073373ad68f9c1399a9c565c29a..96d989cffc6ff72954ed92e2535c7299 + // Purpur end - Configurable entity base attributes + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java -index 23ceecffe8f1b758433e02b61cae421c518cc841..575f30cc9a6166a4e0733cc33e8b5814acb92660 100644 +index 1d706fe3bca726a4e606232039beeadedf75b499..ce9364040d6e856fd1fa42baa75b403098e6813f 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 { @@ -1662,10 +1662,10 @@ index 23ceecffe8f1b758433e02b61cae421c518cc841..575f30cc9a6166a4e0733cc33e8b5814 + // Purpur end - Configurable entity base attributes + public static boolean checkStraySpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + final EntityType type, final ServerLevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final 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 +index fc4ed0855a00a90cb7232ac9e28510b09163a74d..024b6d01eaf36ec6c9a85da669cc6bd0a4a6fc90 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 { @@ -1684,7 +1684,7 @@ index d49200718e7fab29ce5e55278b7584458bfb10e7..f38bb54c0f5d7797179e5e75eb8092ba 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 +index 59265f8286a32a1fe7de1986df78b441861e9367..beba154f2a76d3d8f7d9b44c1b45b83c9dc3b86c 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 { @@ -1700,10 +1700,10 @@ index 17a9b046ccd8de37aa79501f7556a5a816dfa90f..a1391173cc4997df723c59f176726dde + // Purpur end - Configurable entity base attributes + @Override - public boolean doHurtTarget(ServerLevel level, Entity target) { + public boolean doHurtTarget(final ServerLevel level, final 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 +index 66189a304eb7f59da08679a7157ec882aa7396fc..696d7fa001de544fd2124b4e1135725547a15a94 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 { @@ -1722,10 +1722,10 @@ index 7a8b9c83490a05629e4996844a575ba4c7e9f156..6a9c807ed50dab4b65787d9f72693851 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 03c801d5982eed73fd8f56f63ccab570e83b8a53..b5d3bfb68d8f167e5d6439d15024597d7d2a40a7 100644 +index 4b033392e1ba25dbcfd7710d3a8bfbc040d42938..573abf9eae9f5492e4231d663814352f7e046fe2 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 { +@@ -103,6 +103,19 @@ public class Drowned extends Zombie implements RangedAttackMob { return new AmphibiousPathNavigation(this, level); } @@ -1746,10 +1746,10 @@ index 03c801d5982eed73fd8f56f63ccab570e83b8a53..b5d3bfb68d8f167e5d6439d15024597d 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 ee66242db5ada8e5f8ab7ddc452c2fa818ebef89..b498cdcb5b49a1e95e4c0f6215defec325e4d8d7 100644 +index dfb43d27865674f4f13050682eda38afe2731f00..1c985585a2da43e59bb5b9ebd742e1e31b2cda29 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 { +@@ -54,6 +54,18 @@ public class Husk extends Zombie { } // Purpur end - Ridables @@ -1769,10 +1769,10 @@ index ee66242db5ada8e5f8ab7ddc452c2fa818ebef89..b498cdcb5b49a1e95e4c0f6215defec3 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 15f2e24e8b8ef367a134d88e7c47a3377beceaea..32b1202379d77b8360cc644885db6fe31f2c4a72 100644 +index 004c70e25fbcf269cf5d8b7b5961341fd3f4e374..900c768b0118153ea2c74dea0960aef3217da441 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 { +@@ -130,6 +130,14 @@ public class Zombie extends Monster { } // Purpur end - Ridables @@ -1787,7 +1787,7 @@ index 15f2e24e8b8ef367a134d88e7c47a3377beceaea..32b1202379d77b8360cc644885db6fe3 @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 { +@@ -637,7 +645,7 @@ public class Zombie extends Monster { } protected void randomizeReinforcementsChance() { @@ -1795,9 +1795,9 @@ index 15f2e24e8b8ef367a134d88e7c47a3377beceaea..32b1202379d77b8360cc644885db6fe3 + this.getAttribute(Attributes.SPAWN_REINFORCEMENTS_CHANCE).setBaseValue(this.random.nextDouble() * this.level().purpurConfig.zombieSpawnReinforcements); // Purpur - Configurable entity base attributes } - class ZombieAttackTurtleEggGoal extends RemoveBlockGoal { + private 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 00c8d2cbc5acca9062d8a7029e84fdb575a9130b..1e533522f73fde5b0faf65353a9939ae90a55e8c 100644 +index b3735610f347cb6275314dc7cd3dab56e26db85a..02cc4228bfc1ee27ffceb39d6406fce89f6d8312 100644 --- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java @@ -102,6 +102,18 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -1817,13 +1817,13 @@ index 00c8d2cbc5acca9062d8a7029e84fdb575a9130b..1e533522f73fde5b0faf65353a9939ae + // Purpur end - Configurable entity base attributes + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java -index e2c5301a465e28cea057f9afec7e9d78090e1c9e..3ff8c95075f9d25c3a2e4160ee6d18057838a7b5 100644 +index eb3ec4314603f61a041740d5b5e52165dac6ebc6..b6c14d7c5fbe7f37d4d5b865aae60d4a05af081b 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 { +@@ -85,6 +85,14 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { } // Purpur end - Ridables @@ -1838,7 +1838,7 @@ index e2c5301a465e28cea057f9afec7e9d78090e1c9e..3ff8c95075f9d25c3a2e4160ee6d1805 @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 { +@@ -271,7 +279,7 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { @Override protected void randomizeReinforcementsChance() { @@ -1848,10 +1848,10 @@ index e2c5301a465e28cea057f9afec7e9d78090e1c9e..3ff8c95075f9d25c3a2e4160ee6d1805 @Override diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java -index 6d4ef7b5d64639eb7fe400b2ed612c3b3552aa52..6f9658af51f1f30434756f871cf6ab5cd2f3a7ea 100644 +index a711cfcce0130dbc8e758568215e7a411774c5e4..ddbfcf8e16e17a3f482cb99de61ae8e40a383c18 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 +@@ -274,6 +274,14 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } // Purpur end - Ridables @@ -1865,9 +1865,9 @@ index 6d4ef7b5d64639eb7fe400b2ed612c3b3552aa52..6f9658af51f1f30434756f871cf6ab5c + @Override public Brain getBrain() { - return (Brain)super.getBrain(); + return (Brain) super.getBrain(); diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java -index 5c7da654ef967356173a9d85a8675a7dc61ef395..9d5dbaeafd899594425547fc58b87a1d0a52066e 100644 +index 2d0203b256080c3779331ff686714ae491d7b3ec..848aeba87bd220d7241c5adeba26fbd6591dbbae 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 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 75% 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 60026c9a8..80bc77917 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 646e16b3d69b5516e8f7c401828fec731378979c..7a9a37a630ea68328512c1a80bdaaefdd2253b9c 100644 +index c91b960c1cc087c424e6d17ad8f53a1f4cc354c3..9ed2866992573347548be47d1980a810e50dc653 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -887,6 +887,27 @@ public abstract class PlayerList { +@@ -888,6 +888,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper - Add sendOpLevel API @@ -37,10 +37,10 @@ index 646e16b3d69b5516e8f7c401828fec731378979c..7a9a37a630ea68328512c1a80bdaaefd // 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 3339cb1068ab162e36c410950e83e5f32dd9b705..9312a20c37329f2892e0b6231566bb1f96e1e7ac 100644 +index d4b7f1a861e67a00f7d8022b8198e04c1d279393..0f671feacee9827312cd04c158bf1e69c0f0273f 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -181,6 +181,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -176,6 +176,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 @@ -49,11 +49,11 @@ index 3339cb1068ab162e36c410950e83e5f32dd9b705..9312a20c37329f2892e0b6231566bb1f // CraftBukkit start public boolean fauxSleeping; diff --git a/net/minecraft/world/inventory/ChestMenu.java b/net/minecraft/world/inventory/ChestMenu.java -index 1fb3a34ea872dec73658fac59743e46ef8db5151..4c3b8d7ba777916ffc5ad0feccffbc7634bffe8d 100644 +index e77bfcd31cdcfd5836dc5db561e3fe2bc552a4b1..afa2ead0548766669201526d83f351c227c97e87 100644 --- a/net/minecraft/world/inventory/ChestMenu.java +++ b/net/minecraft/world/inventory/ChestMenu.java @@ -66,10 +66,30 @@ public class ChestMenu extends AbstractContainerMenu { - return new ChestMenu(MenuType.GENERIC_9x6, containerId, playerInventory, 6); + return new ChestMenu(MenuType.GENERIC_9x6, containerId, inventory, 6); } + // Purpur start - Barrels and enderchests 6 rows @@ -66,8 +66,8 @@ index 1fb3a34ea872dec73658fac59743e46ef8db5151..4c3b8d7ba777916ffc5ad0feccffbc76 + } + // Purpur end - Barrels and enderchests 6 rows + - public static ChestMenu threeRows(int containerId, Inventory playerInventory, Container container) { - return new ChestMenu(MenuType.GENERIC_9x3, containerId, playerInventory, container, 3); + public static ChestMenu threeRows(final int containerId, final Inventory inventory, final Container container) { + return new ChestMenu(MenuType.GENERIC_9x3, containerId, inventory, container, 3); } + // Purpur start - Barrels and enderchests 6 rows @@ -80,11 +80,11 @@ index 1fb3a34ea872dec73658fac59743e46ef8db5151..4c3b8d7ba777916ffc5ad0feccffbc76 + } + // Purpur end - Barrels and enderchests 6 rows + - public static ChestMenu sixRows(int containerId, Inventory playerInventory, Container container) { - return new ChestMenu(MenuType.GENERIC_9x6, containerId, playerInventory, container, 6); + public static ChestMenu sixRows(final int containerId, final Inventory inventory, final Container container) { + return new ChestMenu(MenuType.GENERIC_9x6, containerId, inventory, container, 6); } diff --git a/net/minecraft/world/inventory/PlayerEnderChestContainer.java b/net/minecraft/world/inventory/PlayerEnderChestContainer.java -index 9749909b8253b432bb2f7fba2cd8ff17a8579b30..1ef8696003e62af8dfd59340dd9cce76920b45f6 100644 +index 4df3a32faf85595372f4b250482d852c985ea3ab..8347150af55119d772b797e79be412f7e17a0f1f 100644 --- a/net/minecraft/world/inventory/PlayerEnderChestContainer.java +++ b/net/minecraft/world/inventory/PlayerEnderChestContainer.java @@ -26,11 +26,18 @@ public class PlayerEnderChestContainer extends SimpleContainer { @@ -104,25 +104,23 @@ index 9749909b8253b432bb2f7fba2cd8ff17a8579b30..1ef8696003e62af8dfd59340dd9cce76 + } + // Purpur end - Barrels and enderchests 6 rows + - public void setActiveChest(EnderChestBlockEntity enderChestBlockEntity) { - this.activeChest = enderChestBlockEntity; + public void setActiveChest(final EnderChestBlockEntity activeChest) { + this.activeChest = activeChest; } diff --git a/net/minecraft/world/level/block/EnderChestBlock.java b/net/minecraft/world/level/block/EnderChestBlock.java -index 383e8285d366c7f594b0b4ff55b367970c9b69e4..077edf449d4faa41abafb94ac41dfe822f449d04 100644 +index 24a2c411da0ebbb7f97d621bb76ff686621f9aae..7ba9e8f6414246b589ff423fac63f80505326505 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 - enderChestInventory.setActiveChest(enderChestBlockEntity); // Needs to happen before ChestMenu.threeRows as it is required for opening animations +@@ -88,7 +88,7 @@ public class EnderChestBlock extends AbstractChestBlock i + // Paper start - Fix InventoryOpenEvent cancellation - moved up; + container.setActiveChest(enderChest); // Needs to happen before ChestMenu.threeRows as it is required for opening animations if (level instanceof ServerLevel serverLevel && player.openMenu( - new SimpleMenuProvider( -- (containerId, playerInventory, player1) -> ChestMenu.threeRows(containerId, playerInventory, enderChestInventory), CONTAINER_TITLE -- ) -+ (containerId, playerInventory, player1) -> org.purpurmc.purpur.PurpurConfig.enderChestSixRows ? getEnderChestSixRows(containerId, playerInventory, player, enderChestInventory) : ChestMenu.threeRows(containerId, playerInventory, enderChestInventory), CONTAINER_TITLE -+ ) // Purpur - Barrels and enderchests 6 rows +- new SimpleMenuProvider((containerId, inventory, p) -> ChestMenu.threeRows(containerId, inventory, container), CONTAINER_TITLE) ++ new SimpleMenuProvider((containerId, inventory, p) -> org.purpurmc.purpur.PurpurConfig.enderChestSixRows ? getEnderChestSixRows(containerId, inventory, player, container) : ChestMenu.threeRows(containerId, inventory, container), CONTAINER_TITLE) // Purpur - Barrels and enderchests 6 rows ).isPresent()) { // Paper end - Fix InventoryOpenEvent cancellation - moved up; player.awardStat(Stats.OPEN_ENDERCHEST); -@@ -100,6 +100,35 @@ public class EnderChestBlock extends AbstractChestBlock i +@@ -102,6 +102,35 @@ public class EnderChestBlock extends AbstractChestBlock i } } @@ -156,13 +154,13 @@ index 383e8285d366c7f594b0b4ff55b367970c9b69e4..077edf449d4faa41abafb94ac41dfe82 + // Purpur end - Barrels and enderchests 6 rows + @Override - public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return new EnderChestBlockEntity(pos, state); + public BlockEntity newBlockEntity(final BlockPos worldPosition, final BlockState blockState) { + return new EnderChestBlockEntity(worldPosition, blockState); diff --git a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -index 75c09a2079c89f9346391abdd01ef8790b9cbb13..04f6b3c328377091734a111f5a219379e32b5640 100644 +index 9eb6cb86ff70f04863cae3def1006f82bcb4fa6b..79ca37b3e4ed98139b8adbdccd39d597315c7f99 100644 --- a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -@@ -59,7 +59,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { +@@ -60,7 +60,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { } // CraftBukkit end private static final Component DEFAULT_NAME = Component.translatable("container.barrel"); @@ -178,9 +176,9 @@ index 75c09a2079c89f9346391abdd01ef8790b9cbb13..04f6b3c328377091734a111f5a219379 + }, ItemStack.EMPTY); + // Purpur end - Barrels and enderchests 6 rows public final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() { - @Override - protected void onOpen(Level level, BlockPos pos, BlockState state) { -@@ -111,7 +120,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { + { + Objects.requireNonNull(BarrelBlockEntity.this); +@@ -116,7 +125,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { @Override public int getContainerSize() { @@ -198,19 +196,19 @@ index 75c09a2079c89f9346391abdd01ef8790b9cbb13..04f6b3c328377091734a111f5a219379 } @Override -@@ -131,7 +149,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { +@@ -136,7 +154,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { @Override - protected AbstractContainerMenu createMenu(int id, Inventory player) { -- return ChestMenu.threeRows(id, player, this); + protected AbstractContainerMenu createMenu(final int containerId, final Inventory inventory) { +- return ChestMenu.threeRows(containerId, inventory, this); + // Purpur start - Barrels and enderchests 6 rows + return switch (org.purpurmc.purpur.PurpurConfig.barrelRows) { -+ case 6 -> ChestMenu.sixRows(id, player, this); -+ case 5 -> ChestMenu.fiveRows(id, player, this); -+ case 4 -> ChestMenu.fourRows(id, player, this); -+ case 2 -> ChestMenu.twoRows(id, player, this); -+ case 1 -> ChestMenu.oneRow(id, player, this); -+ default -> ChestMenu.threeRows(id, player, this); ++ case 6 -> ChestMenu.sixRows(containerId, inventory, this); ++ case 5 -> ChestMenu.fiveRows(containerId, inventory, this); ++ case 4 -> ChestMenu.fourRows(containerId, inventory, this); ++ case 2 -> ChestMenu.twoRows(containerId, inventory, this); ++ case 1 -> ChestMenu.oneRow(containerId, inventory, this); ++ default -> ChestMenu.threeRows(containerId, inventory, this); + }; + // Purpur end - Barrels and enderchests 6 rows } 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 96% 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 3ca516628..7db399305 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 416bb85fc87b5f9e372f33df8fe27f12e83834b9..40cf8f44a6b01d45306dab4ba4f9a7ea7c6590a9 100644 +index 7b6952f13e18548d0e71035d6cd6cfb24c03e6ee..c39031e8fdfb0dff7867d9525dbddde110242647 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 { @@ -69,7 +69,7 @@ index 416bb85fc87b5f9e372f33df8fe27f12e83834b9..40cf8f44a6b01d45306dab4ba4f9a7ea + // Purpur end - Giants AI settings + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final LevelReader level) { - return level.getPathfindingCostFromLightLevels(pos); + return super.getWalkTargetValue(pos, level); // Purpur - Giants AI settings - fix light requirements for natural spawns } 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 88% 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 deaa95d09..e01a967e5 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0005-Chickens-can-retaliate.patch +++ b/purpur-server/minecraft-patches/features/0005-Chickens-can-retaliate.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Chickens can retaliate diff --git a/net/minecraft/world/entity/animal/chicken/Chicken.java b/net/minecraft/world/entity/animal/chicken/Chicken.java -index bfc5c6639ef1005d2752d5164f3613ddacc46bf1..52a0bf792337e2f1cf11e215b033caae21ee774b 100644 +index 3e1e904d9401bef41271fe8d29a22b6cd944e766..0392c8a94801a1dee735ff610058fbb2180571fa 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 { +@@ -98,6 +98,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,14 +20,14 @@ index bfc5c6639ef1005d2752d5164f3613ddacc46bf1..52a0bf792337e2f1cf11e215b033caae } // Purpur end - Configurable entity base attributes -@@ -102,13 +107,21 @@ public class Chicken extends Animal { +@@ -105,13 +110,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 - this.goalSelector.addGoal(1, new PanicGoal(this, 1.4)); + //this.goalSelector.addGoal(1, new PanicGoal(this, 1.4)); // Purpur - Chickens can retaliate - moved down 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)); + this.goalSelector.addGoal(3, new TemptGoal(this, 1.0, i -> i.is(ItemTags.CHICKEN_FOOD), false)); this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.1)); this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); @@ -42,8 +42,8 @@ index bfc5c6639ef1005d2752d5164f3613ddacc46bf1..52a0bf792337e2f1cf11e215b033caae + // Purpur end - Chickens can retaliate } - @Override -@@ -117,7 +130,7 @@ public class Chicken extends Animal { + public Holder getSoundVariant() { +@@ -132,7 +145,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 84% 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 790c8a321..87d74acc0 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,13 +5,13 @@ Subject: [PATCH] Minecart settings and WASD controls diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 2eba1b0ac8b4a0bb34d04b81c4c279db6e716b3b..01efe1fbd185ebd3a60c6bbb7aa2d82817506e7d 100644 +index e5d9c8e6999f3b7a40269fc5b06da4878a114046..b8ebcaca72ed6c92802fe289f8db1e0223d7470d 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1311,6 +1311,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -1296,6 +1296,11 @@ public class ServerPlayer extends Player { } else { // Purpur start - Add boat fall damage config - if (damageSource.is(net.minecraft.tags.DamageTypeTags.IS_FALL)) { + if (source.is(net.minecraft.tags.DamageTypeTags.IS_FALL)) { + // Purpur start - Minecart settings and WASD controls + if (getRootVehicle() instanceof AbstractMinecart && level().purpurConfig.minecartControllable && !level().purpurConfig.minecartControllableFallDamage) { + return false; @@ -21,7 +21,7 @@ index 2eba1b0ac8b4a0bb34d04b81c4c279db6e716b3b..01efe1fbd185ebd3a60c6bbb7aa2d828 return false; } diff --git a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java -index 1123ec0038552e0b40774f4a433ff325695ea071..48099ae66045b6e78ec52832e3b972ac9c9bc246 100644 +index 9f72e7eeecf3037a498e7688f55cc029a49f388d..59cf0d4dcffc00313e06574987e4364f6ca21eb5 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 { @@ -49,7 +49,7 @@ index 1123ec0038552e0b40774f4a433ff325695ea071..48099ae66045b6e78ec52832e3b972ac } } -@@ -278,6 +287,14 @@ public abstract class AbstractMinecart extends VehicleEntity { +@@ -289,6 +298,14 @@ public abstract class AbstractMinecart extends VehicleEntity { @Override public void tick() { @@ -64,7 +64,7 @@ index 1123ec0038552e0b40774f4a433ff325695ea071..48099ae66045b6e78ec52832e3b972ac // CraftBukkit start double prevX = this.getX(); double prevY = this.getY(); -@@ -392,15 +409,61 @@ public abstract class AbstractMinecart extends VehicleEntity { +@@ -405,15 +422,61 @@ public abstract class AbstractMinecart extends VehicleEntity { this.behavior.moveAlongTrack(level); } @@ -87,10 +87,10 @@ index 1123ec0038552e0b40774f4a433ff325695ea071..48099ae66045b6e78ec52832e3b972ac + } + // Purpur end - Minecart settings and WASD controls + - protected void comeOffTrack(ServerLevel level) { + protected void comeOffTrack(final ServerLevel level) { double maxSpeed = this.getMaxSpeed(level); - Vec3 deltaMovement = this.getDeltaMovement(); - this.setDeltaMovement(Mth.clamp(deltaMovement.x, -maxSpeed, maxSpeed), deltaMovement.y, Mth.clamp(deltaMovement.z, -maxSpeed, maxSpeed)); + Vec3 movement = this.getDeltaMovement(); + this.setDeltaMovement(Mth.clamp(movement.x, -maxSpeed, maxSpeed), movement.y, Mth.clamp(movement.z, -maxSpeed, maxSpeed)); + + // Purpur start - Minecart settings and WASD controls + if (level().purpurConfig.minecartControllable && !isInWater() && !isInLava() && !passengers.isEmpty()) { @@ -127,23 +127,23 @@ index 1123ec0038552e0b40774f4a433ff325695ea071..48099ae66045b6e78ec52832e3b972ac 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 3b511139985ea1646661ae0a6bcd1f0e386561e7..3a65e1a0b914d113feb727833803ece8f3b2e020 100644 +index 7464dbde8cc3348748d2a3733624bd2274f9c735..91df0baebab1da9cd060cb93698c7f154c719669 100644 --- a/net/minecraft/world/item/MinecartItem.java +++ b/net/minecraft/world/item/MinecartItem.java @@ -30,8 +30,9 @@ public class MinecartItem extends Item { - BlockPos clickedPos = context.getClickedPos(); - BlockState blockState = level.getBlockState(clickedPos); + BlockPos pos = context.getClickedPos(); + BlockState blockState = level.getBlockState(pos); if (!blockState.is(BlockTags.RAILS)) { - return InteractionResult.FAIL; - } else { + if (!level.purpurConfig.minecartPlaceAnywhere) return InteractionResult.FAIL; // Purpur - Minecart settings and WASD controls -+ if (blockState.isSolid()) clickedPos = clickedPos.relative(context.getClickedFace()); ++ if (blockState.isSolid()) pos = pos.relative(context.getClickedFace()); + } // else { // Purpur - Minecart settings and WASD controls - ItemStack itemInHand = context.getItemInHand(); - RailShape railShape = blockState.getBlock() instanceof BaseRailBlock + ItemStack itemStack = context.getItemInHand(); + RailShape shape = blockState.getBlock() instanceof BaseRailBlock ? blockState.getValue(((BaseRailBlock)blockState.getBlock()).getShapeProperty()) -@@ -72,6 +73,6 @@ public class MinecartItem extends Item { - itemInHand.shrink(1); +@@ -70,6 +71,6 @@ public class MinecartItem extends Item { + itemStack.shrink(1); return InteractionResult.SUCCESS; } - } 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 81% 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 cb6f356d1..88a0cb894 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,7 +5,7 @@ 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 686776bb00560f9da8838bd5f8dd64aaddfa7a2b..ccdd439a89b7e7e10ee960cfe1e5e119d5367799 100644 +index 6b78ddb4ec40d45634288796a98e34714e0deb68..34d2394006a006ea0773a52bb43b5cb3617470e5 100644 --- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java @@ -173,7 +173,7 @@ public class DefaultAttributes { @@ -18,35 +18,35 @@ index 686776bb00560f9da8838bd5f8dd64aaddfa7a2b..ccdd439a89b7e7e10ee960cfe1e5e119 .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 18030dc04eb7d7971e457637b5320b1e41665658..60ebd57de496eba6ad307195ffacd3b7fc4149ff 100644 +index af2bd8a5cf760792a63dfb9c2370360f288beab6..016167a6ff90dfe5a2e66596eaab2c8f2775c016 100644 --- a/net/minecraft/world/entity/ai/goal/TemptGoal.java +++ b/net/minecraft/world/entity/ai/goal/TemptGoal.java @@ -70,7 +70,7 @@ public class TemptGoal extends Goal { } - private boolean shouldFollow(LivingEntity entity) { -- return this.items.test(entity.getMainHandItem()) || this.items.test(entity.getOffhandItem()); -+ return (this.items.test(entity.getMainHandItem()) || this.items.test(entity.getOffhandItem())) && (!(this.mob instanceof net.minecraft.world.entity.npc.villager.Villager villager) || !villager.isSleeping()); // Purpur - Villagers follow emerald blocks + private boolean shouldFollow(final LivingEntity player) { +- return this.items.test(player.getMainHandItem()) || this.items.test(player.getOffhandItem()); ++ return (this.items.test(player.getMainHandItem()) || this.items.test(player.getOffhandItem())) && (!(this.mob instanceof net.minecraft.world.entity.npc.villager.Villager villager) || !villager.isSleeping()); // Purpur - Villagers follow emerald blocks } @Override diff --git a/net/minecraft/world/entity/npc/villager/AbstractVillager.java b/net/minecraft/world/entity/npc/villager/AbstractVillager.java -index fa8f1ea38192f9ad0a961a53399f295d83af7721..05d1a859e1aee639ad9572f2369e6db3c3d7a111 100644 +index f6ac52144958b48dad0b0f682634fad3d8e9557c..0825e06843c3613843cf7c15fa3fb3a1c0787781 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; +@@ -52,6 +52,7 @@ import org.jspecify.annotations.Nullable; + import org.slf4j.Logger; - public abstract class AbstractVillager extends AgeableMob implements InventoryCarrier, Npc, Merchant { + public abstract class AbstractVillager extends AgeableMob implements Npc, Merchant, InventoryCarrier { + public 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 Logger LOGGER = LogUtils.getLogger(); 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; + private @Nullable Player tradingPlayer; diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java -index 6f9658af51f1f30434756f871cf6ab5cd2f3a7ea..02836bd2e8fda563877d3014ab839734aebc7457 100644 +index ddbfcf8e16e17a3f482cb99de61ae8e40a383c18..6105aa39baf888dd625f4d345822a4058bf83ef4 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 +@@ -271,6 +271,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); @@ -54,7 +54,7 @@ index 6f9658af51f1f30434756f871cf6ab5cd2f3a7ea..02836bd2e8fda563877d3014ab839734 } // Purpur end - Ridables -@@ -277,6 +278,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -279,6 +280,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.villagerMaxHealth); this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.villagerScale); @@ -62,7 +62,7 @@ index 6f9658af51f1f30434756f871cf6ab5cd2f3a7ea..02836bd2e8fda563877d3014ab839734 } // Purpur end - Configurable entity base attributes -@@ -345,7 +347,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -320,7 +322,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } public static AttributeSupplier.Builder createAttributes() { @@ -72,7 +72,7 @@ index 6f9658af51f1f30434756f871cf6ab5cd2f3a7ea..02836bd2e8fda563877d3014ab839734 public boolean assignProfessionWhenSpawned() { diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java -index 9d5dbaeafd899594425547fc58b87a1d0a52066e..c6c4f4f2a970db7e782181eaca312931b192b0d5 100644 +index 848aeba87bd220d7241c5adeba26fbd6591dbbae..ea74d8ac0b5de890124361e65aeb9a08ad09fa1b 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 @@ -92,7 +92,7 @@ index 9d5dbaeafd899594425547fc58b87a1d0a52066e..c6c4f4f2a970db7e782181eaca312931 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); -@@ -126,6 +133,7 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +@@ -123,6 +130,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 57% 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 453fc1d13..b9b22ebaa 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,15 +5,14 @@ Subject: [PATCH] Implement elytra settings diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 51e7ca17a8e32be76cdcd7a59a15acf4b73cc98a..c4fa59a13be8affa28de7bc8f2da3e353515c821 100644 +index 7119a83b5b9811ab3ef2622f91c966741818e48f..2e7e5c4c42bcdb6135a088ffe0a7a8f4558dc12c 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -3895,7 +3895,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); -- this.getItemBySlot(equipmentSlot).hurtAndBreak(1, this, equipmentSlot); -+ +@@ -3945,7 +3945,16 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + if (freeFallInterval % 2 == 0) { + List slotsWithGliders = EquipmentSlot.VALUES.stream().filter(slot -> canGlideUsing(this.getItemBySlot(slot), slot)).toList(); + EquipmentSlot slotToDamage = Util.getRandom(slotsWithGliders, this.random); +- this.getItemBySlot(slotToDamage).hurtAndBreak(1, this, slotToDamage); + // Purpur start - Implement elytra settings + int damage = level().purpurConfig.elytraDamagePerSecond; + if (level().purpurConfig.elytraDamageMultiplyBySpeed > 0) { @@ -22,14 +21,13 @@ index 51e7ca17a8e32be76cdcd7a59a15acf4b73cc98a..c4fa59a13be8affa28de7bc8f2da3e35 + damage *= (int) speed; + } + } -+ -+ this.getItemBySlot(equipmentSlot).hurtAndBreak(damage, this, equipmentSlot); ++ this.getItemBySlot(slotToDamage).hurtAndBreak(damage, this, slotToDamage); + // Purpur end - Implement elytra settings } this.gameEvent(GameEvent.ELYTRA_GLIDE); diff --git a/net/minecraft/world/item/FireworkRocketItem.java b/net/minecraft/world/item/FireworkRocketItem.java -index 2c597e20c1ff587f2eadef600bedb9e01b999bbf..e548f7161f14d7dc02d6882c3639ff65d59d7b37 100644 +index c17607cb1fd5403f17a64b4218571e669b840a2e..6545145e1f83b333fd1d05ab714c9869c5d2d7fe 100644 --- a/net/minecraft/world/item/FireworkRocketItem.java +++ b/net/minecraft/world/item/FireworkRocketItem.java @@ -73,6 +73,17 @@ public class FireworkRocketItem extends Item implements ProjectileItem { @@ -48,13 +46,13 @@ index 2c597e20c1ff587f2eadef600bedb9e01b999bbf..e548f7161f14d7dc02d6882c3639ff65 + } + // Purpur end - Implement elytra settings if (event.shouldConsume() && !player.hasInfiniteMaterials()) { - itemInHand.shrink(1); // Moved up from below + itemStack.shrink(1); // Moved up from below } else { diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index b8e38ce9b5c4b11e5bcbe6cf5603d6d39454759c..fd90ba8eba88c8d4fa372cb1047e0af8528f914d 100644 +index 842bc5b3b7a31a8cc3b5651fb69092402d83606c..70a45aab9ac93973a3dde08140a4acf4813987f3 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -702,6 +702,14 @@ public final class ItemStack implements DataComponentHolder { +@@ -695,6 +695,14 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent(serverPlayer, this); // Paper - Add EntityDamageItemEvent } // CraftBukkit end @@ -70,24 +68,23 @@ index b8e38ce9b5c4b11e5bcbe6cf5603d6d39454759c..fd90ba8eba88c8d4fa372cb1047e0af8 onBreak.accept(item); } diff --git a/net/minecraft/world/item/TridentItem.java b/net/minecraft/world/item/TridentItem.java -index b87861c089f849e855d10c15ede53fd7c9e6a47c..633bb1a6d69b55717a9a07978b92f625ff5d066a 100644 +index 710b8711184ea6e1cf0dfd338b897923ed2b79fb..82995f60dbb62325b46bc8a87cd2087461715c4f 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 { - f1 *= tridentSpinAttackStrength / squareRoot; - f2 *= tridentSpinAttackStrength / squareRoot; - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerRiptideEvent(player, stack, f, f1, f2)) return false; // Paper - Add player riptide event -+ // Purpur start - Implement elytra settings -+ List list = net.minecraft.world.entity.EquipmentSlot.VALUES.stream().filter((enumitemslot) -> LivingEntity.canGlideUsing(entity.getItemBySlot(enumitemslot), enumitemslot)).toList(); -+ if (!list.isEmpty()) { -+ net.minecraft.world.entity.EquipmentSlot enumitemslot = net.minecraft.util.Util.getRandom(list, entity.random); -+ ItemStack glideItem = entity.getItemBySlot(enumitemslot); -+ if (glideItem.has(net.minecraft.core.component.DataComponents.GLIDER) && level.purpurConfig.elytraDamagePerTridentBoost > 0) { -+ glideItem.hurtAndBreak(level.purpurConfig.elytraDamagePerTridentBoost, entity, enumitemslot); +@@ -125,6 +125,16 @@ public class TridentItem extends Item implements ProjectileItem { + yd *= riptideStrength / dist; + zd *= riptideStrength / dist; + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerRiptideEvent(player, itemStack, xd, yd, zd)) return false; // Paper - Add player riptide event ++ // Purpur start - Implement elytra settings ++ List list = net.minecraft.world.entity.EquipmentSlot.VALUES.stream().filter((enumitemslot) -> LivingEntity.canGlideUsing(entity.getItemBySlot(enumitemslot), enumitemslot)).toList(); ++ if (!list.isEmpty()) { ++ net.minecraft.world.entity.EquipmentSlot enumitemslot = net.minecraft.util.Util.getRandom(list, entity.random); ++ ItemStack glideItem = entity.getItemBySlot(enumitemslot); ++ if (glideItem.has(net.minecraft.core.component.DataComponents.GLIDER) && level.purpurConfig.elytraDamagePerTridentBoost > 0) { ++ glideItem.hurtAndBreak(level.purpurConfig.elytraDamagePerTridentBoost, entity, enumitemslot); ++ } + } -+ } -+ // Purpur end - Implement elytra settings -+ - player.push(f, f1, f2); - player.startAutoSpinAttack(20, 8.0F, stack); - if (player.onGround()) { ++ // Purpur end - Implement elytra settings + player.push(xd, yd, zd); + player.startAutoSpinAttack(20, 8.0F, itemStack); + if (player.onGround()) { 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 72% 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 0857bb625..cf03fea3b 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0009-Configurable-jockey-options.patch +++ b/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Configurable jockey options diff --git a/net/minecraft/world/entity/monster/zombie/Drowned.java b/net/minecraft/world/entity/monster/zombie/Drowned.java -index 0b6d2bcec8506686eb6e0aaeb14870c14bd84e9d..3b1e3e7c1218cbfdfe48db3fad15280f43fd3311 100644 +index 573abf9eae9f5492e4231d663814352f7e046fe2..0f64fe7e15655c63f996106d504ab4d18dac4a1c 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 { +@@ -116,6 +116,23 @@ public class Drowned extends Zombie implements RangedAttackMob { } // Purpur end - Configurable entity base attributes @@ -33,10 +33,10 @@ index 0b6d2bcec8506686eb6e0aaeb14870c14bd84e9d..3b1e3e7c1218cbfdfe48db3fad15280f 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 03270138e6fae7ee28f958cafee5b74b18dce355..d31145fee0f646d734e90199288b29f07854d066 100644 +index 1c985585a2da43e59bb5b9ebd742e1e31b2cda29..c3f2d9ab49eb501f26939387624f326227908b81 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 { +@@ -66,6 +66,23 @@ public class Husk extends Zombie { } // Purpur end - Configurable entity base attributes @@ -61,10 +61,10 @@ index 03270138e6fae7ee28f958cafee5b74b18dce355..d31145fee0f646d734e90199288b29f0 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 +index 900c768b0118153ea2c74dea0960aef3217da441..5bf9970b93e27004dd832c8465dc95a681583ef6 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 { +@@ -138,6 +138,20 @@ public class Zombie extends Monster { } // Purpur end - Configurable entity base attributes @@ -85,42 +85,42 @@ index d873ca9873e95f3a5869cb63a93b0643a9c867dc..638642628c3dc9fa25d25c589029219c @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -531,19 +545,18 @@ public class Zombie extends Monster { +@@ -550,19 +564,18 @@ public class Zombie extends Monster { } - if (spawnGroupData instanceof Zombie.ZombieGroupData zombieGroupData) { -- if (zombieGroupData.isBaby) { + if (groupData instanceof Zombie.ZombieGroupData zombieData) { +- if (zombieData.isBaby) { - this.setBaby(true); -+ if (!jockeyOnlyBaby() || zombieGroupData.isBaby) { // Purpur - Configurable jockey options -+ this.setBaby(zombieGroupData.isBaby); // Purpur - Configurable jockey options - if (zombieGroupData.canSpawnJockey) { ++ if (!jockeyOnlyBaby() || zombieData.isBaby) { // Purpur - Configurable jockey options ++ this.setBaby(zombieData.isBaby); // Purpur - Configurable jockey options + if (zombieData.canSpawnJockey) { - if (random.nextFloat() < 0.05) { -- List entitiesOfClass = level.getEntitiesOfClass( +- List chickens = level.getEntitiesOfClass( + if (random.nextFloat() < jockeyChance()) { // Purpur - Configurable jockey options -+ List entitiesOfClass = jockeyTryExistingChickens() ? level.getEntitiesOfClass( // Purpur - Configurable jockey options ++ List chickens = jockeyTryExistingChickens() ? level.getEntitiesOfClass( // Purpur - Configurable jockey options Chicken.class, this.getBoundingBox().inflate(5.0, 3.0, 5.0), EntitySelector.ENTITY_NOT_BEING_RIDDEN - ); + ) : java.util.Collections.emptyList(); // Purpur - Configurable jockey options - if (!entitiesOfClass.isEmpty()) { - Chicken chicken = entitiesOfClass.get(0); + if (!chickens.isEmpty()) { + Chicken chicken = chickens.get(0); chicken.setChickenJockey(true); this.startRiding(chicken, false, false); - } - } else if (random.nextFloat() < 0.05) { + } else { // Purpur - Configurable jockey options - Chicken chicken1 = EntityType.CHICKEN.create(this.level(), EntitySpawnReason.JOCKEY); - if (chicken1 != null) { - chicken1.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F); -@@ -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 + Chicken chicken = EntityType.CHICKEN.create(this.level(), EntitySpawnReason.JOCKEY); + if (chicken != null) { + chicken.snapTo(this.getX(), this.getY(), this.getZ(), this.getYRot(), 0.0F); +@@ -571,6 +584,7 @@ public class Zombie extends Monster { + this.startRiding(chicken, false, false); + level.addFreshEntity(chicken, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit } + } // Purpur - Configurable jockey options } } } diff --git a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java -index 0a02684ec00540b91a2a68e5787e51d15b3743a7..62f55763d95e496da8b8fcf7d95752777e323b48 100644 +index 02cc4228bfc1ee27ffceb39d6406fce89f6d8312..8a5634d2204b9abae560d34a7b0616b3ebdc68ab 100644 --- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java @@ -114,6 +114,23 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -145,13 +145,13 @@ index 0a02684ec00540b91a2a68e5787e51d15b3743a7..62f55763d95e496da8b8fcf7d9575277 + // Purpur end - Configurable jockey options + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java -index 3ff8c95075f9d25c3a2e4160ee6d18057838a7b5..ec39ad6740361774f9ecfda7186cab9d8fac90f2 100644 +index b6c14d7c5fbe7f37d4d5b865aae60d4a05af081b..d1edf1f44de1fc6d23bcd8044f8bf4165821790e 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 { +@@ -93,6 +93,23 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { } // Purpur end - Configurable entity base attributes 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 91% 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 b49a87897..d8ded0d5b 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 d1c593ccfab7bee4366ee7c56606a230964e3fb7..21d678008fac473dff4c3e10890882ab94d0087c 100644 +index 0bfb8cd53e87d986679d4e26ebf77c52e58c1c10..fd901b84bc105a2ccf59eef687a20d53b84e1906 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 { @@ -19,7 +19,7 @@ index d1c593ccfab7bee4366ee7c56606a230964e3fb7..21d678008fac473dff4c3e10890882ab + private int idleCooldown = 0; + // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms - public EndCrystal(EntityType type, Level level) { + public EndCrystal(final EntityType type, final Level level) { super(type, level); @@ -95,6 +101,49 @@ public class EndCrystal extends Entity { // Paper end - Fix invulnerable end crystals @@ -72,18 +72,18 @@ index d1c593ccfab7bee4366ee7c56606a230964e3fb7..21d678008fac473dff4c3e10890882ab @Override diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index 046d6d3b665d0dbb5403ebe91d18503ec7613936..7077beafe2251fcc4e37578091bfaa02714268b9 100644 +index b45eb26fa78a4bafa247c3cf8f20fb2f076646c5..c33910433eae54df4d1d4b918c28b361bd510577 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -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; +@@ -50,6 +50,7 @@ public class Phantom extends Mob implements Enemy { + private Vec3 moveTargetPoint = Vec3.ZERO; + public @Nullable BlockPos anchorPoint; + private Phantom.AttackPhase attackPhase = Phantom.AttackPhase.CIRCLE; + Vec3 crystalPosition; // Purpur - Phantoms attracted to crystals and crystals shoot phantoms // Paper start public java.util.@Nullable UUID spawningEntity; public boolean shouldBurnInDay = true; -@@ -107,6 +108,25 @@ public class Phantom extends Mob implements Enemy { +@@ -108,6 +109,25 @@ public class Phantom extends Mob implements Enemy { } // Purpur end - Ridables @@ -109,7 +109,7 @@ index 046d6d3b665d0dbb5403ebe91d18503ec7613936..7077beafe2251fcc4e37578091bfaa02 @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; -@@ -120,9 +140,15 @@ public class Phantom extends Mob implements Enemy { +@@ -121,9 +141,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 046d6d3b665d0dbb5403ebe91d18503ec7613936..7077beafe2251fcc4e37578091bfaa02 this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -506,6 +532,124 @@ public class Phantom extends Mob implements Enemy { +@@ -513,6 +539,124 @@ public class Phantom extends Mob implements Enemy { } } @@ -243,13 +243,13 @@ index 046d6d3b665d0dbb5403ebe91d18503ec7613936..7077beafe2251fcc4e37578091bfaa02 + private void updateOffset() { + this.offset += this.direction * 15.0F * 0.017453292F; + phantom.moveTargetPoint = phantom.crystalPosition.add( -+ this.radius * Mth.cos(this.offset), -+ -4.0F + this.verticalChange, -+ this.radius * Mth.sin(this.offset)); ++ this.radius * Mth.cos(this.offset), ++ -4.0F + this.verticalChange, ++ this.radius * Mth.sin(this.offset)); + } + } + // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms + - class PhantomMoveControl extends org.purpurmc.purpur.controller.FlyingMoveControllerWASD { // Purpur - Ridables - private float speed = 0.1F; + private class PhantomMoveControl extends org.purpurmc.purpur.controller.FlyingMoveControllerWASD { // Purpur - Ridables + private float speed; 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 68% 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 0e9dd06e4..b8eda02ef 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 @@ -5,18 +5,18 @@ Subject: [PATCH] Phantoms burn in light diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index 7077beafe2251fcc4e37578091bfaa02714268b9..6e8fe1b694ade45ffbf0b9bb39b954deffeb2402 100644 +index c33910433eae54df4d1d4b918c28b361bd510577..da014eae20abb320ecb897517810e4ab53783a89 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -54,6 +54,7 @@ public class Phantom extends Mob implements Enemy { +@@ -55,6 +55,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) { + public Phantom(final EntityType type, final Level level) { super(type, level); -@@ -238,7 +239,11 @@ public class Phantom extends Mob implements Enemy { +@@ -239,7 +240,11 @@ public class Phantom extends Mob implements Enemy { // Paper start @Override public boolean isSunBurnTick() { @@ -29,15 +29,15 @@ index 7077beafe2251fcc4e37578091bfaa02714268b9..6e8fe1b694ade45ffbf0b9bb39b954de } // Paper end -@@ -366,6 +371,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) - ); -+ if (level().purpurConfig.phantomIgnorePlayersWithTorch) nearbyPlayers.removeIf(human -> TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.MAIN_HAND)) || TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.OFF_HAND))); // Purpur - Phantoms burn in light - if (!nearbyPlayers.isEmpty()) { - nearbyPlayers.sort(Comparator.comparing(Entity::getY).reversed()); +@@ -362,6 +367,7 @@ public class Phantom extends Mob implements Enemy { + this.nextScanTick = reducedTickDelay(60); + ServerLevel level = getServerLevel(Phantom.this.level()); + List players = level.getNearbyPlayers(this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0, 64.0, 16.0)); ++ if (level().purpurConfig.phantomIgnorePlayersWithTorch) players.removeIf(human -> TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.MAIN_HAND)) || TORCH.test(human.getItemInHand(net.minecraft.world.InteractionHand.OFF_HAND))); // Purpur - Phantoms burn in light + if (!players.isEmpty()) { + players.sort(Comparator.comparing(Entity::getY).reversed()); -@@ -736,6 +742,12 @@ public class Phantom extends Mob implements Enemy { +@@ -752,6 +758,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 75% 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 2e0ef55a0..cae3c6da9 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,24 +5,24 @@ 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 35aec6c3aa2f09f13954fda67902b3c975f566e3..fff139abc9341f3ab2dac568a922235dc5e81b3e 100644 +index 5e448f83d2426fb09785b2899e1bf5950ced6608..4f04eebef9ecd84137ac067c5adcbe977c21a617 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 { - if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(breedOffspring, parent, partner, null, null, 0).isCancelled()) { +@@ -117,8 +117,10 @@ public class VillagerMakeLove extends Behavior { + if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(child, source, target, null, null, 0).isCancelled()) { return Optional.empty(); } -- parent.setAge(6000); -- partner.setAge(6000); +- source.setAge(6000); +- target.setAge(6000); + // Purpur start - Make entity breeding times configurable -+ parent.setAge(level.purpurConfig.villagerBreedingTicks); -+ partner.setAge(level.purpurConfig.villagerBreedingTicks); ++ source.setAge(level.purpurConfig.villagerBreedingTicks); ++ target.setAge(level.purpurConfig.villagerBreedingTicks); + // Purpur end - Make entity breeding times configurable - level.addFreshEntityWithPassengers(breedOffspring, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); + level.addFreshEntityWithPassengers(child, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit end - call EntityBreedEvent - level.broadcastEntityEvent(breedOffspring, EntityEvent.LOVE_HEARTS); + level.broadcastEntityEvent(child, EntityEvent.LOVE_HEARTS); diff --git a/net/minecraft/world/entity/animal/Animal.java b/net/minecraft/world/entity/animal/Animal.java -index 2e7e7c1913f5cbc20ce116c5ae3e185fc83094c0..53d04c412d36015a30ae2680f61651db6acbf2f2 100644 +index 774210ebe09af15f85a919512dfd2f98e7bdee6e..407ffe0e6b5893c3abf0b1ff60fd0a27ec965e0c 100644 --- a/net/minecraft/world/entity/animal/Animal.java +++ b/net/minecraft/world/entity/animal/Animal.java @@ -46,6 +46,7 @@ public abstract class Animal extends AgeableMob { @@ -31,26 +31,26 @@ index 2e7e7c1913f5cbc20ce116c5ae3e185fc83094c0..53d04c412d36015a30ae2680f61651db public @Nullable ItemStack breedItem; // CraftBukkit - Add breedItem variable + public abstract int getPurpurBreedTime(); // Purpur - Make entity breeding times configurable - protected Animal(EntityType type, Level level) { + protected Animal(final EntityType type, final Level level) { super(type, level); @@ -271,8 +272,10 @@ public abstract class Animal extends AgeableMob { player.awardStat(Stats.ANIMALS_BRED); - CriteriaTriggers.BRED_ANIMALS.trigger(player, this, animal, baby); + CriteriaTriggers.BRED_ANIMALS.trigger(player, this, partner, offspring); } // Paper - Call EntityBreedEvent - this.setAge(6000); -- animal.setAge(6000); +- partner.setAge(6000); + // Purpur start - Make entity breeding times configurable + this.setAge(this.getPurpurBreedTime()); -+ animal.setAge(animal.getPurpurBreedTime()); ++ partner.setAge(partner.getPurpurBreedTime()); + // Purpur end - Make entity breeding times configurable this.resetLove(); - animal.resetLove(); + partner.resetLove(); level.broadcastEntityEvent(this, EntityEvent.IN_LOVE_HEARTS); diff --git a/net/minecraft/world/entity/animal/armadillo/Armadillo.java b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -index 1f6b28531127ea2e5b291583f6bb6a236868fbf0..8ae1f8471f35028c1c469dc9cb9eac9b564a5c5e 100644 +index 7c2c71a57b9278aea428e314462cebc08e168b50..83688ac732758ee0613fc2e187838b4607b8edc9 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -107,6 +107,13 @@ public class Armadillo extends Animal { +@@ -115,6 +115,13 @@ public class Armadillo extends Animal { } // Purpur end - Configurable entity base attributes @@ -62,13 +62,13 @@ index 1f6b28531127ea2e5b291583f6bb6a236868fbf0..8ae1f8471f35028c1c469dc9cb9eac9b + // Purpur end - Make entity breeding times configurable + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 3f9e15685ba52a5b9bd4282ba6de6751296975bf..79dfebbd72424d5a3a13d4ba89a555fdf782e703 100644 +index c10b06f8adcd59869d043e48cfe3fdb60051c3db..d4178d85b74a41a0d2808681008f1686578db98d 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 { +@@ -143,6 +143,13 @@ public class Axolotl extends Animal implements Bucketable { } // Purpur end - Configurable entity base attributes @@ -80,13 +80,13 @@ index 3f9e15685ba52a5b9bd4282ba6de6751296975bf..79dfebbd72424d5a3a13d4ba89a555fd + // Purpur end - Make entity breeding times configurable + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final 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 7d7ab4c5092ac085e8cd6d3a432feb683db5a282..473aa29e3075fcab44a14c2bc14d3f222b55cbad 100644 +index f31b67e2bd4b0279f52bd7c2ee0e63c49fbcec17..36c5c555faa9a29ec742c97ea8a6fcf720e6d9a1 100644 --- a/net/minecraft/world/entity/animal/bee/Bee.java +++ b/net/minecraft/world/entity/animal/bee/Bee.java -@@ -485,6 +485,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -488,6 +488,13 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { } // Purpur end - Configurable entity base attributes @@ -101,10 +101,10 @@ index 7d7ab4c5092ac085e8cd6d3a432feb683db5a282..473aa29e3075fcab44a14c2bc14d3f22 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 95e86330e1e973c43e50bd4ac310212b8a057430..842b20242c323572d4c04d3a2d5fe21a54d53ed4 100644 +index aeb8c71596a2393ac1fc67768052ce319fc25d6d..f2e87ebef0d52b2009658aae522398180a15cb92 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 { +@@ -103,6 +103,13 @@ public class Camel extends AbstractHorse { } // Purpur end - Ridables @@ -116,13 +116,13 @@ index 95e86330e1e973c43e50bd4ac310212b8a057430..842b20242c323572d4c04d3a2d5fe21a + // Purpur end - Make entity breeding times configurable + @Override - protected void addAdditionalSaveData(ValueOutput output) { + protected void addAdditionalSaveData(final 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 +index 0392c8a94801a1dee735ff610058fbb2180571fa..ccf7c4630e08d9be54a4634c642a4cd1cd542a82 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 { +@@ -106,6 +106,13 @@ public class Chicken extends Animal { } // Purpur end - Configurable entity base attributes @@ -137,10 +137,10 @@ index 52a0bf792337e2f1cf11e215b033caae21ee774b..029fe4ac952d9f56824de346d98b341b 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 +index 33c0b8f2c43065ea89b3f9c6a519dde27620ed07..7981f60f10c44ab2459933cb15ee961103922364 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 { +@@ -59,6 +59,13 @@ public class Cow extends AbstractCow { } // Purpur end - Configurable entity base attributes @@ -152,10 +152,10 @@ index 5e5b239ebc774ae66f8c35a725ea917993239ef2..400b0a0a99590e3590cb66724acdc5ba + // Purpur end - Make entity breeding times configurable + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/cow/MushroomCow.java b/net/minecraft/world/entity/animal/cow/MushroomCow.java -index 85ad44eb3e64232cf1ea326257078c46288a613a..e2aa027dc7a39fa8a8868a7d153e838113fcf97b 100644 +index d6ec397a14753526dd34ab3a7e69ae4be36c04a6..68a4edef68c9db6b2b0716fc6283e2c7345d4cda 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 { @@ -170,10 +170,10 @@ index 85ad44eb3e64232cf1ea326257078c46288a613a..e2aa027dc7a39fa8a8868a7d153e8381 + // Purpur end - Make entity breeding times configurable + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final 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 +index 1a130fc107315b40b4e34a97beb53f7fe0ced14f..8c3d3f0f24e6f5a9b8aa9bf58f3c8b679896017d 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 { @@ -191,10 +191,10 @@ index b85d967c7c809683e4576be30ed855941c6e68cc..d74a5cc2a43ef41fd00676bbd17fe4df 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 +index 8ba8430f41ce74736f405bfac2ef5de6fffe7d49..dbb586058f38b6c4f81e2f6567b7ae8ebbaff5a2 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 { +@@ -72,6 +72,13 @@ public class Horse extends AbstractHorse { } // Purpur end - Configurable entity base attributes @@ -206,13 +206,13 @@ index 9a97cd588fb2dc0f393b2c8768f4e45066a34850..ba9df659ed019f9e58991059fe99c147 + // Purpur end - Make entity breeding times configurable + @Override - protected void randomizeAttributes(RandomSource random) { + protected void randomizeAttributes(final 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 +index 12abeae3623b49819ab6f852c88ee86ed8c69948..b3c8ccbb3f79043427dcb6f383c4b02d35124689 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 { +@@ -151,6 +151,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { } // Purpur end - Configurable entity base attributes @@ -227,7 +227,7 @@ index b54a535add643390a6164ab3f4a2fdd475d60162..960e48f5ae63d8c86758d2573510bf48 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 +index a866b93312391142b030605e2108fe522d3d8ddd..cf0f3c9d5f8ff348e6fb76db823da4cadce4fc5b 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 { @@ -245,7 +245,7 @@ index f49c8a61ac3883f7ff8ad8193ae9ea9136f54c45..180a807026437e949e3f7c3d59864ea3 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 +index fcc9b9f884aed489ab6016d1de3dfd861781d8e5..a4a878791be034140a50b901d5daf2533d299756 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 { @@ -263,7 +263,7 @@ index d8b7b787b98b86d16578abe1cd19321ad2c176c0..af0e326f5ff8fcb82353bac314310392 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 +index bfae12b0a2b094dcd5953058f4d6245077a04fd7..7c41aecd2699725211babbac0350cb241f31ca41 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 { @@ -281,10 +281,10 @@ index deb0a1eb867daec57a644ce698fe50d79fd8960e..65ac46335d642d5dd8c01623721257a4 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 +index ae429aec9be39d9af7da4671db15a4506da135d9..4be11663154a870a21832ddba05764a897ce90bd 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 { +@@ -78,6 +78,13 @@ public class ZombieHorse extends AbstractHorse { } // Purpur end - Configurable entity base attributes @@ -299,7 +299,7 @@ index 8b8580f8c082a40f958ec61adf32dc7d1485ea68..fa2f18470123f98e336ab5c94bc791e9 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 +index 4ae9c5e823fefbf5bc7efdfbab27ccd166a70b8b..5c235149eca10c216f0f8d6e645a439d7dbcfbc3 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 { @@ -315,9 +315,9 @@ index b7c17aed96dce39cb03780ff251e0e38c3c6adb1..d0aa698ef99cf3b1926018314b4067cc + @Override protected void registerGoals() { - this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); + this.temptGoal = new Cat.CatTemptGoal(this, 0.6, i -> i.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 +index 4bf42db19d0f58338f32af1ab7c802c274a8581c..2accf49e8dd907c8a482e5317d07b28fc5492a1e 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 { @@ -335,10 +335,10 @@ index c9a8dcfd1e46f97dee0393db3205049c0db1cefb..bf281fd4c050b87fd277ab68e812ab2d 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 +index 51b6e7ea13b03e0d64ec70f37ae6394be64bf247..9c049b34c062113a2241fdda2eaae808c0e8e0b1 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 { +@@ -201,6 +201,13 @@ public class Fox extends Animal { } // Purpur end - Configurable entity base attributes @@ -350,10 +350,10 @@ index 6819bcb15ad6c85f41a098a9fdb73ce5a7987d8f..3c2f5e711c013a6f51093e94bc4b5518 + // 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); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); +@@ -1016,8 +1023,10 @@ public class Fox extends Animal { + CriteriaTriggers.BRED_ANIMALS.trigger(loveCause, this.animal, this.partner, offspring); } - this.animal.setAge(6000); @@ -364,12 +364,12 @@ index 6819bcb15ad6c85f41a098a9fdb73ce5a7987d8f..3c2f5e711c013a6f51093e94bc4b5518 + // 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 + this.level.addFreshEntityWithPassengers(offspring, 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 5b4bb6fd100abc569c5da167735a220014bf5d8c..7d6dbdef68b25e774b5a83bb8aeb2535246459aa 100644 +index 977ee6a71e0c52f115a221b09248596db2534739..3d2f06b4e686345632a2493366177e9002cae554 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 { +@@ -141,6 +141,13 @@ public class Frog extends Animal { } // Purpur end - Ridables @@ -381,13 +381,13 @@ index 5b4bb6fd100abc569c5da167735a220014bf5d8c..7d6dbdef68b25e774b5a83bb8aeb2535 + // Purpur end - Make entity breeding times configurable + @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 6e4d611c959960e8d13f79704c176b41ea5c12c4..07ba57ae845024e0f2fa03a68e126ec79bfc6b15 100644 +index 82c27c0e6e9f72eceb5a498af4aad6a7bd766513..da763ba40fdc52d6f6fec97e5e288fbef343ead6 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 { +@@ -117,6 +117,13 @@ public class Goat extends Animal { } // Purpur end - Ridables @@ -399,13 +399,13 @@ index 6e4d611c959960e8d13f79704c176b41ea5c12c4..07ba57ae845024e0f2fa03a68e126ec7 + // Purpur end - Make entity breeding times configurable + @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java -index cd888e070a72ff46d35a4425a0013c617b31e159..30204224ed83f6d3cfd64640b332b23cb74d379f 100644 +index a8e242fcf7a52fb51bd686f257f7e3d5380e38d5..75a32b65da7080391d0c37622db9cb98c5e092b6 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 { +@@ -154,6 +154,13 @@ public class HappyGhast extends Animal { } // Purpur end - Configurable entity base attributes @@ -420,10 +420,10 @@ index cd888e070a72ff46d35a4425a0013c617b31e159..30204224ed83f6d3cfd64640b332b23c protected void ageBoundaryReached() { if (this.isBaby()) { diff --git a/net/minecraft/world/entity/animal/nautilus/Nautilus.java b/net/minecraft/world/entity/animal/nautilus/Nautilus.java -index a32ac3907883f65c2a00173128a4a011fd552932..98199869b70c7c0f2b744ac74961c77d473617ca 100644 +index cc38312d0a59529e7b8f799ffec2f917c9aa0e9b..e89c0638f7b6d1a463a895dbab5994c15aa4add3 100644 --- a/net/minecraft/world/entity/animal/nautilus/Nautilus.java +++ b/net/minecraft/world/entity/animal/nautilus/Nautilus.java -@@ -32,6 +32,13 @@ public class Nautilus extends AbstractNautilus { +@@ -39,6 +39,13 @@ public class Nautilus extends AbstractNautilus { } // Purpur end - Configurable entity base attributes @@ -435,13 +435,13 @@ index a32ac3907883f65c2a00173128a4a011fd552932..98199869b70c7c0f2b744ac74961c77d + // Purpur end - Make entity breeding times configurable + @Override - protected Brain.Provider brainProvider() { - return NautilusAi.brainProvider(); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java b/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java -index 7ef4a15ba2b315a41480484572a6c6898340466b..94383c5020b6631203ddc4e0a58a222729ffe9a2 100644 +index 087e768c35c2c2af191c75648b278154ce5e593c..18bfb321e3728d3fa0596da0b86e4b76ced2178a 100644 --- a/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java +++ b/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java -@@ -54,6 +54,13 @@ public class ZombieNautilus extends AbstractNautilus { +@@ -59,6 +59,13 @@ public class ZombieNautilus extends AbstractNautilus { } // Purpur end - Configurable entity base attributes @@ -456,10 +456,10 @@ index 7ef4a15ba2b315a41480484572a6c6898340466b..94383c5020b6631203ddc4e0a58a2227 return AbstractNautilus.createAttributes().add(Attributes.MOVEMENT_SPEED, 1.1F); } diff --git a/net/minecraft/world/entity/animal/panda/Panda.java b/net/minecraft/world/entity/animal/panda/Panda.java -index d5060fb8e9a711e6230f2c4950521d8b4f5c01d2..163fe697f57459b36885fa3a18f41370347cab38 100644 +index 8844c9279dcdc2d81a63f665d96e9d60f0ab125b..02d5949fb91bbee84fa067dac14d20f53f4a029b 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 { +@@ -146,6 +146,13 @@ public class Panda extends Animal { } // Purpur end - Configurable entity base attributes @@ -471,10 +471,10 @@ index d5060fb8e9a711e6230f2c4950521d8b4f5c01d2..163fe697f57459b36885fa3a18f41370 + // Purpur end - Make entity breeding times configurable + @Override - protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { + protected boolean canDispenserEquipIntoSlot(final 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 +index d3b9a3ac77f03e3b6b580a678283f85a19cb660e..af3d3b90f2e4d433b3b842dbc37d8c507a73dc1f 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 { @@ -490,12 +490,12 @@ index 7480a491533a47882eaf4b36c320adf45ebfb190..0d62046cb33ed750ab27229fe4f0b43c + @Override public @Nullable SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, @Nullable SpawnGroupData groupData diff --git a/net/minecraft/world/entity/animal/pig/Pig.java b/net/minecraft/world/entity/animal/pig/Pig.java -index aeb9e57db2233bff20fa5208a679ac9bcb8d5026..0cb09a058c2d21b10677482792b230464ed9f951 100644 +index 02ed5052bd06844ec6811c4249398ba8ba8c4ea6..514f13a6965b5f53890ddd2e47ea89e0c1a515c1 100644 --- a/net/minecraft/world/entity/animal/pig/Pig.java +++ b/net/minecraft/world/entity/animal/pig/Pig.java -@@ -88,6 +88,13 @@ public class Pig extends Animal implements ItemSteerable { +@@ -93,6 +93,13 @@ public class Pig extends Animal implements ItemSteerable { } // Purpur end - Configurable entity base attributes @@ -510,10 +510,10 @@ index aeb9e57db2233bff20fa5208a679ac9bcb8d5026..0cb09a058c2d21b10677482792b23046 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 +index e50c934e2c9959f843aae2b2dd05a682ca5f59fc..6d4713663c94e91da7d809e65fa205aff2782f38 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 { +@@ -127,6 +127,13 @@ public class PolarBear extends Animal implements NeutralMob { } // Purpur end - Configurable entity base attributes @@ -525,13 +525,13 @@ index 904e4c641f1892220f263528c65f6f81708399cd..97edd950e2142e73ad947590c99d6d55 + // Purpur end - Make entity breeding times configurable + @Override - public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + public @Nullable AgeableMob getBreedOffspring(final ServerLevel level, final 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 +index bf643b9e6929890f061ac2c44b196460234095c4..3aefbdc3e537bc53bba296c7876dee93c95a77ca 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 { +@@ -170,6 +170,13 @@ public class Rabbit extends Animal { } // Purpur end - Configurable entity base attributes @@ -546,7 +546,7 @@ index cfbab57dd0527c5e2f17718f3974059eb881c2ea..061418a25d359574c4ff44327082b08b 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 1d60d35c1330418009f7d1d0b60d263559b68b7f..0e4505474a50d57338c16648cb6049d35455fdc6 100644 +index 8d2b5a60ff267452a9724159db8df956a3fc576c..9cc59891521963204399b7f67d94bb78c7e75fb6 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 { @@ -564,10 +564,10 @@ index 1d60d35c1330418009f7d1d0b60d263559b68b7f..0e4505474a50d57338c16648cb6049d3 protected void registerGoals() { this.eatBlockGoal = new EatBlockGoal(this); diff --git a/net/minecraft/world/entity/animal/sniffer/Sniffer.java b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -index eb6675394ecc5bba67e0f8bb0220ad92ef2b5e4f..7ef3c94f63c8a25d09e69b818ecdf79795803570 100644 +index 7335e46f249b9a88ca0401493636f6e06c0e196d..f169d075cdaa1426c152a8f2682dbaba23de4ccc 100644 --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java -@@ -114,6 +114,13 @@ public class Sniffer extends Animal { +@@ -119,6 +119,13 @@ public class Sniffer extends Animal { } // Purpur end - Configurable entity base attributes @@ -579,10 +579,10 @@ index eb6675394ecc5bba67e0f8bb0220ad92ef2b5e4f..7ef3c94f63c8a25d09e69b818ecdf797 + // Purpur end - Make entity breeding times configurable + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/turtle/Turtle.java b/net/minecraft/world/entity/animal/turtle/Turtle.java -index 8d9a1fe887c39588e43e4ccfc46151a033c8ccb7..fce1b1a22e091a1c05650c72e1ceb83e1a1d1ed1 100644 +index 2dfcf0c9f8eb762d1683d2841a05219c497fddfc..62d9fce83cc44165c5356049a12bf6081c925857 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 { @@ -596,8 +596,8 @@ index 8d9a1fe887c39588e43e4ccfc46151a033c8ccb7..fce1b1a22e091a1c05650c72e1ceb83e + } + // Purpur end - Make entity breeding times configurable + - public void setHomePos(BlockPos homePos) { - this.homePos = homePos; + public void setHomePos(final BlockPos pos) { + this.homePos = pos; } @@ -343,8 +350,10 @@ public class Turtle extends Animal { } @@ -613,10 +613,10 @@ index 8d9a1fe887c39588e43e4ccfc46151a033c8ccb7..fce1b1a22e091a1c05650c72e1ceb83e 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 7bccee8b5dd689bbff18f34d3afac52bfe34aa42..08a1bafa0e45dbdbf8bdc4d5cb654d080590707d 100644 +index 5605c3ecb8ffaace4b21e3bd5bd3d7714b7ea83c..0561b38982c205edc848b1650152491698a80e29 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -216,6 +216,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -213,6 +213,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Configurable entity base attributes @@ -631,10 +631,10 @@ index 7bccee8b5dd689bbff18f34d3afac52bfe34aa42..08a1bafa0e45dbdbf8bdc4d5cb654d08 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 3308e954c8f6deff89c6df0af01f7774e36b0385..ad6515c2dcde0079095c6777f56319e9901850f8 100644 +index f8134a362a2faa49beccb840ea8a899aa4681638..38a17c219bce1a8a8a67b136e0eaf5cf15ec94fd 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 { +@@ -118,6 +118,13 @@ public class Strider extends Animal implements ItemSteerable { } // Purpur end - Configurable entity base attributes @@ -646,13 +646,13 @@ index 3308e954c8f6deff89c6df0af01f7774e36b0385..ad6515c2dcde0079095c6777f56319e9 + // Purpur end - Make entity breeding times configurable + public static boolean checkStriderSpawnRules( - EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { + final EntityType ignoredType, + final LevelAccessor level, diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index baf81e1919e64af9d6da0a49b19e5f34cf962a79..4498fe26dff2cdec8e90d6559a66ebe7859195bb 100644 +index 352139672f2cf1a7d624db4cc5bdef3ab0c9b942..d158807f22a0a08614b2d7054663ef2782a519e3 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -122,6 +122,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -98,6 +98,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { } // Purpur end - Configurable entity base attributes @@ -664,5 +664,5 @@ index baf81e1919e64af9d6da0a49b19e5f34cf962a79..4498fe26dff2cdec8e90d6559a66ebe7 + // Purpur end - Make entity breeding times configurable + @VisibleForTesting - public void setTimeInOverworld(int timeInOverworld) { + public void setTimeInOverworld(final int timeInOverworld) { this.timeInOverworld = timeInOverworld; 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 71% 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 6095f7e7c..57ffe5621 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,25 +6,25 @@ 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 959037a01841de06767522512b92e96be7c72b56..c7be4713a526171d2c4b9642d28f1a246e294ff7 100644 +index 6490da07840f811fdbbd3c5dfefe4494fe7e7494..0fd3cad21382d3078d15f74c5616b0b70ddd8383 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 { +@@ -452,6 +452,7 @@ public class ArmorStand extends LivingEntity { - private org.bukkit.event.entity.EntityDeathEvent brokenByPlayer(ServerLevel level, DamageSource damageSource) { // Paper - ItemStack itemStack = new ItemStack(Items.ARMOR_STAND); + private org.bukkit.event.entity.EntityDeathEvent brokenByPlayer(final ServerLevel level, final DamageSource source) { // Paper + ItemStack result = new ItemStack(Items.ARMOR_STAND); + if (level.purpurConfig.persistentDroppableEntityDisplayNames) // Purpur - Apply display names from item forms of entities to entities and vice versa - itemStack.set(DataComponents.CUSTOM_NAME, this.getCustomName()); - 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 + result.set(DataComponents.CUSTOM_NAME, this.getCustomName()); + this.drops.add(new DefaultDrop(result, stack -> Block.popResource(this.level(), this.blockPosition(), stack))); // CraftBukkit - add to drops // Paper - Restore vanilla drops behavior + return this.brokenByAnything(level, source); // Paper diff --git a/net/minecraft/world/entity/decoration/ItemFrame.java b/net/minecraft/world/entity/decoration/ItemFrame.java -index 5f518a7469953f50135ec53d7c6b77b9acbafed9..d5fec174e6accbf93fd70ed1ba64135fb879d0b2 100644 +index 898f64de427b84cbf9b0e5198098f8e2e9040928..bc12a7a96d8db8eb6ad2bcfccaa69464c1e2170d 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 { - this.removeFramedMap(item); + this.removeFramedMap(itemStack); } else { - if (dropItem) { + if (withFrame) { - this.spawnAtLocation(level, this.getFrameItemStack()); + // Purpur start - Apply display names from item forms of entities to entities and vice versa + final ItemStack itemFrame = this.getFrameItemStack(); @@ -33,15 +33,15 @@ index 5f518a7469953f50135ec53d7c6b77b9acbafed9..d5fec174e6accbf93fd70ed1ba64135f + // Purpur end - Apply display names from item forms of entities to entities and vice versa } - if (!item.isEmpty()) { + if (!itemStack.isEmpty()) { diff --git a/net/minecraft/world/entity/decoration/painting/Painting.java b/net/minecraft/world/entity/decoration/painting/Painting.java -index 682d6e8c400e3343815be83d74dafe7f16477ba2..32b7bfec3d169166fb607b68e4abf484756327ee 100644 +index 7195082470ca411caf9c071e970edddae93cb127..9740bb9ec78cad900b9fa7d8ed6fca6a4016de03 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().get(GameRules.ENTITY_DROPS)) { this.playSound(SoundEvents.PAINTING_BREAK, 1.0F, 1.0F); - if (!(entity instanceof Player player && player.hasInfiniteMaterials())) { + if (!(causedBy instanceof Player player && player.hasInfiniteMaterials())) { - this.spawnAtLocation(level, Items.PAINTING); + // Purpur start - Apply display names from item forms of entities to entities and vice versa + final ItemStack painting = new ItemStack(Items.PAINTING); @@ -52,7 +52,7 @@ index 682d6e8c400e3343815be83d74dafe7f16477ba2..32b7bfec3d169166fb607b68e4abf484 } } diff --git a/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java b/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java -index d17269c9274bd29c761403138bfc56355c800d9c..e5854af03a58dc26a100feac59357862e46bfeed 100644 +index 390f0ec98e9e76239d67dd40d0b183d287bcf1d1..725f2c90fb0b12553441fd91a94ce5c890e1f2b1 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 { @@ -69,9 +69,9 @@ index d17269c9274bd29c761403138bfc56355c800d9c..e5854af03a58dc26a100feac59357862 + // Purpur end - Apply display names from item forms of entities to entities and vice versa } - public static enum Status { + @Override diff --git a/net/minecraft/world/item/ArmorStandItem.java b/net/minecraft/world/item/ArmorStandItem.java -index 962483d6f7225f13f121141882262d36dacad8cb..89d4bc00898fd8f6d40cda87c04c5983e2ea223c 100644 +index 4b4cc75640cc567a74c99ec8653436b2f2a50df6..47d1e104d910addcf8322976061ef38d8c791ea8 100644 --- a/net/minecraft/world/item/ArmorStandItem.java +++ b/net/minecraft/world/item/ArmorStandItem.java @@ -51,6 +51,10 @@ public class ArmorStandItem extends Item { @@ -79,14 +79,14 @@ index 962483d6f7225f13f121141882262d36dacad8cb..89d4bc00898fd8f6d40cda87c04c5983 } // CraftBukkit end + // Purpur start - Apply display names from item forms of entities to entities and vice versa -+ if (!serverLevel.purpurConfig.persistentDroppableEntityDisplayNames) armorStand.setCustomName(null); -+ if (serverLevel.purpurConfig.armorstandSetNameVisible && armorStand.getCustomName() != null) armorStand.setCustomNameVisible(true); ++ if (!serverLevel.purpurConfig.persistentDroppableEntityDisplayNames) entity.setCustomName(null); ++ if (serverLevel.purpurConfig.armorstandSetNameVisible && entity.getCustomName() != null) entity.setCustomNameVisible(true); + // Purpur end - Apply display names from item forms of entities to entities and vice versa - serverLevel.addFreshEntityWithPassengers(armorStand); - level.playSound( - null, armorStand.getX(), armorStand.getY(), armorStand.getZ(), SoundEvents.ARMOR_STAND_PLACE, SoundSource.BLOCKS, 0.75F, 0.8F + serverLevel.addFreshEntityWithPassengers(entity); + level.playSound(null, entity.getX(), entity.getY(), entity.getZ(), SoundEvents.ARMOR_STAND_PLACE, SoundSource.BLOCKS, 0.75F, 0.8F); + entity.gameEvent(GameEvent.ENTITY_PLACE, context.getPlayer()); diff --git a/net/minecraft/world/item/BoatItem.java b/net/minecraft/world/item/BoatItem.java -index a8732056d0086a0932e82f70396a8849bf8d0ee1..2219d5e3e3d1aaa9f729205191a1f549ed662e2e 100644 +index cd7f38ab2553062dcd003bd6f758e4aba77051ea..2b90dec5d564f05f350637a9645d76d4ab7d6126 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,15 +98,15 @@ index a8732056d0086a0932e82f70396a8849bf8d0ee1..2219d5e3e3d1aaa9f729205191a1f549 return InteractionResult.FAIL; } else { diff --git a/net/minecraft/world/item/HangingEntityItem.java b/net/minecraft/world/item/HangingEntityItem.java -index e9403c7c857bfaf09d8f8851b468aa4431c5be54..ecc890ae91475420215b61311ff959d9c522202d 100644 +index 1e30fe428914c8ae4f6caf3cb5a05ced4e183393..c07b334eb05fd277925b684256591d505e5fd46a 100644 --- a/net/minecraft/world/item/HangingEntityItem.java +++ b/net/minecraft/world/item/HangingEntityItem.java @@ -59,7 +59,7 @@ public class HangingEntityItem extends Item { - hangingEntity = new GlowItemFrame(level, blockPos, clickedFace); + entity = new GlowItemFrame(level, blockPos, clickedFace); } -- EntityType.createDefaultStackConfig(level, itemInHand, player).accept(hangingEntity); -+ EntityType.appendDefaultStackConfig(entity -> {if (!level.purpurConfig.persistentDroppableEntityDisplayNames) entity.setCustomName(null);}, level, itemInHand, player).accept(hangingEntity); // Purpur - Apply display names from item forms of entities to entities and vice versa - if (hangingEntity.survives()) { +- EntityType.createDefaultStackConfig(level, itemInHand, player).accept(entity); ++ EntityType.appendDefaultStackConfig(entity1 -> {if (!level.purpurConfig.persistentDroppableEntityDisplayNames) entity1.setCustomName(null);}, level, itemInHand, player).accept(entity); // Purpur - Apply display names from item forms of entities to entities and vice versa + if (entity.survives()) { if (!level.isClientSide()) { // CraftBukkit start - fire HangingPlaceEvent 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 50% 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 5376bc221..bb5b338ec 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,7 +8,7 @@ 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 23c9363f03a74a2ddd15ffa1da4e0910dcfe2eb4..83aac5dcc51fbc2cc9ee45c155fb2b5b67293a96 100644 +index c49f72d3554c5cf49cbbc57897288da876b4e5f5..9318b27ca960ee00774892b3fd244b0fca1f6e35 100644 --- a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java +++ b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java @@ -31,6 +31,7 @@ public class HarvestFarmland extends Behavior { @@ -20,48 +20,48 @@ index 23c9363f03a74a2ddd15ffa1da4e0910dcfe2eb4..83aac5dcc51fbc2cc9ee45c155fb2b5b public HarvestFarmland() { super( @@ -49,9 +50,10 @@ public class HarvestFarmland extends Behavior { - protected boolean checkExtraStartConditions(ServerLevel level, Villager owner) { + protected boolean checkExtraStartConditions(final ServerLevel level, final Villager body) { 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 +- } else if (!body.getVillagerData().profession().is(VillagerProfession.FARMER)) { ++ } else if (!body.getVillagerData().profession().is(VillagerProfession.FARMER) && !(level.purpurConfig.villagerClericsFarmWarts && body.getVillagerData().profession().is(VillagerProfession.CLERIC))) { // Purpur - Option for Villager Clerics to farm Nether Wart return false; } else { -+ if (!this.clericWartFarmer && owner.getVillagerData().profession().is(VillagerProfession.CLERIC)) this.clericWartFarmer = true; // Purpur - Option for Villager Clerics to farm Nether Wart - BlockPos.MutableBlockPos mutableBlockPos = owner.blockPosition().mutable(); ++ if (!this.clericWartFarmer && body.getVillagerData().profession().is(VillagerProfession.CLERIC)) this.clericWartFarmer = true; // Purpur - Option for Villager Clerics to farm Nether Wart + BlockPos.MutableBlockPos mutPos = body.blockPosition().mutable(); this.validFarmlandAroundVillager.clear(); @@ -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(); -+ if (this.clericWartFarmer) return block == net.minecraft.world.level.block.Blocks.NETHER_WART && blockState.getValue(net.minecraft.world.level.block.NetherWartBlock.AGE) == 3 || blockState.isAir() && block1 == net.minecraft.world.level.block.Blocks.SOUL_SAND; // Purpur - Option for Villager Clerics to farm Nether Wart - return block instanceof CropBlock && ((CropBlock)block).isMaxAge(blockState) || blockState.isAir() && block1 instanceof FarmBlock; + BlockState state = level.getBlockState(blockPos); + Block block = state.getBlock(); + Block blockBelow = level.getBlockState(blockPos.below()).getBlock(); ++ if (this.clericWartFarmer) return block == net.minecraft.world.level.block.Blocks.NETHER_WART && state.getValue(net.minecraft.world.level.block.NetherWartBlock.AGE) == 3 || state.isAir() && block == net.minecraft.world.level.block.Blocks.SOUL_SAND; // Purpur - Option for Villager Clerics to farm Nether Wart + return block instanceof CropBlock && ((CropBlock)block).isMaxAge(state) || state.isAir() && blockBelow instanceof FarmlandBlock; } @@ -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(); + Block blockBelow = level.getBlockState(this.aboveFarmlandPos.below()).getBlock(); - if (block instanceof CropBlock && ((CropBlock)block).isMaxAge(blockState)) { + if (block instanceof CropBlock && ((CropBlock)block).isMaxAge(blockState) && !this.clericWartFarmer || this.clericWartFarmer && block == net.minecraft.world.level.block.Blocks.NETHER_WART && blockState.getValue(net.minecraft.world.level.block.NetherWartBlock.AGE) == 3) { // Purpur - Option for Villager Clerics to farm Nether Wart - if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(owner, this.aboveFarmlandPos, blockState.getFluidState().createLegacyBlock())) { // CraftBukkit // Paper - fix wrong block state - level.destroyBlock(this.aboveFarmlandPos, true, owner); + if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(body, this.aboveFarmlandPos, blockState.getFluidState().createLegacyBlock())) { // CraftBukkit // Paper - fix wrong block state + level.destroyBlock(this.aboveFarmlandPos, true, body); } // CraftBukkit } -- if (blockState.isAir() && block1 instanceof FarmBlock && owner.hasFarmSeeds()) { -+ if (blockState.isAir() && block1 instanceof FarmBlock && !this.clericWartFarmer || this.clericWartFarmer && block1 == net.minecraft.world.level.block.Blocks.SOUL_SAND && owner.hasFarmSeeds()) { // Purpur - Option for Villager Clerics to farm Nether Wart - SimpleContainer inventory = owner.getInventory(); +- if (blockState.isAir() && blockBelow instanceof FarmlandBlock && body.hasFarmSeeds()) { ++ if (blockState.isAir() && blockBelow instanceof FarmlandBlock && !this.clericWartFarmer || this.clericWartFarmer && blockBelow == net.minecraft.world.level.block.Blocks.SOUL_SAND && body.hasFarmSeeds()) { // Purpur - Option for Villager Clerics to farm Nether Wart + SimpleContainer inventory = body.getInventory(); for (int i = 0; i < inventory.getContainerSize(); i++) { - ItemStack item = inventory.getItem(i); - boolean flag = false; -- if (!item.isEmpty() && item.is(ItemTags.VILLAGER_PLANTABLE_SEEDS) && item.getItem() instanceof BlockItem blockItem) { -+ if (!item.isEmpty() && (item.is(ItemTags.VILLAGER_PLANTABLE_SEEDS) || this.clericWartFarmer && item.getItem() == net.minecraft.world.item.Items.NETHER_WART) && item.getItem() instanceof BlockItem blockItem) { // Purpur - Option for Villager Clerics to farm Nether Wart - BlockState blockState1 = blockItem.getBlock().defaultBlockState(); - if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(owner, this.aboveFarmlandPos, blockState1)) { // CraftBukkit - level.setBlockAndUpdate(this.aboveFarmlandPos, blockState1); + ItemStack itemStack = inventory.getItem(i); + boolean ok = false; +- if (!itemStack.isEmpty() && itemStack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS) && itemStack.getItem() instanceof BlockItem blockItem) { ++ if (!itemStack.isEmpty() && (itemStack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS) || this.clericWartFarmer && itemStack.getItem() == net.minecraft.world.item.Items.NETHER_WART) && itemStack.getItem() instanceof BlockItem blockItem) { // Purpur - Option for Villager Clerics to farm Nether Wart + BlockState place = blockItem.getBlock().defaultBlockState(); + if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(body, this.aboveFarmlandPos, place)) { // CraftBukkit + level.setBlockAndUpdate(this.aboveFarmlandPos, place); @@ -134,7 +137,7 @@ public class HarvestFarmland extends Behavior { this.aboveFarmlandPos.getX(), this.aboveFarmlandPos.getY(), @@ -72,29 +72,29 @@ index 23c9363f03a74a2ddd15ffa1da4e0910dcfe2eb4..83aac5dcc51fbc2cc9ee45c155fb2b5b 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 256fb863683d66235db4fb2b65fb1495672a67bf..81145178ba1ef75c441a09ab5f376d0528299ad3 100644 +index 1d405a77c4cf70bd818a4f59163e5b319808d5f3..6a7b51acfc2cd157ce81c3a92d2633375cb1a6a7 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 { - throwHalfStack(owner, ImmutableSet.of(Items.WHEAT), villager); + throwHalfStack(body, ImmutableSet.of(Items.WHEAT), target); } + // Purpur start - Option for Villager Clerics to farm Nether Wart -+ if (level.purpurConfig.villagerClericsFarmWarts && level.purpurConfig.villagerClericFarmersThrowWarts && owner.getVillagerData().profession().is(VillagerProfession.CLERIC) && owner.getInventory().countItem(Items.NETHER_WART) > Items.NETHER_WART.getDefaultMaxStackSize() / 2) { -+ throwHalfStack(owner, ImmutableSet.of(Items.NETHER_WART), villager); ++ if (level.purpurConfig.villagerClericsFarmWarts && level.purpurConfig.villagerClericFarmersThrowWarts && body.getVillagerData().profession().is(VillagerProfession.CLERIC) && body.getInventory().countItem(Items.NETHER_WART) > Items.NETHER_WART.getDefaultMaxStackSize() / 2) { ++ throwHalfStack(body, ImmutableSet.of(Items.NETHER_WART), target); + } + // Purpur end - Option for Villager Clerics to farm Nether Wart + - if (!this.trades.isEmpty() && owner.getInventory().hasAnyOf(this.trades)) { - throwHalfStack(owner, this.trades, villager); + if (!this.trades.isEmpty() && body.getInventory().hasAnyOf(this.trades)) { + throwHalfStack(body, this.trades, target); } diff --git a/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java b/net/minecraft/world/entity/ai/behavior/VillagerGoalPackages.java -index bb3ac5297860c8af6e213d10fdf5144086e9474b..0e72601781235119d62fe74420153b98edb5ce23 100644 +index a5d1b66b07002545381dfc449a2eda26546b904c..0e5039e07c3df288e4b1377225ac52cc96675b66 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 { +@@ -74,8 +74,13 @@ public class VillagerGoalPackages { public static ImmutableList>> getWorkPackage( - Holder profession, float speedModifier + final Holder profession, final float speedModifier ) { + // Purpur start - Option for Villager Clerics to farm Nether Wart + return getWorkPackage(profession, speedModifier, false); @@ -108,64 +108,64 @@ index bb3ac5297860c8af6e213d10fdf5144086e9474b..0e72601781235119d62fe74420153b98 } 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 39a9e9a6f6dfddbf47a7f96150ef832efe61f89e..c268817b170bd54898bb5f8c2e2e12c0faa7eb1e 100644 +index ec12508c112b1e7748a5d197b73a0d540bed10fc..f2daabad51d565cae11e8bfce8b1bf40a7e56a78 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 { @Override - protected void doTick(ServerLevel level, Villager entity) { + protected void doTick(final ServerLevel level, final Villager body) { + // Purpur start - Option for Villager Clerics to farm Nether Wart - make sure clerics don't wander to soul sand when the option is off -+ Brain brain = entity.getBrain(); -+ if (!level.purpurConfig.villagerClericsFarmWarts && entity.getVillagerData().profession().is(net.minecraft.world.entity.npc.villager.VillagerProfession.CLERIC)) { ++ Brain brain = body.getBrain(); ++ if (!level.purpurConfig.villagerClericsFarmWarts && body.getVillagerData().profession().is(net.minecraft.world.entity.npc.villager.VillagerProfession.CLERIC)) { + brain.eraseMemory(MemoryModuleType.SECONDARY_JOB_SITE); + return; + } + // Purpur end - Option for Villager Clerics to farm Nether Wart - ResourceKey resourceKey = level.dimension(); - BlockPos blockPos = entity.blockPosition(); - List list = Lists.newArrayList(); + ResourceKey dimensionType = level.dimension(); + BlockPos center = body.blockPosition(); + List jobSites = Lists.newArrayList(); @@ -38,7 +45,7 @@ public class SecondaryPoiSensor extends Sensor { } } -- Brain brain = entity.getBrain(); -+ //Brain brain = entity.getBrain(); // Purpur - Option for Villager Clerics to farm Nether Wart - moved up - if (!list.isEmpty()) { - brain.setMemory(MemoryModuleType.SECONDARY_JOB_SITE, list); +- Brain brain = body.getBrain(); ++ //Brain brain = body.getBrain(); // Purpur - Option for Villager Clerics to farm Nether Wart - moved up + if (!jobSites.isEmpty()) { + brain.setMemory(MemoryModuleType.SECONDARY_JOB_SITE, jobSites); } else { diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java -index 02836bd2e8fda563877d3014ab839734aebc7457..ed6642023fccbc8f825d7c5c206d73ffd666f0f9 100644 +index 6105aa39baf888dd625f4d345822a4058bf83ef4..fffc71d2f0cd0d4c4f5d8fad38130208cdbe5e67 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(EnvironmentAttributes.VILLAGER_ACTIVITY); - villagerBrain.addActivityWithConditions( - Activity.WORK, -- VillagerGoalPackages.getWorkPackage(holder, 0.5F), -+ VillagerGoalPackages.getWorkPackage(holder, 0.5F, this.level().purpurConfig.villagerClericsFarmWarts), // Purpur - Option for Villager Clerics to farm Nether Wart - ImmutableSet.of(Pair.of(MemoryModuleType.JOB_SITE, MemoryStatus.VALUE_PRESENT)) - ); - } -@@ -956,7 +956,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -148,7 +148,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re + activities.add( + ActivityData.create( + Activity.WORK, +- VillagerGoalPackages.getWorkPackage(profession, 0.5F), ++ VillagerGoalPackages.getWorkPackage(profession, 0.5F, body.level().purpurConfig.villagerClericsFarmWarts), // Purpur - Option for Villager Clerics to farm Nether Wart + ImmutableSet.of(Pair.of(MemoryModuleType.JOB_SITE, MemoryStatus.VALUE_PRESENT)) + ) + ); +@@ -945,7 +945,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } public boolean hasFarmSeeds() { -- return this.getInventory().hasAnyMatching(stack -> stack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS)); -+ return this.getInventory().hasAnyMatching(stack -> this.level().purpurConfig.villagerClericsFarmWarts && this.getVillagerData().profession().is(VillagerProfession.CLERIC) ? stack.is(Items.NETHER_WART) : stack.is(ItemTags.VILLAGER_PLANTABLE_SEEDS)); // Purpur - Option for Villager Clerics to farm Nether Wart +- return this.getInventory().hasAnyMatching(item -> item.is(ItemTags.VILLAGER_PLANTABLE_SEEDS)); ++ return this.getInventory().hasAnyMatching(item -> this.level().purpurConfig.villagerClericsFarmWarts && this.getVillagerData().profession().is(VillagerProfession.CLERIC) ? item.is(Items.NETHER_WART) : item.is(ItemTags.VILLAGER_PLANTABLE_SEEDS)); } @Override diff --git a/net/minecraft/world/entity/npc/villager/VillagerProfession.java b/net/minecraft/world/entity/npc/villager/VillagerProfession.java -index 0acfa8f9d2eab00cf0d8b4bc65c3af52046272bd..8f2edbe693a793d31295d035bc01e4c2b7742b4e 100644 +index 1d779d7a51437581fa3d8da38449916362b25ce9..9d71db9db42e38338afe10b24699dae9cc90fcfa 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); - register(registry, CARTOGRAPHER, PoiTypes.CARTOGRAPHER, SoundEvents.VILLAGER_WORK_CARTOGRAPHER); -- register(registry, CLERIC, PoiTypes.CLERIC, SoundEvents.VILLAGER_WORK_CLERIC); -+ register(registry, CLERIC, PoiTypes.CLERIC, ImmutableSet.of(Items.NETHER_WART), ImmutableSet.of(Blocks.SOUL_SAND), SoundEvents.VILLAGER_WORK_CLERIC); // Purpur - Option for Villager Clerics to farm Nether Wart - register( +@@ -165,6 +165,8 @@ public record VillagerProfession( registry, - FARMER, + CLERIC, + PoiTypes.CLERIC, ++ ImmutableSet.of(Items.NETHER_WART), // Purpur - Option for Villager Clerics to farm Nether Wart ++ ImmutableSet.of(Blocks.SOUL_SAND), // Purpur - Option for Villager Clerics to farm Nether Wart + SoundEvents.VILLAGER_WORK_CLERIC, + Int2ObjectMap.ofEntries( + Int2ObjectMap.entry(1, TradeSets.CLERIC_LEVEL_1), 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 66% 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 cda24caa1..88b78ea42 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,23 +5,23 @@ 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 dc71ae07f2c7a7038e96caf8618dddc5d4932271..717e42ed210408c30f3fa2b6d786a2a51abfecc6 100644 +index 2e7e5c4c42bcdb6135a088ffe0a7a8f4558dc12c..7146381e06ed1b946ce43dca293f52da05b46314 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1973,7 +1973,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1950,7 +1950,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 (this.dead && killer instanceof WitherBoss) { // Paper - 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)) { + BlockPos pos = this.blockPosition(); + BlockState state = Blocks.WITHER_ROSE.defaultBlockState(); + if (this.level().getBlockState(pos).isAir() && state.canSurvive(this.level(), pos)) { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 94e7307c0d15fdef7f7dcb28473cb76661600b0e..01667b8d45653aa6b0f77d65599f7dc68979f9f1 100644 +index be578b5d4430e934342d3e80b70a1ea56b020a5c..43f1a9287d2a3010d35a88d58df3e950f1011eec 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 +@@ -560,7 +560,7 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs && this.canPickUpLoot() && this.isAlive() && !this.dead @@ -29,22 +29,22 @@ index 94e7307c0d15fdef7f7dcb28473cb76661600b0e..01667b8d45653aa6b0f77d65599f7dc6 + && 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() + for (ItemEntity entity : this.level() diff --git a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java -index 83aac5dcc51fbc2cc9ee45c155fb2b5b67293a96..c68399986583a215da156b9057a61f22cbf6143d 100644 +index 9318b27ca960ee00774892b3fd244b0fca1f6e35..573eb81c0328b9b6bd9256d67e533b6cc73f738f 100644 --- a/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java +++ b/net/minecraft/world/entity/ai/behavior/HarvestFarmland.java @@ -48,7 +48,7 @@ public class HarvestFarmland extends Behavior { @Override - protected boolean checkExtraStartConditions(ServerLevel level, Villager owner) { + protected boolean checkExtraStartConditions(final ServerLevel level, final Villager body) { - 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 + } else if (!body.getVillagerData().profession().is(VillagerProfession.FARMER) && !(level.purpurConfig.villagerClericsFarmWarts && body.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 272335ec91615e2619ce95f47dbf228d180239c3..23ba4af0b6785057cfd2a996aebcbcf89697c12f 100644 +index e33598c3ea748f81c7efcaa06d9d0597624a852b..80a42d030969e264a93108ca3f2c296dd295ad1d 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 { @@ -57,32 +57,32 @@ index 272335ec91615e2619ce95f47dbf228d180239c3..23ba4af0b6785057cfd2a996aebcbcf8 && !this.isOpen(); } diff --git a/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java -index 087861886eeb55324ffe54bda78e19f83bf33e72..0f0311eb836b8da39651ece499fe4bda44bce178 100644 +index 0f52b048c33f3dbafd5734dc724bcd74db43884a..a40284d4f3812a169e94593ec14192e079133bd4 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 + BlockPos pos = this.mob.blockPosition(); + final BlockState blockState = this.level.getBlockState(pos); // 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().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); +- if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, pos, 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, pos, 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(pos, false); } @@ -72,7 +72,7 @@ public class EatBlockGoal extends Goal { } 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().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); + BlockPos below = pos.below(); + if (this.level.getBlockState(below).is(Blocks.GRASS_BLOCK)) { +- if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.mob, below, 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, below, 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, below, Block.getId(Blocks.GRASS_BLOCK.defaultBlockState())); + this.level.setBlock(below, 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 50cc4c462640a9d40abef6245439d71e8c593ae6..83be00350765db043b6bf32e7814d9c7119eacc5 100644 +index ca91cadd8d52c09a735e6447664bed4753f3cdd3..3277777cb8672d29a0d49ef03f9cf35cc5df3838 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 { +@@ -34,7 +34,7 @@ public class RemoveBlockGoal extends MoveToBlockGoal { @Override public boolean canUse() { @@ -92,23 +92,23 @@ index 50cc4c462640a9d40abef6245439d71e8c593ae6..83be00350765db043b6bf32e7814d9c7 } else if (this.nextStartTick > 0) { this.nextStartTick--; diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java -index 3c2f5e711c013a6f51093e94bc4b5518263607a2..a0ed30e8ccd41729de8e0ff977a61fa607386640 100644 +index 9c049b34c062113a2241fdda2eaae808c0e8e0b1..f781d02d10317bf7cf9b5fe50706bbefb62820d3 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 { +@@ -1082,7 +1082,7 @@ public class Fox extends Animal { } protected void onReachedTarget() { - 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); + BlockState state = Fox.this.level().getBlockState(this.blockPos); + if (state.is(Blocks.SWEET_BERRY_BUSH)) { + this.pickSweetBerries(state); diff --git a/net/minecraft/world/entity/animal/golem/SnowGolem.java b/net/minecraft/world/entity/animal/golem/SnowGolem.java -index aa53ee0586a85a64e8c6471735e29b2694f61b9d..fa941ba3151da7b965678be7e4c6a4194863cd0a 100644 +index bd594838ae25f16e6e16335e06c4d981c5ecdc2a..7091f5bc2ecb9d4b86162fe364447df65d8e9348 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 +@@ -135,7 +135,7 @@ public class SnowGolem extends AbstractGolem implements RangedAttackMob, Shearab this.hurtServer(serverLevel, this.damageSources().onFire().knownCause(org.bukkit.event.entity.EntityDamageEvent.DamageCause.MELTING), 1.0F); // CraftBukkit } @@ -118,10 +118,10 @@ index aa53ee0586a85a64e8c6471735e29b2694f61b9d..fa941ba3151da7b965678be7e4c6a419 } diff --git a/net/minecraft/world/entity/animal/rabbit/Rabbit.java b/net/minecraft/world/entity/animal/rabbit/Rabbit.java -index 061418a25d359574c4ff44327082b08b4094ee1c..66fda64006c0a70ab4502f088637bb6871c3bb37 100644 +index 3aefbdc3e537bc53bba296c7876dee93c95a77ca..4d79ce89c21ba0b973bbda01bf53665e3b7a1902 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 { +@@ -696,7 +696,7 @@ public class Rabbit extends Animal { @Override public boolean canUse() { if (this.nextStartTick <= 0) { @@ -131,36 +131,36 @@ index 061418a25d359574c4ff44327082b08b4094ee1c..66fda64006c0a70ab4502f088637bb68 } diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 9a8da85462dd74eed8c158ea3343354a255d320d..ecfd9f7b56aee3b701821339f41b60bd7bef0e97 100644 +index 7e39604a02561880a10d4bcebcd76135f9c1a122..51ca6a3fa75f3aef715d786a21327452390dde94 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -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().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 +@@ -541,7 +541,7 @@ public class EnderDragon extends Mob implements Enemy { + BlockPos blockPos = new BlockPos(x, y, z); + BlockState state = level.getBlockState(blockPos); + if (!state.isAir() && !state.is(BlockTags.DRAGON_TRANSPARENT)) { +- if (level.getGameRules().get(GameRules.MOB_GRIEFING) && !state.is(BlockTags.DRAGON_IMMUNE)) { ++ if (level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.enderDragonMobGriefingOverride) && !state.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; + destroyedBlock = true; diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index 1f777f69e37291c9367969f52aef11fe270541b7..df608186f3e9ab5b56a209be67cd02717d3f9734 100644 +index 141b64eb1f320d2bc773e99826fc97cc10f39bcd..3e934aee6f651843d861cc87cc1f01a87742edf3 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -494,7 +494,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -493,7 +493,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { if (this.destroyBlocksTick > 0) { this.destroyBlocksTick--; - 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()); + boolean destroyed = false; + int width = Mth.floor(this.getBbWidth() / 2.0F + 1.0F); + int height = Mth.floor(this.getBbHeight()); diff --git a/net/minecraft/world/entity/monster/EnderMan.java b/net/minecraft/world/entity/monster/EnderMan.java -index 29570047bfc78a8993b0bbd7168cb4fe318a6be6..79a1d8f67a22a8fa4a6c3b657e44bb9503687c27 100644 +index 30450300bdf9e4b5ef4293e9c371484ba6aabebc..46a60e17837411e46a543d6f0254d7280d30a94c 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -509,7 +509,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -505,7 +505,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 @@ -169,7 +169,7 @@ index 29570047bfc78a8993b0bbd7168cb4fe318a6be6..79a1d8f67a22a8fa4a6c3b657e44bb95 && this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0; } -@@ -658,7 +658,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -649,7 +649,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 @@ -179,20 +179,20 @@ index 29570047bfc78a8993b0bbd7168cb4fe318a6be6..79a1d8f67a22a8fa4a6c3b657e44bb95 } diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index 86c55955ff6c0a411cde34999c7bd6ad07be5d4e..7c69423eee05992b9c70321d528cc9d73b3e63ea 100644 +index 878fee0c45a34c334d30239711231f2ef990e926..e0ffded3500b221d5c65cff9377120e8c6c7d8c6 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -179,7 +179,7 @@ public class Ravager extends Raider { - this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1, baseValue, d)); +@@ -177,7 +177,7 @@ public class Ravager extends Raider { + this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1, baseValue, maxSpeed)); } - 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); + boolean destroyedBlock = false; + AABB bb = this.getBoundingBox().inflate(0.2); diff --git a/net/minecraft/world/entity/monster/Silverfish.java b/net/minecraft/world/entity/monster/Silverfish.java -index 6f708c041679c0926282241c637162b141d06f64..7f94e9749283f1e51b449b0ef84ca08e246a1cc9 100644 +index 355475b12c6f3fcc9fe88ca63ab88cabac9d6fb1..e5a0a199685366f082904eb5e7550f0160f9c706 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java @@ -168,7 +168,7 @@ public class Silverfish extends Monster { @@ -202,90 +202,90 @@ index 6f708c041679c0926282241c637162b141d06f64..7f94e9749283f1e51b449b0ef84ca08e - 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); + BlockPos pos = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5, this.mob.getZ()).relative(this.selectedDirection); + BlockState blockState = this.mob.level().getBlockState(pos); @@ -245,7 +245,7 @@ public class Silverfish extends Monster { Block block = blockState.getBlock(); if (block instanceof InfestedBlock) { // CraftBukkit start -- 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 +- BlockState afterState = getServerLevel(level).getGameRules().get(GameRules.MOB_GRIEFING) ? blockState.getFluidState().createLegacyBlock() : ((InfestedBlock) block).hostStateByInfested(level.getBlockState(testPos)); // 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(testPos)); // Paper - fix wrong block state // Purpur - Add mobGriefing override to everything affected + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, testPos, 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 +index 4de0c340b1fb8baa9ed379ea010ca6d314530268..d091a12ed1df31f945a04f50af1cbb89a16ca0cd 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 { +@@ -334,7 +334,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 + ServerLevel level = getServerLevel(Evoker.this.level()); +- if (!level.getGameRules().get(GameRules.MOB_GRIEFING)) { ++ if (!level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.evokerMobGriefingOverride)) { // Purpur - Add mobGriefing override to everything affected return false; } else { - List nearbyEntities = serverLevel.getNearbyEntities( + List entities = level.getNearbyEntities( diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index 98241af88cc961470e07df47d128d8912338bd44..4fccd122a227e5fe80965c37afaa031c4a673978 100644 +index 0d0a86b5c485a60d0e85b3acc6f0cc01ce6c0bfe..356fc7507b58cc38cdf5ee11618ad3551fb3c6a2 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -448,7 +448,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -416,7 +416,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override - public boolean wantsToPickUp(ServerLevel level, ItemStack stack) { -- 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 + public boolean wantsToPickUp(final ServerLevel level, final ItemStack itemStack) { +- return level.getGameRules().get(GameRules.MOB_GRIEFING) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, itemStack); ++ return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.piglinMobGriefingOverride) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, itemStack); // Purpur - Add mobGriefing override to everything affected } - protected boolean canReplaceCurrentItem(ItemStack candidate) { + protected boolean canReplaceCurrentItem(final ItemStack newItemStack) { diff --git a/net/minecraft/world/entity/projectile/Projectile.java b/net/minecraft/world/entity/projectile/Projectile.java -index 6298e6de25f1dd9ff880a9ad2882dc7ccb2f100c..36479ed544ce812113c9a9c982a74a950cb9b26a 100644 +index 289fe996f5663f82c488d1c861389b83da787ff9..34df1e7ec42ecfb9ec4ef87e9f6a619298668d35 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 { +@@ -473,7 +473,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { @Override - public boolean mayInteract(ServerLevel level, BlockPos pos) { + public boolean mayInteract(final ServerLevel level, final 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) { + public boolean mayBreak(final 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 +index 711b97aa9e49b7edee34c91d77b1005be4fa96bd..bcda871c7db7a13f85e04e8fb91be13da15992bc 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) { + public LargeFireball(final EntityType type, final Level level) { super(type, level); - 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); + public LargeFireball(final Level level, final LivingEntity mob, final Vec3 direction, final int explosionPower) { + super(EntityType.FIREBALL, mob, direction, level); this.explosionPower = explosionPower; - 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); + protected void onHit(final HitResult hitResult) { + super.onHit(hitResult); if (this.level() instanceof ServerLevel serverLevel) { -- // 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 +- // boolean grief = serverLevel.getGameRules().get(GameRules.MOB_GRIEFING); // CraftBukkit - baked into fields (see constructor) ++ // boolean grief = 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/hurtingprojectile/SmallFireball.java b/net/minecraft/world/entity/projectile/hurtingprojectile/SmallFireball.java -index 043ddaa0e8718f50881d16892eab188aed70f67f..a10617c29098f28c5b5586a43071a47ef17e5744 100644 +index 55000ce5010321323bf79007ef8de637a492657f..b7f5f434b8b3abbaab7f65fc591ddf18308b5a2f 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); + super(EntityType.SMALL_FIREBALL, mob, direction, level); // CraftBukkit start if (this.getOwner() != null && this.getOwner() instanceof Mob) { - this.isIncendiary = (level instanceof ServerLevel serverLevel) && serverLevel.getGameRules().get(GameRules.MOB_GRIEFING); @@ -294,10 +294,10 @@ index 043ddaa0e8718f50881d16892eab188aed70f67f..a10617c29098f28c5b5586a43071a47e // CraftBukkit end } diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java -index ab94809c5cedc8ea7db6db45394bc9c65516da63..40984af1fc912a7b0367c530c68ee00d51173b64 100644 +index d09855134cef0651258db34ea29c443388fd5183..d0a9088a18e6717209f037ae48ce54db13702234 100644 --- a/net/minecraft/world/entity/raid/Raider.java +++ b/net/minecraft/world/entity/raid/Raider.java -@@ -396,7 +396,7 @@ public abstract class Raider extends PatrollingMonster { +@@ -399,7 +399,7 @@ public abstract class Raider extends PatrollingMonster { } private boolean cannotPickUpBanner() { @@ -307,49 +307,49 @@ index ab94809c5cedc8ea7db6db45394bc9c65516da63..40984af1fc912a7b0367c530c68ee00d return true; } else if (this.mob.getCurrentRaid().isOver()) { diff --git a/net/minecraft/world/level/block/CropBlock.java b/net/minecraft/world/level/block/CropBlock.java -index 3983a5fa08f748ed26caa1d16e194676baa8028e..372559399ce8a4ce551f4403975879e365e1ad75 100644 +index a47e5e38ef5c13da3827174121c1ec4b9ffbbce2..0dfb632b339b24564744b1f5c0d52d7fed66d265 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) { +@@ -177,7 +177,7 @@ public class CropBlock extends VegetationBlock implements BonemealableBlock { + final boolean isPrecise + ) { 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().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 75b38812b538e0938bbbde62427fa9fd23d372a1..7ec5ef85dbface0ff194a7112d0c4b8e25cab6fe 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 { +diff --git a/net/minecraft/world/level/block/FarmlandBlock.java b/net/minecraft/world/level/block/FarmlandBlock.java +index 8bc58baa1542443235b57633d1e563f3487a2421..b51bb36da00bdfd25724579c0a4fb572abeefd81 100644 +--- a/net/minecraft/world/level/block/FarmlandBlock.java ++++ b/net/minecraft/world/level/block/FarmlandBlock.java +@@ -113,7 +113,7 @@ public class FarmlandBlock 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 + && (serverLevel.purpurConfig.farmlandTrampleHeight >= 0D ? fallDistance >= serverLevel.purpurConfig.farmlandTrampleHeight : level.getRandom().nextFloat() < fallDistance - 0.5) // Purpur - Configurable farmland trample height && entity instanceof LivingEntity - && (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; + // 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 f3a9117bd066861a1b447e8a13108ad212cc499f..b0165c839b145e82af38fe8f61bbd0161015d867 100644 +index 648262547aadff8e0615a93a9834ca654e581b3a..022daf760a649720c46e6e31591f2c1ad8a8f3ea 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 { +@@ -103,7 +103,7 @@ public class PowderSnowBlock extends Block implements BucketPickup { // CraftBukkit - move down - && entity1.mayInteract(serverLevel, blockPos)) { + && e.mayInteract(serverLevel, position)) { // CraftBukkit start -- 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 +- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(e, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().get(GameRules.MOB_GRIEFING) || e instanceof Player))) { ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(e, pos, Blocks.AIR.defaultBlockState(), !(serverLevel.getGameRules().get(GameRules.MOB_GRIEFING, serverLevel.purpurConfig.powderSnowMobGriefingOverride) || e 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 912c36c2e814cf763b4fa01d149979be9ef460de..733c6ed0ce655d9ff9e03fc1a87131aa8e72eca0 100644 +index 9293faf988be7013dbeddc9f98beb69a2dac9928..4f1e08c0e3f8ea89a55e02e8f0197fe4336ae0e2 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 { +@@ -221,7 +221,7 @@ public class TurtleEggBlock extends Block { // Purpur end - Option to disable turtle egg trampling with feather falling if (entity instanceof Player) return true; @@ -359,10 +359,10 @@ index 912c36c2e814cf763b4fa01d149979be9ef460de..733c6ed0ce655d9ff9e03fc1a87131aa } } diff --git a/net/minecraft/world/level/gamerules/GameRules.java b/net/minecraft/world/level/gamerules/GameRules.java -index e71a9ffdb6c081baa79113f34b179671c179152d..746bc21fc09644366caa8bfd309f596c3cac59ec 100644 +index 0d0a4008a84defbf1ea962b4e2f73776878956ec..e2fc5dc10c6ab84cb28e2adff2f87c24c8801309 100644 --- a/net/minecraft/world/level/gamerules/GameRules.java +++ b/net/minecraft/world/level/gamerules/GameRules.java -@@ -113,6 +113,13 @@ public class GameRules { +@@ -128,6 +128,13 @@ public class GameRules { return this.rules.keySet().stream(); } @@ -373,6 +373,6 @@ index e71a9ffdb6c081baa79113f34b179671c179152d..746bc21fc09644366caa8bfd309f596c + return (Boolean) this.get(rule); + } + - public T get(GameRule rule) { - T object = this.rules.get(rule); - if (object == null) { + public T get(final GameRule gameRule) { + T value = this.rules.get(gameRule); + if (value == null) { diff --git a/purpur-server/minecraft-patches/unapplied-features/0016-Toggle-for-water-sensitive-mob-damage.patch b/purpur-server/minecraft-patches/features/0016-Toggle-for-water-sensitive-mob-damage.patch similarity index 80% rename from purpur-server/minecraft-patches/unapplied-features/0016-Toggle-for-water-sensitive-mob-damage.patch rename to purpur-server/minecraft-patches/features/0016-Toggle-for-water-sensitive-mob-damage.patch index ba9816440..8eb9c6731 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0016-Toggle-for-water-sensitive-mob-damage.patch +++ b/purpur-server/minecraft-patches/features/0016-Toggle-for-water-sensitive-mob-damage.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Toggle for water sensitive mob damage diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index a09b5035e91d50e12f613a7a1211c6869fbbf4df..e83900f8d6adbe8a48294f250bd6cc6e3fad8160 100644 +index f40892bbe424408e3d11c887d5bd0fef179aaced..15bb425ed1569cbf445e81aa296039df8abc4746 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java @@ -109,6 +109,13 @@ public class Bat extends AmbientCreature { @@ -23,10 +23,10 @@ index a09b5035e91d50e12f613a7a1211c6869fbbf4df..e83900f8d6adbe8a48294f250bd6cc6e public boolean isFlapping() { return !this.isResting() && this.tickCount % 10.0F == 0.0F; diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 79dfebbd72424d5a3a13d4ba89a555fdf782e703..947160c4dfc4e50bb75a1a797cb2f22602b22643 100644 +index d4178d85b74a41a0d2808681008f1686578db98d..a3a98df8ffeb33d86330b5561252eda596642da8 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 { +@@ -150,6 +150,13 @@ public class Axolotl extends Animal implements Bucketable { } // Purpur end - Make entity breeding times configurable @@ -38,22 +38,22 @@ index 79dfebbd72424d5a3a13d4ba89a555fdf782e703..947160c4dfc4e50bb75a1a797cb2f226 + // Purpur end - Toggle for water sensitive mob damage + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final 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 473aa29e3075fcab44a14c2bc14d3f222b55cbad..e57200d6560a38cbecd681a30b75409412fce170 100644 +index 36c5c555faa9a29ec742c97ea8a6fcf720e6d9a1..4fba5ce59065ac024a0108726623dab894ae45c5 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 { +@@ -186,7 +186,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { // Paper end - Fix MC-167279 this.lookControl = new Bee.BeeLookControl(this); - this.setPathfindingMalus(PathType.DANGER_FIRE, -1.0F); + this.setPathfindingMalus(PathType.FIRE_IN_NEIGHBOR, -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); -@@ -492,6 +492,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -495,6 +495,13 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { } // Purpur end - Make entity breeding times configurable @@ -68,10 +68,10 @@ index 473aa29e3075fcab44a14c2bc14d3f222b55cbad..e57200d6560a38cbecd681a30b754094 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 +index ccf7c4630e08d9be54a4634c642a4cd1cd542a82..4a59e133fc6c68f3b3d495c62bb965718643f6b8 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 { +@@ -113,6 +113,13 @@ public class Chicken extends Animal { } // Purpur end - Make entity breeding times configurable @@ -86,10 +86,10 @@ index 029fe4ac952d9f56824de346d98b341bd0b9b65f..6308bb606b34d781e315f56a55e6544b 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 +index 7981f60f10c44ab2459933cb15ee961103922364..7d3853d693a87e5225a16285631e0e2057685c1b 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 { +@@ -66,6 +66,13 @@ public class Cow extends AbstractCow { } // Purpur end - Make entity breeding times configurable @@ -101,10 +101,10 @@ index 400b0a0a99590e3590cb66724acdc5ba9170f2c4..bb8c75d20e6a1300d68ae75233962bdc + // Purpur end - Toggle for water sensitive mob damage + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/cow/MushroomCow.java b/net/minecraft/world/entity/animal/cow/MushroomCow.java -index e2aa027dc7a39fa8a8868a7d153e838113fcf97b..a8e6e703a51130066547724dd08bdfe5e11c99e5 100644 +index 68a4edef68c9db6b2b0716fc6283e2c7345d4cda..d3e5e12c4e3c168a3a15d611f8ae5845ee365080 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 { @@ -119,13 +119,13 @@ index e2aa027dc7a39fa8a8868a7d153e838113fcf97b..a8e6e703a51130066547724dd08bdfe5 + // Purpur end - Toggle for water sensitive mob damage + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final 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 a5305e057d7f557bedca71962ebf19b0d7344abf..e3646a05c6cb973fad36297cc18cf48587a6f5cd 100644 +index 857bafb865b78d83716d2d5f491c0928ae6951ca..c372a2cc7ec9ac03629a73a45bfc58f77894d63b 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 { +@@ -162,6 +162,13 @@ public class Dolphin extends AgeableWaterCreature { } // Purpur end - Configurable entity base attributes @@ -138,9 +138,9 @@ index a5305e057d7f557bedca71962ebf19b0d7344abf..e3646a05c6cb973fad36297cc18cf485 + @Override public @Nullable SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, final @Nullable SpawnGroupData groupData diff --git a/net/minecraft/world/entity/animal/equine/Donkey.java b/net/minecraft/world/entity/animal/equine/Donkey.java -index d74a5cc2a43ef41fd00676bbd17fe4df9edb67ff..6cf6853c244b7589d2a57e7ae77933d4a1503ccd 100644 +index 8c3d3f0f24e6f5a9b8aa9bf58f3c8b679896017d..5e0846fcaccfab5edbeb90bc61c2360cecf7a0c4 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 { @@ -158,10 +158,10 @@ index d74a5cc2a43ef41fd00676bbd17fe4df9edb67ff..6cf6853c244b7589d2a57e7ae77933d4 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 +index dbb586058f38b6c4f81e2f6567b7ae8ebbaff5a2..64603ad973bdb697ca75642e8e42e7052efd4191 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 { +@@ -79,6 +79,13 @@ public class Horse extends AbstractHorse { } // Purpur end - Make entity breeding times configurable @@ -173,13 +173,13 @@ index ba9df659ed019f9e58991059fe99c1471bfc94d8..1c17ab94901ce1c6370670c06bf0801e + // Purpur end - Toggle for water sensitive mob damage + @Override - protected void randomizeAttributes(RandomSource random) { + protected void randomizeAttributes(final 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 +index b3c8ccbb3f79043427dcb6f383c4b02d35124689..e277a58a1c761198f59b987c95567b6e4d9c440b 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 { +@@ -158,6 +158,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { } // Purpur end - Make entity breeding times configurable @@ -194,7 +194,7 @@ index 960e48f5ae63d8c86758d2573510bf481ca4bca0..eb2fc0e6d497241f1b4f3971155b10d1 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 +index cf0f3c9d5f8ff348e6fb76db823da4cadce4fc5b..291176b409097d15c2afff7fe8deb17ba07dbc12 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 { @@ -212,7 +212,7 @@ index 180a807026437e949e3f7c3d59864ea328f6f03f..9bafe3e204b3e4624a95b130552c8230 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 +index a4a878791be034140a50b901d5daf2533d299756..9365609fad67377ffe18e11c7959e0d92367852a 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 { @@ -230,7 +230,7 @@ index af0e326f5ff8fcb82353bac3143103928a6a08e6..3865937e4a56636cde44f7d8f16873ae 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 +index 7c41aecd2699725211babbac0350cb241f31ca41..a9fcf7827e6a6b061c2a861d1e59bca80117699b 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 { @@ -248,10 +248,10 @@ index 65ac46335d642d5dd8c01623721257a4fd53441d..4c07cd57aa3518adb4bc9b1213cc572a 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 +index 4be11663154a870a21832ddba05764a897ce90bd..586151b916a5e21c36578aa04cab9d71994dcf43 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 { +@@ -85,6 +85,13 @@ public class ZombieHorse extends AbstractHorse { } // Purpur end - Make entity breeding times configurable @@ -266,7 +266,7 @@ index fa2f18470123f98e336ab5c94bc791e9333356cb..b770d3118452b0b7a362b1f541bb602f 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 +index 5c235149eca10c216f0f8d6e645a439d7dbcfbc3..0493926c7918059d82bafd20fed0883bb331bd55 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 { @@ -282,9 +282,9 @@ index d0aa698ef99cf3b1926018314b4067cc1cd8ac2a..92b67565485b2fade3e80fb4b944edfc + @Override protected void registerGoals() { - this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); + this.temptGoal = new Cat.CatTemptGoal(this, 0.6, i -> i.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 +index 2accf49e8dd907c8a482e5317d07b28fc5492a1e..9a582b789d3b3037c510c063a07f99f92ac58a1c 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 { @@ -302,7 +302,7 @@ index bf281fd4c050b87fd277ab68e812ab2dcd3d06aa..13272516003f763d2c69dc599c8ff769 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 +index 948d6a8e3465fd5985e91ca7eaa5f02258ad9625..f44214eaa47c2021f7ca9c84a7b89be15fecb5bc 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 { @@ -320,7 +320,7 @@ index e00e623d7df9e179d8bb5ee4812538578c5f4c08..8655aae805f239cbd049065232293854 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 8bd92b3a28ffe70cb9753050c2128c2e744fb1ee..414d79f9d1fbd9857c8baeb2888017d45f34f02b 100644 +index 3ed54f746305a284177b609f410e2b7e9a6e6796..17dba2f70251c2d5f75cc116b300f328f117cecb 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 { @@ -335,13 +335,13 @@ index 8bd92b3a28ffe70cb9753050c2128c2e744fb1ee..414d79f9d1fbd9857c8baeb2888017d4 + // Purpur end - Toggle for water sensitive mob damage + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/fish/Salmon.java b/net/minecraft/world/entity/animal/fish/Salmon.java -index 97194d5c844bf96ba431c12ccc1a82cb8944c52b..424bd56ec9df8bd0a80d2fa79bc4f482eae2ab5c 100644 +index d9276ab9af526f1714d3241bbf6f9c7906adec70..ba75ba1130c4fe5f4d7b29c624a17becd2a71c99 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 { +@@ -60,6 +60,13 @@ public class Salmon extends AbstractSchoolingFish { } // Purpur end - Configurable entity base attributes @@ -356,7 +356,7 @@ index 97194d5c844bf96ba431c12ccc1a82cb8944c52b..424bd56ec9df8bd0a80d2fa79bc4f482 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 +index fbe7b76aac06bb0dce7ae53dea85e947a53d1b64..17bc569bf97026e2c072633f1ad6e9e0102c137a 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 { @@ -370,14 +370,14 @@ index 8ffb253c114d882c9459f74a27bd8a086ae82f01..04c30c60c76122018fa69cf1f3f64cae + } + // Purpur end - Toggle for water sensitive mob damage + - public static String getPredefinedName(int variantId) { - return "entity.minecraft.tropical_fish.predefined." + variantId; + public static String getPredefinedName(final int index) { + return "entity.minecraft.tropical_fish.predefined." + index; } diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java -index a0ed30e8ccd41729de8e0ff977a61fa607386640..bc119c2f61adb6c6122119fda1df437bab40f9b4 100644 +index f781d02d10317bf7cf9b5fe50706bbefb62820d3..aa419e7cb456f664c1eca1286777caca6bd10e7a 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 { +@@ -208,6 +208,13 @@ public class Fox extends Animal { } // Purpur end - Make entity breeding times configurable @@ -389,13 +389,13 @@ index a0ed30e8ccd41729de8e0ff977a61fa607386640..bc119c2f61adb6c6122119fda1df437b + // Purpur end - Toggle for water sensitive mob damage + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index 07ba57ae845024e0f2fa03a68e126ec79bfc6b15..e5f5bc2c4b4f36e0e911b2c5ef67ef6e0d4cd0b1 100644 +index da763ba40fdc52d6f6fec97e5e288fbef343ead6..0d40bbd8c42178c712f23300364138389ecde548 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 { +@@ -124,6 +124,13 @@ public class Goat extends Animal { } // Purpur end - Make entity breeding times configurable @@ -407,13 +407,13 @@ index 07ba57ae845024e0f2fa03a68e126ec79bfc6b15..e5f5bc2c4b4f36e0e911b2c5ef67ef6e + // Purpur end - Toggle for water sensitive mob damage + @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/animal/golem/CopperGolem.java b/net/minecraft/world/entity/animal/golem/CopperGolem.java -index b32932f1d7c9c0bbd4814eb145339a9a183ff9b9..e143db15040f8d5be5d07e04a41b7afaf42b4331 100644 +index bc66450f8d1be97f11f8380755a9973e8ef4befa..078cb2f09e9aaf05bb965a27b90f34c7c3a4147d 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 +@@ -144,6 +144,13 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab } // Purpur end - Configurable entity base attributes @@ -428,7 +428,7 @@ index b32932f1d7c9c0bbd4814eb145339a9a183ff9b9..e143db15040f8d5be5d07e04a41b7afa 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 677f584b38aeb6805db0bb867f62d5617e309f5e..d31c1f1b681922ca8f1657ffa333e8a6794e619f 100644 +index ec08c9c2ac32863807061d93ec8894bd094f7ab4..77996312597da9a2bbcf89f798c10a0be0abcd39 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 { @@ -446,10 +446,10 @@ index 677f584b38aeb6805db0bb867f62d5617e309f5e..d31c1f1b681922ca8f1657ffa333e8a6 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 fa941ba3151da7b965678be7e4c6a4194863cd0a..94d319a8fba3a437fb55aa7daaaba0c5c9acbb3b 100644 +index 7091f5bc2ecb9d4b86162fe364447df65d8e9348..2d3127f6846ff9eda1a0b89764dc837da6e7e0c7 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 +@@ -124,7 +124,7 @@ public class SnowGolem extends AbstractGolem implements RangedAttackMob, Shearab @Override public boolean isSensitiveToWater() { @@ -459,10 +459,10 @@ index fa941ba3151da7b965678be7e4c6a4194863cd0a..94d319a8fba3a437fb55aa7daaaba0c5 @Override diff --git a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java -index 30204224ed83f6d3cfd64640b332b23cb74d379f..828793aaa2992fd1077040309154f814b302476a 100644 +index 75a32b65da7080391d0c37622db9cb98c5e092b6..d3367430da307e2c0748874cbe77f265860152a0 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 { +@@ -161,6 +161,13 @@ public class HappyGhast extends Animal { } // Purpur end - Make entity breeding times configurable @@ -477,10 +477,10 @@ index 30204224ed83f6d3cfd64640b332b23cb74d379f..828793aaa2992fd1077040309154f814 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 +index 02d5949fb91bbee84fa067dac14d20f53f4a029b..f97b8feaedb84baf479998cef7257231f85412d6 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 { +@@ -153,6 +153,13 @@ public class Panda extends Animal { } // Purpur end - Make entity breeding times configurable @@ -492,10 +492,10 @@ index 163fe697f57459b36885fa3a18f41370347cab38..e9aa07dea0515f53a08a7066fa9e23e0 + // Purpur end - Toggle for water sensitive mob damage + @Override - protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { + protected boolean canDispenserEquipIntoSlot(final 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 +index af3d3b90f2e4d433b3b842dbc37d8c507a73dc1f..d756d6931dbf560fef5cb9641ace6f091fbcfff9 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 { @@ -511,12 +511,12 @@ index 0d62046cb33ed750ab27229fe4f0b43c3a1dd5f4..e97782bc8232120d4e7d1feeb8ca87fd + @Override public @Nullable SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, @Nullable SpawnGroupData groupData diff --git a/net/minecraft/world/entity/animal/pig/Pig.java b/net/minecraft/world/entity/animal/pig/Pig.java -index 0cb09a058c2d21b10677482792b230464ed9f951..020932539727739b54ed2f7899cbf11ad940f4df 100644 +index 514f13a6965b5f53890ddd2e47ea89e0c1a515c1..05141bc41dc5181a8f0526528147e7a6c015a707 100644 --- a/net/minecraft/world/entity/animal/pig/Pig.java +++ b/net/minecraft/world/entity/animal/pig/Pig.java -@@ -95,6 +95,13 @@ public class Pig extends Animal implements ItemSteerable { +@@ -100,6 +100,13 @@ public class Pig extends Animal implements ItemSteerable { } // Purpur end - Make entity breeding times configurable @@ -531,10 +531,10 @@ index 0cb09a058c2d21b10677482792b230464ed9f951..020932539727739b54ed2f7899cbf11a 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 +index 6d4713663c94e91da7d809e65fa205aff2782f38..2a28c9ef361909aa0c3946ed6857f7d340c8cfc0 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 { +@@ -134,6 +134,13 @@ public class PolarBear extends Animal implements NeutralMob { } // Purpur end - Make entity breeding times configurable @@ -546,13 +546,13 @@ index 97edd950e2142e73ad947590c99d6d5529cbd44c..13d26a6981d6907f35f1f2bde93934c7 + // Purpur end - Toggle for water sensitive mob damage + @Override - public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + public @Nullable AgeableMob getBreedOffspring(final ServerLevel level, final 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 +index 4d79ce89c21ba0b973bbda01bf53665e3b7a1902..7dade80db9430e4db587ed23df992d70c6b7ee04 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 { +@@ -177,6 +177,13 @@ public class Rabbit extends Animal { } // Purpur end - Make entity breeding times configurable @@ -567,7 +567,7 @@ index 66fda64006c0a70ab4502f088637bb6871c3bb37..b1c72047f7aa63f62b0ad0274811b587 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 0e4505474a50d57338c16648cb6049d35455fdc6..7eca49c9237c61ab12f60ff16085aa8fd10c99ac 100644 +index 9cc59891521963204399b7f67d94bb78c7e75fb6..0ceaa6dd493d0258c419d8b5c4394b35c0808704 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 { @@ -585,7 +585,7 @@ index 0e4505474a50d57338c16648cb6049d35455fdc6..7eca49c9237c61ab12f60ff16085aa8f 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 +index cb3d0bd838473af87af74c7d1bab38593a6c8f6d..1fa3d614dd1c45ec42caffbe92e3f8db02b399b1 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 { @@ -603,10 +603,10 @@ index 7d41aaa0546a9ca02e46ce46e61ecc57120bfca9..2aa2a84a7ada369c45a85119a933eb92 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 +index cc0a1aaa6aa710c0f0b4df0e46e8ad7931f26b2f..e350763a3a22d825a25f02b60bd4c9223aa81f62 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 { +@@ -104,6 +104,13 @@ public class Squid extends AgeableWaterCreature { } // Purpur end - Configurable entity base attributes @@ -621,7 +621,7 @@ index 5e4181f95711c6b0299f28de14d95da421dda373..e307ebfb8b2781b6175b520e148e6bd5 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 +index 62d9fce83cc44165c5356049a12bf6081c925857..6d09c0de38f2c91d2a0ab6dd0b694ab42b48a981 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 { @@ -635,14 +635,14 @@ index fce1b1a22e091a1c05650c72e1ceb83e1a1d1ed1..7d5987fe641646ecbf8e389d57a0a9a0 + } + // Purpur end - Toggle for water sensitive mob damage + - public void setHomePos(BlockPos homePos) { - this.homePos = homePos; + public void setHomePos(final BlockPos pos) { + this.homePos = pos; } diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index 08a1bafa0e45dbdbf8bdc4d5cb654d080590707d..20f945ee06bcdb4736e6d3a8b20a5cbd3d79df0f 100644 +index 0561b38982c205edc848b1650152491698a80e29..781cac493f909b02483e5c4064cc2cc791b1dabd 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -223,6 +223,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -220,6 +220,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Make entity breeding times configurable @@ -657,7 +657,7 @@ index 08a1bafa0e45dbdbf8bdc4d5cb654d080590707d..20f945ee06bcdb4736e6d3a8b20a5cbd 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 ecfd9f7b56aee3b701821339f41b60bd7bef0e97..335bff0b9537ea4ea9717e76e824b07642d7dd8e 100644 +index 51ca6a3fa75f3aef715d786a21327452390dde94..d7b909d65c8ef716ad652c97425148b7fbcd8f2e 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -170,6 +170,13 @@ public class EnderDragon extends Mob implements Enemy { @@ -675,10 +675,10 @@ index ecfd9f7b56aee3b701821339f41b60bd7bef0e97..335bff0b9537ea4ea9717e76e824b076 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 df608186f3e9ab5b56a209be67cd02717d3f9734..4afa484099c7f813d5ae8c7cc8721a0d033c8e6e 100644 +index 3e934aee6f651843d861cc87cc1f01a87742edf3..10818999c4e796a4dfd5a7dd21772c9eb8ca2579 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -220,6 +220,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -222,6 +222,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Configurable entity base attributes @@ -690,21 +690,21 @@ index df608186f3e9ab5b56a209be67cd02717d3f9734..4afa484099c7f813d5ae8c7cc8721a0d + // Purpur end - Toggle for water sensitive mob damage + @Override - protected PathNavigation createNavigation(Level level) { + protected PathNavigation createNavigation(final 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 4cd7975a8e9e55d6b6ded0b7e13d8da436e49c6c..e2afd7677986c70dd924017e8822fd6abd808f48 100644 +index b553c6dd60bd23fba7ee3df9886561fc7640f104..7f0e76437798f1bab7956722382e1517f8f71121 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 { - public Blaze(EntityType type, Level level) { - super(type, level); + public Blaze(final EntityType blaze, final Level level) { + super(blaze, level); this.moveControl = new org.purpurmc.purpur.controller.FlyingWithSpacebarMoveControllerWASD(this, 0.3F); // Purpur - Ridables - this.setPathfindingMalus(PathType.WATER, -1.0F); + if (isSensitiveToWater()) this.setPathfindingMalus(PathType.WATER, -1.0F); // Purpur - Toggle for water sensitive mob damage this.setPathfindingMalus(PathType.LAVA, 8.0F); - this.setPathfindingMalus(PathType.DANGER_FIRE, 0.0F); - this.setPathfindingMalus(PathType.DAMAGE_FIRE, 0.0F); + this.setPathfindingMalus(PathType.FIRE_IN_NEIGHBOR, 0.0F); + this.setPathfindingMalus(PathType.FIRE, 0.0F); @@ -158,7 +158,7 @@ public class Blaze extends Monster { @Override @@ -715,7 +715,7 @@ index 4cd7975a8e9e55d6b6ded0b7e13d8da436e49c6c..e2afd7677986c70dd924017e8822fd6a @Override diff --git a/net/minecraft/world/entity/monster/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index ed1ccd712a2fe00740beeee4fe615976258f5c6c..b0ed96c243f9abb3868d92bb513ad1620aa8e269 100644 +index 73b0efd692205f56862c7287d7222efebe3faf73..80327a6ba1da0145f087a7946c7a4dfb6d947ce7 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 { @@ -730,10 +730,10 @@ index ed1ccd712a2fe00740beeee4fe615976258f5c6c..b0ed96c243f9abb3868d92bb513ad162 + // Purpur end - Toggle for water sensitive mob damage + @Override - public SoundEvent getHurtSound(DamageSource damageSource) { + public SoundEvent getHurtSound(final DamageSource source) { return SoundEvents.CREEPER_HURT; diff --git a/net/minecraft/world/entity/monster/ElderGuardian.java b/net/minecraft/world/entity/monster/ElderGuardian.java -index 57fb334f670d35aa181b13e12fa2c5f36da1dda6..1ea323a17440abbe36c9528e80e169816267005b 100644 +index ffcfe02c51f6df1bd238c821a8d6535f4ccf019c..a98967c7a76d8e25da9e31eaa8f2ae0bf0704c9d 100644 --- a/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/net/minecraft/world/entity/monster/ElderGuardian.java @@ -51,6 +51,13 @@ public class ElderGuardian extends Guardian { @@ -751,12 +751,12 @@ 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 79a1d8f67a22a8fa4a6c3b657e44bb9503687c27..47c621f01658f3392b58f3f5c1f31bd539f63dd6 100644 +index 46a60e17837411e46a543d6f0254d7280d30a94c..8862ad857a4c99defe7621c59d8f3ef77ab7aff4 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java @@ -86,7 +86,7 @@ public class EnderMan extends Monster implements NeutralMob { - public EnderMan(EntityType type, Level level) { + public EnderMan(final EntityType type, final Level level) { super(type, level); - this.setPathfindingMalus(PathType.WATER, -1.0F); + if (isSensitiveToWater()) this.setPathfindingMalus(PathType.WATER, -1.0F); // Purpur - Toggle for water sensitive mob damage @@ -773,7 +773,7 @@ index 79a1d8f67a22a8fa4a6c3b657e44bb9503687c27..47c621f01658f3392b58f3f5c1f31bd5 @Override diff --git a/net/minecraft/world/entity/monster/Endermite.java b/net/minecraft/world/entity/monster/Endermite.java -index f92dfcf9e296714f3802264406d8ab627c9bf067..b5e620d62702e3330f5ced19f1baeb82bdc801ec 100644 +index 040f0b59d93b1b94495253f3286bdba123c22ef4..859d490dd3be2843dde3a811bcc0d51e3eae76f0 100644 --- a/net/minecraft/world/entity/monster/Endermite.java +++ b/net/minecraft/world/entity/monster/Endermite.java @@ -72,6 +72,13 @@ public class Endermite extends Monster { @@ -791,7 +791,7 @@ index f92dfcf9e296714f3802264406d8ab627c9bf067..b5e620d62702e3330f5ced19f1baeb82 protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/monster/Ghast.java b/net/minecraft/world/entity/monster/Ghast.java -index 7d97c00ae49629b97104631317aa6174741cdd5e..443eb9f12d6df950c59c9d4db4853087fd23d24e 100644 +index 254548dd024e4963bbcb1b1fce99194461d3f54d..89a2097c2c26dae7f12ddbac10bc091ec7f228d7 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 { @@ -809,7 +809,7 @@ index 7d97c00ae49629b97104631317aa6174741cdd5e..443eb9f12d6df950c59c9d4db4853087 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/Giant.java b/net/minecraft/world/entity/monster/Giant.java -index 40cf8f44a6b01d45306dab4ba4f9a7ea7c6590a9..f1176f73d4468b2f39e48fe5454c5f5bf481afd9 100644 +index c39031e8fdfb0dff7867d9525dbddde110242647..43ebfe06ce2a8c15787d72a8ef54cd6c7cac2bfc 100644 --- a/net/minecraft/world/entity/monster/Giant.java +++ b/net/minecraft/world/entity/monster/Giant.java @@ -62,6 +62,13 @@ public class Giant extends Monster { @@ -827,7 +827,7 @@ index 40cf8f44a6b01d45306dab4ba4f9a7ea7c6590a9..f1176f73d4468b2f39e48fe5454c5f5b 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 1eaa4f255b01eddc93ddbc5615ad05e7d8273581..9948511659de9222a19f6b9f660e4441ea98a4a9 100644 +index 12f6b4bf9fa011db34617e2115206202d7f2d32e..9ca62d9663fc2e8eb49780ceb7ff38e0363a09a6 100644 --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java @@ -97,6 +97,13 @@ public class Guardian extends Monster { @@ -843,9 +843,9 @@ index 1eaa4f255b01eddc93ddbc5615ad05e7d8273581..9948511659de9222a19f6b9f660e4441 + @Override protected void registerGoals() { - MoveTowardsRestrictionGoal moveTowardsRestrictionGoal = new MoveTowardsRestrictionGoal(this, 1.0); + MoveTowardsRestrictionGoal goal = new MoveTowardsRestrictionGoal(this, 1.0); diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java -index e0fda9a975e00c49ba09db65d7b3fba8fa434757..1bf9d04e5e44272b02753290995795f194cbdae1 100644 +index d40a4daeec1500f2d9865022ee6e3c386ad7533e..fba41f261e57a050d4e24d2611cc27edcbb84ddf 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 { @@ -863,10 +863,10 @@ index e0fda9a975e00c49ba09db65d7b3fba8fa434757..1bf9d04e5e44272b02753290995795f1 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 6e8fe1b694ade45ffbf0b9bb39b954deffeb2402..2fa22088ac507eceb36f3c77f24a733076641d8f 100644 +index da014eae20abb320ecb897517810e4ab53783a89..20096d8305bbfc29195834b87245c94096986ec8 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -128,6 +128,13 @@ public class Phantom extends Mob implements Enemy { +@@ -129,6 +129,13 @@ public class Phantom extends Mob implements Enemy { } // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms @@ -881,10 +881,10 @@ index 6e8fe1b694ade45ffbf0b9bb39b954deffeb2402..2fa22088ac507eceb36f3c77f24a7330 public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index 7c69423eee05992b9c70321d528cc9d73b3e63ea..ad2913b02ded9b5087c69ba279cebfd81d9ef75e 100644 +index e0ffded3500b221d5c65cff9377120e8c6c7d8c6..bb19e3f2e6522e8b7db32061c0ae2b2a37679369 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -103,6 +103,13 @@ public class Ravager extends Raider { +@@ -101,6 +101,13 @@ public class Ravager extends Raider { } // Purpur end - Configurable entity base attributes @@ -899,10 +899,10 @@ index 7c69423eee05992b9c70321d528cc9d73b3e63ea..ad2913b02ded9b5087c69ba279cebfd8 protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index 30f2503ebd045b05f5594cef28389a694338d13a..0a5a6f23cd8e4317db4e7c0ba8883e99f3aff148 100644 +index 84e27edf490fbe4ed0142b9bb90aab37151acf3d..cf49a580c8dacb895b7a8ec2531d3afee2ffc30c 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -133,6 +133,13 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -135,6 +135,13 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Configurable entity base attributes @@ -917,7 +917,7 @@ index 30f2503ebd045b05f5594cef28389a694338d13a..0a5a6f23cd8e4317db4e7c0ba8883e99 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 7f94e9749283f1e51b449b0ef84ca08e246a1cc9..c64509a5027de1369bde610feba7a39aa5b404fd 100644 +index e5a0a199685366f082904eb5e7550f0160f9c706..205c05f46d70d37e11a0e35c97128e0c20b94e23 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java @@ -65,6 +65,13 @@ public class Silverfish extends Monster { @@ -935,7 +935,7 @@ index 7f94e9749283f1e51b449b0ef84ca08e246a1cc9..c64509a5027de1369bde610feba7a39a protected void registerGoals() { this.friendsGoal = new Silverfish.SilverfishWakeUpFriendsGoal(this); diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java -index f93a2c58b5835e9ce8318d28e944533ef69df8ef..c4222e17d9a1f4cba6a74099a167cff13856f3e3 100644 +index 0713239089bac454b3228d80aaabfd1fca4bd08b..556930ac4d06b4f46a87d237857006729fea5ef5 100644 --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java @@ -135,6 +135,13 @@ public class Slime extends Mob implements Enemy { @@ -953,19 +953,19 @@ index f93a2c58b5835e9ce8318d28e944533ef69df8ef..c4222e17d9a1f4cba6a74099a167cff1 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/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index ad6515c2dcde0079095c6777f56319e9901850f8..758887f3fcec2bf0946cddb184e19a1c9b64eee3 100644 +index 38a17c219bce1a8a8a67b136e0eaf5cf15ec94fd..1b6137674d807ed29d56e3f3120abe60254274e1 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 { - public Strider(EntityType type, Level level) { - super(type, level); +@@ -87,7 +87,7 @@ public class Strider extends Animal implements ItemSteerable { + public Strider(final EntityType strider, final Level level) { + super(strider, level); this.blocksBuilding = true; - this.setPathfindingMalus(PathType.WATER, -1.0F); + if (isSensitiveToWater()) this.setPathfindingMalus(PathType.WATER, -1.0F); // Purpur - Toggle for water sensitive mob damage this.setPathfindingMalus(PathType.LAVA, 0.0F); - this.setPathfindingMalus(PathType.DANGER_FIRE, 0.0F); - this.setPathfindingMalus(PathType.DAMAGE_FIRE, 0.0F); -@@ -388,7 +388,7 @@ public class Strider extends Animal implements ItemSteerable { + this.setPathfindingMalus(PathType.FIRE_IN_NEIGHBOR, 0.0F); + this.setPathfindingMalus(PathType.FIRE, 0.0F); +@@ -398,7 +398,7 @@ public class Strider extends Animal implements ItemSteerable { @Override public boolean isSensitiveToWater() { @@ -975,10 +975,10 @@ index ad6515c2dcde0079095c6777f56319e9901850f8..758887f3fcec2bf0946cddb184e19a1c @Override diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index 32759864a8ff0c4e28ce80ae8906cbcf1927094e..6ead673c44891c6b1c1688f80bf299527d7bc777 100644 +index 62fe1bb1632fbe8edf901c22c7972e729a5f6100..c7700ff6b7faf06116626ad95e11cd4604751eda 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -110,6 +110,13 @@ public class Vex extends Monster implements TraceableEntity { +@@ -111,6 +111,13 @@ public class Vex extends Monster implements TraceableEntity { } // Purpur end - Configurable entity base attributes @@ -993,7 +993,7 @@ index 32759864a8ff0c4e28ce80ae8906cbcf1927094e..6ead673c44891c6b1c1688f80bf29952 public boolean isFlapping() { return this.tickCount % TICKS_PER_FLAP == 0; diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java -index 3c3c258d4cc7cf7376d0d3ad0794ec3611ab81ce..86d9952ed0f692e8f229b0c0bcb6cacf53a00c8b 100644 +index 6b17c2135397f349670a7180e88db4794d3902a8..bfa222c9b61bc2d20927fdf08e8baa5fda4fdbdc 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 { @@ -1011,10 +1011,10 @@ index 3c3c258d4cc7cf7376d0d3ad0794ec3611ab81ce..86d9952ed0f692e8f229b0c0bcb6cacf protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index e0192a13b8d7131024471569bf34329ba0f28287..e2708eb836d60588c1bedb75c520e5007185034a 100644 +index 4d4593f89e20e8e72a979cc2dee54566ef380462..15e5e3c63ec9bddaf19636e27dd21d12df9318ce 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 { +@@ -101,6 +101,13 @@ public class Zoglin extends Monster implements HoglinBase { } // Purpur end - Configurable entity base attributes @@ -1026,13 +1026,13 @@ index e0192a13b8d7131024471569bf34329ba0f28287..e2708eb836d60588c1bedb75c520e500 + // Purpur end - Toggle for water sensitive mob damage + @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 4498fe26dff2cdec8e90d6559a66ebe7859195bb..5e3f7005a7167c786038823a8437ad2e90a41d2c 100644 +index d158807f22a0a08614b2d7054663ef2782a519e3..d001cf955dba66435079eb2cc30e05aec963d2c6 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -129,6 +129,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -105,6 +105,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { } // Purpur end - Make entity breeding times configurable @@ -1044,13 +1044,13 @@ index 4498fe26dff2cdec8e90d6559a66ebe7859195bb..5e3f7005a7167c786038823a8437ad2e + // Purpur end - Toggle for water sensitive mob damage + @VisibleForTesting - public void setTimeInOverworld(int timeInOverworld) { + public void setTimeInOverworld(final 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 +index d091a12ed1df31f945a04f50af1cbb89a16ca0cd..75276deb3208437fce669f9e483ff6c7a99d69a3 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 { +@@ -75,6 +75,13 @@ public class Evoker extends SpellcasterIllager { } // Purpur end - Configurable entity base attributes @@ -1065,10 +1065,10 @@ index 334786b2c358c41058f2ac4b1fa4b185833cbd84..c4f45f6303a46ad54991c9013608a4e5 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 +index bc19b4c293a4101abd559c61c59021e076420b32..32b8f638ea26494cae648f4bb48a664ce2a5021e 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 { +@@ -87,6 +87,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } // Purpur end - Configurable entity base attributes @@ -1083,7 +1083,7 @@ index 8fa53cccb73b2d8c599c898f298681735007d2a0..32278f51f4973d1294e52f0775697e9f 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 +index 134650a5866459881c1dca4b77b47110fd67420a..bd9092a0fecef475bde06d94bc2f6726f21404fd 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 @@ -1101,7 +1101,7 @@ index 1e43c69366287c7a191a6f8e3a7d5459743f07a2..6190286ab2f454382d497b4fce47632e 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 +index 865395b9ceddfaac4fc88701878a1cf349556fe1..aab0bd86da31ca73efc4988fa34c906886139ec3 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 { @@ -1119,10 +1119,10 @@ index 5f3857186e86e27fe237c62cec4af13ebf58debe..86b463a16e8630af4918ea43a2546995 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 4fccd122a227e5fe80965c37afaa031c4a673978..d6c834914ddea76280466bf0f7d001a76af34f08 100644 +index 356fc7507b58cc38cdf5ee11618ad3551fb3c6a2..de86e23b377ca0727d5f5234f2bc63180ddbbad2 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -166,6 +166,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -133,6 +133,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento } // Purpur end - Configurable entity base attributes @@ -1134,13 +1134,13 @@ index 4fccd122a227e5fe80965c37afaa031c4a673978..d6c834914ddea76280466bf0f7d001a7 + // Purpur end - Toggle for water sensitive mob damage + @Override - protected void addAdditionalSaveData(ValueOutput output) { + protected void addAdditionalSaveData(final 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 3d34bef7ffe9e66e77e3fc10b2c5869d98a4a5c9..4bf2038fea712e65f420ade915a18470b79318fc 100644 +index 4d82bf4283cb3ff26d5a9c367a28b4debed6cb0d..79e084304cec441966a22f0028e021d19e49bfd3 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 { +@@ -75,6 +75,13 @@ public class PiglinBrute extends AbstractPiglin { } // Purpur end - Configurable entity base attributes @@ -1155,7 +1155,7 @@ index 3d34bef7ffe9e66e77e3fc10b2c5869d98a4a5c9..4bf2038fea712e65f420ade915a18470 return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java -index 96d989cffc6ff72954ed92e2535c72992d489372..30d79be765118a50e2e2c5bfde6bf6bbc957cf40 100644 +index 76b16400085d237194ed646b04210c8eca8398d3..a2fc1cf5fa77c1cc78610ce0b4bbd35a371878a0 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 { @@ -1170,10 +1170,10 @@ index 96d989cffc6ff72954ed92e2535c72992d489372..30d79be765118a50e2e2c5bfde6bf6bb + // Purpur end - Toggle for water sensitive mob damage + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java -index 575f30cc9a6166a4e0733cc33e8b5814acb92660..ec19c49d195daff5839c991cce63b1ffc15a7e0b 100644 +index ce9364040d6e856fd1fa42baa75b403098e6813f..64dc2a04bb2ae4dc63083a24c48f671bfc8ff8ea 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 { @@ -1188,10 +1188,10 @@ index 575f30cc9a6166a4e0733cc33e8b5814acb92660..ec19c49d195daff5839c991cce63b1ff + // Purpur end - Toggle for water sensitive mob damage + public static boolean checkStraySpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + final EntityType type, final ServerLevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final 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 +index 024b6d01eaf36ec6c9a85da669cc6bd0a4a6fc90..f1cf1d01a497fc46d201ad403b459f9886059d0f 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 { @@ -1209,7 +1209,7 @@ index f38bb54c0f5d7797179e5e75eb8092baea7b9dcb..3e8cc658b333f1259784e1426896ac8b 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 +index beba154f2a76d3d8f7d9b44c1b45b83c9dc3b86c..cbbfdd2dde1437955f1007618244eeb72768b8fd 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 { @@ -1224,10 +1224,10 @@ index a1391173cc4997df723c59f176726dde88491978..fad3e951e443f04f5bf0423cde42c0ae + // Purpur end - Toggle for water sensitive mob damage + @Override - public boolean doHurtTarget(ServerLevel level, Entity target) { + public boolean doHurtTarget(final ServerLevel level, final 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 +index 696d7fa001de544fd2124b4e1135725547a15a94..43c50e6808eaab4bb31ffbbc633a66bab49b9574 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 { @@ -1245,10 +1245,10 @@ index 6a9c807ed50dab4b65787d9f7269385103fa5f26..81c500de41b11d4aa6c52dc290f132ad 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 327086c972423e4f73402ea2e64519a355fa7b5a..ec36b854dccae7cef905aeb2fcd4ec177828139c 100644 +index 0f64fe7e15655c63f996106d504ab4d18dac4a1c..e4769eeacc3ac97f90acb5ed0127990466c8d886 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 { +@@ -133,6 +133,13 @@ public class Drowned extends Zombie implements RangedAttackMob { } // Purpur end - Configurable jockey options @@ -1263,10 +1263,10 @@ index 327086c972423e4f73402ea2e64519a355fa7b5a..ec36b854dccae7cef905aeb2fcd4ec17 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 583a1c5bc0add01419f8eb90c65b612db972844d..d2c205f88d3d4e722ab407903ea019f51a3dcdb7 100644 +index c3f2d9ab49eb501f26939387624f326227908b81..8d6262e99fb3ad98d3142ee069f07d2370ca0778 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 { +@@ -83,6 +83,13 @@ public class Husk extends Zombie { } // Purpur end - Configurable jockey options @@ -1281,10 +1281,10 @@ index 583a1c5bc0add01419f8eb90c65b612db972844d..d2c205f88d3d4e722ab407903ea019f5 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 88143183167de665216c73b5e19064d7023778b0..b3c62374719e2a0461a587f1311b2e8d90cb892b 100644 +index 5bf9970b93e27004dd832c8465dc95a681583ef6..0777e4e0c3aa932699f124c83a571ce913327740 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 { +@@ -152,6 +152,13 @@ public class Zombie extends Monster { } // Purpur end - Configurable jockey options @@ -1299,7 +1299,7 @@ index 88143183167de665216c73b5e19064d7023778b0..b3c62374719e2a0461a587f1311b2e8d 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 020a15431cca2186fef3f7f6101cef77dabad393..df9682cacc2913aaf51b3afbd86bbc080ab8bde0 100644 +index 8a5634d2204b9abae560d34a7b0616b3ebdc68ab..ecbac0d55dbe921ac2e185e0acab5691579be512 100644 --- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java @@ -131,6 +131,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -1314,13 +1314,13 @@ index 020a15431cca2186fef3f7f6101cef77dabad393..df9682cacc2913aaf51b3afbd86bbc08 + // Purpur end - Toggle for water sensitive mob damage + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java -index ec39ad6740361774f9ecfda7186cab9d8fac90f2..9a1da88752b0dd708365dd41a074cc0e90f36e1c 100644 +index d1edf1f44de1fc6d23bcd8044f8bf4165821790e..6cc4d4729520c60b98d45d5e7dd674e599616505 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 { +@@ -110,6 +110,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { } // Purpur end - Configurable jockey options @@ -1335,10 +1335,10 @@ index ec39ad6740361774f9ecfda7186cab9d8fac90f2..9a1da88752b0dd708365dd41a074cc0e 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 ed6642023fccbc8f825d7c5c206d73ffd666f0f9..b6bfe06a2ad8e4219d99de050b30ce1ad15b8b34 100644 +index fffc71d2f0cd0d4c4f5d8fad38130208cdbe5e67..fe93e373ea46970af5ca117e80a7d5a2497afeca 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 +@@ -284,6 +284,13 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } // Purpur end - Configurable entity base attributes @@ -1351,9 +1351,9 @@ index ed6642023fccbc8f825d7c5c206d73ffd666f0f9..b6bfe06a2ad8e4219d99de050b30ce1a + @Override public Brain getBrain() { - return (Brain)super.getBrain(); + return (Brain) super.getBrain(); diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java -index c6c4f4f2a970db7e782181eaca312931b192b0d5..cabebbc25788a8c41912f97dac85af41c9433b68 100644 +index ea74d8ac0b5de890124361e65aeb9a08ad09fa1b..cbbfa09d53ada7c39e9504d28770867989eaa5c1 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 diff --git a/purpur-server/minecraft-patches/unapplied-features/0017-API-for-any-mob-to-burn-daylight.patch b/purpur-server/minecraft-patches/features/0017-API-for-any-mob-to-burn-daylight.patch similarity index 72% rename from purpur-server/minecraft-patches/unapplied-features/0017-API-for-any-mob-to-burn-daylight.patch rename to purpur-server/minecraft-patches/features/0017-API-for-any-mob-to-burn-daylight.patch index 47586afb7..f50c04041 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0017-API-for-any-mob-to-burn-daylight.patch +++ b/purpur-server/minecraft-patches/features/0017-API-for-any-mob-to-burn-daylight.patch @@ -6,23 +6,20 @@ 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 c8bc831c49df48c3f2ea2ea2d22a0aec5d37923c..41506648031e9c7a1acf12f56ba02b4aadec344c 100644 +index afcdf4aa479e27c858afab01191344e14a1f4ecc..5d581af745468f61048448c8a845990538662e3f 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -544,6 +544,24 @@ public abstract class Entity implements SyncedDataHolder, DebugValueSource, Name +@@ -452,6 +452,21 @@ public abstract class Entity } // Purpur end - Add canSaveToDisk to Entity + // Purpur start - copied from Mob - API for any mob to burn daylight + public boolean isSunBurnTick() { + 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.isInWater() || this.isInPowderSnow || this.wasInPowderSnow; -+ if (lightLevelDependentMagicValue > 0.5F -+ && this.random.nextFloat() * 30.0F < (lightLevelDependentMagicValue - 0.4F) * 2.0F -+ && !flag -+ && this.level().canSeeSky(blockPos)) { ++ float br = this.getLightLevelDependentMagicValue(); ++ BlockPos roundedPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); ++ boolean isInNonBurnableBlock = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; ++ if (br > 0.5F && this.random.nextFloat() * 30.0F < (br - 0.4F) * 2.0F && !isInNonBurnableBlock && this.level().canSeeSky(roundedPos)) { + return true; + } + } @@ -31,38 +28,38 @@ index c8bc831c49df48c3f2ea2ea2d22a0aec5d37923c..41506648031e9c7a1acf12f56ba02b4a + } + // Purpur end - copied from Mob - API for any mob to burn daylight + - public Entity(EntityType type, Level level) { + public Entity(final EntityType type, final Level level) { this.type = type; this.level = level; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 717e42ed210408c30f3fa2b6d786a2a51abfecc6..3fc775aa326701f4f491d487d587dfa39ed1db47 100644 +index 7146381e06ed1b946ce43dca293f52da05b46314..08324c0a0e87eb0ed8ea111389a3a9111031e034 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -290,6 +290,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -291,6 +291,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) { -@@ -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)); + protected LivingEntity(final EntityType type, final Level level) { +@@ -788,6 +789,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin + output.putBoolean("FallFlying", this.isFallFlying()); + this.getSleepingPos().ifPresent(sleepingPos -> output.store("sleeping_pos", BlockPos.CODEC, sleepingPos)); + output.store("Brain", Brain.Packed.CODEC, this.brain.pack()); + output.putBoolean("Purpur.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - API for any mob to burn daylight if (this.lastHurtByPlayer != null) { this.lastHurtByPlayer.store(output, "last_hurt_by_player"); output.putInt("last_hurt_by_player_memory_time", this.lastHurtByPlayerMemoryTime); -@@ -917,6 +919,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -912,6 +914,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)); + input.read("Brain", Brain.Packed.CODEC).ifPresent(packedBrain -> this.brain = this.makeBrain(packedBrain)); + this.shouldBurnInDay = input.getBooleanOr("Purpur.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - API for any mob to burn daylight 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"); -@@ -3862,6 +3865,37 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3915,6 +3918,37 @@ 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); } @@ -101,33 +98,30 @@ index 717e42ed210408c30f3fa2b6d786a2a51abfecc6..3fc775aa326701f4f491d487d587dfa3 protected void applyInput() { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 01667b8d45653aa6b0f77d65599f7dc68979f9f1..9cf790b9293788857e3ca6ec23f22e6e1dea57ae 100644 +index 43f1a9287d2a3010d35a88d58df3e950f1011eec..44e3e723d6a796917e73012dbd03d4b36cb11a0e 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java -@@ -544,9 +544,9 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab +@@ -550,9 +550,9 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs @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 +- if (this.is(EntityTypeTags.BURN_IN_DAYLIGHT)) { ++ /*if (this.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"); -@@ -601,19 +601,8 @@ public abstract class Mob extends LivingEntity implements EquipmentUser, Leashab + ProfilerFiller profiler = Profiler.get(); + profiler.push("looting"); +@@ -604,16 +604,8 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs } public boolean isSunBurnTick() { - 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; -- if (lightLevelDependentMagicValue > 0.5F -- && this.random.nextFloat() * 30.0F < (lightLevelDependentMagicValue - 0.4F) * 2.0F -- && !flag -- && this.level().canSeeSky(blockPos)) { +- float br = this.getLightLevelDependentMagicValue(); +- BlockPos roundedPos = BlockPos.containing(this.getX(), this.getEyeY(), this.getZ()); +- boolean isInNonBurnableBlock = this.isInWaterOrRain() || this.isInPowderSnow || this.wasInPowderSnow; +- if (br > 0.5F && this.random.nextFloat() * 30.0F < (br - 0.4F) * 2.0F && !isInNonBurnableBlock && this.level().canSeeSky(roundedPos)) { - return true; - } - } @@ -139,34 +133,34 @@ index 01667b8d45653aa6b0f77d65599f7dc68979f9f1..9cf790b9293788857e3ca6ec23f22e6e protected Vec3i getPickupReach() { diff --git a/net/minecraft/world/entity/animal/equine/ZombieHorse.java b/net/minecraft/world/entity/animal/equine/ZombieHorse.java -index b770d3118452b0b7a362b1f541bb602f4d3cbcec..45bb4df25015568f0758095d9a309633bed520f3 100644 +index 586151b916a5e21c36578aa04cab9d71994dcf43..426b468ee821a7441d15dae3634032535cb60725 100644 --- a/net/minecraft/world/entity/animal/equine/ZombieHorse.java +++ b/net/minecraft/world/entity/animal/equine/ZombieHorse.java -@@ -50,6 +50,7 @@ public class ZombieHorse extends AbstractHorse { +@@ -47,6 +47,7 @@ public class ZombieHorse extends AbstractHorse { + + public ZombieHorse(final EntityType type, final Level level) { super(type, level); - this.setPathfindingMalus(PathType.DANGER_OTHER, -1.0F); - this.setPathfindingMalus(PathType.DAMAGE_OTHER, -1.0F); + this.setShouldBurnInDay(true); // Purpur - API for any mob to burn daylight } // Purpur start - Ridables diff --git a/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java b/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java -index 94383c5020b6631203ddc4e0a58a222729ffe9a2..7dd933dd38fc50e870bc74e5a54e2b50a85fa6f3 100644 +index 18bfb321e3728d3fa0596da0b86e4b76ced2178a..ab97449bfa5e8b5615e0f2b6b16be2fe7e4233fd 100644 --- a/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java +++ b/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java -@@ -41,6 +41,7 @@ public class ZombieNautilus extends AbstractNautilus { +@@ -46,6 +46,7 @@ public class ZombieNautilus extends AbstractNautilus { - public ZombieNautilus(EntityType type, Level level) { + public ZombieNautilus(final EntityType type, final Level level) { super(type, level); + this.setShouldBurnInDay(true); // Purpur - API for any mob to burn daylight } // Purpur start - Configurable entity base attributes diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index 2fa22088ac507eceb36f3c77f24a733076641d8f..ff944ad57d4e9e4a910cd63282e5e7594626365e 100644 +index 20096d8305bbfc29195834b87245c94096986ec8..6b6eed1c636f2ca65d0cbcd71e96bdd1b2063267 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 { +@@ -53,7 +53,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; @@ -175,7 +169,7 @@ index 2fa22088ac507eceb36f3c77f24a733076641d8f..ff944ad57d4e9e4a910cd63282e5e759 // 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 { +@@ -62,6 +62,7 @@ public class Phantom extends Mob implements Enemy { this.xpReward = 5; this.moveControl = new Phantom.PhantomMoveControl(this); this.lookControl = new Phantom.PhantomLookControl(this); @@ -183,7 +177,7 @@ index 2fa22088ac507eceb36f3c77f24a733076641d8f..ff944ad57d4e9e4a910cd63282e5e759 } // Purpur start - Ridables -@@ -297,7 +298,7 @@ public class Phantom extends Mob implements Enemy { +@@ -298,7 +299,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); @@ -192,7 +186,7 @@ index 2fa22088ac507eceb36f3c77f24a733076641d8f..ff944ad57d4e9e4a910cd63282e5e759 // Paper end } -@@ -308,7 +309,7 @@ public class Phantom extends Mob implements Enemy { +@@ -309,7 +310,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); @@ -202,32 +196,33 @@ index 2fa22088ac507eceb36f3c77f24a733076641d8f..ff944ad57d4e9e4a910cd63282e5e759 } diff --git a/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java b/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java -index 1ab860be69bcc1ab5cc07418c2d7e733afdc482b..60afd81d3bf671889fbff5d4a3fabb38a8e2d461 100644 +index 32da5212c85c829eeedc9d0f7904bbcaa3ce5ed3..062c7f20e73b882ef0550d90e3da47ac39a1b3a7 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 +@@ -71,11 +71,12 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo AbstractSkeleton.this.setAggressive(true); } }; - private boolean shouldBurnInDay = true; // Paper - shouldBurnInDay API + //private boolean shouldBurnInDay = true; // Paper - shouldBurnInDay API // Purpur - moved to LivingEntity; keep methods for ABI compatibility - API for any mob to burn daylight - protected AbstractSkeleton(EntityType type, Level level) { + protected AbstractSkeleton(final EntityType type, final Level level) { super(type, level); this.reassessWeaponGoal(); + this.setShouldBurnInDay(true); // Purpur - API for any mob to burn daylight } @Override -@@ -223,14 +224,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo - protected void readAdditionalSaveData(ValueInput input) { +@@ -228,7 +229,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo + protected void readAdditionalSaveData(final ValueInput input) { super.readAdditionalSaveData(input); this.reassessWeaponGoal(); - this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); // Paper - shouldBurnInDay API + //this.shouldBurnInDay = input.getBooleanOr("Paper.ShouldBurnInDay", true); // Paper - shouldBurnInDay API // Purpur - implemented in LivingEntity - API for any mob to burn daylight } - // Paper start - shouldBurnInDay API + // Paper start - silent equipping +@@ -254,7 +255,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo @Override protected void addAdditionalSaveData(final net.minecraft.world.level.storage.ValueOutput output) { super.addAdditionalSaveData(output); @@ -235,32 +230,32 @@ index 1ab860be69bcc1ab5cc07418c2d7e733afdc482b..60afd81d3bf671889fbff5d4a3fabb38 + //output.putBoolean("Paper.ShouldBurnInDay", this.shouldBurnInDay); // Purpur - implemented in LivingEntity - API for any mob to burn daylight } // Paper end - shouldBurnInDay API - + } diff --git a/net/minecraft/world/entity/monster/skeleton/Parched.java b/net/minecraft/world/entity/monster/skeleton/Parched.java -index 0920999cdea48a2bc94d98c2ccb23584182a1e45..7f80b66df5c1d68c894475b088154d0790ddd94f 100644 +index 36348e59c278e8842330e685340820c2ac9205eb..b14ea9e0f3de832fb73ae51728607486e399120b 100644 --- a/net/minecraft/world/entity/monster/skeleton/Parched.java +++ b/net/minecraft/world/entity/monster/skeleton/Parched.java @@ -17,6 +17,7 @@ import org.jspecify.annotations.Nullable; public class Parched extends AbstractSkeleton { - public Parched(EntityType type, Level level) { + public Parched(final EntityType type, final Level level) { super(type, level); + this.setShouldBurnInDay(false); // Purpur - API for any mob to burn daylight } @Override diff --git a/net/minecraft/world/entity/monster/zombie/Husk.java b/net/minecraft/world/entity/monster/zombie/Husk.java -index 928e2c95146bc3fc9b8c41c5b6c3970fc919bb15..31b91dbc3f3e1875fbe6750bb815514686d14f7f 100644 +index 8d6262e99fb3ad98d3142ee069f07d2370ca0778..02e935edd7a6cabbf2e6fcc6c96a9601bee71acc 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) { +@@ -35,6 +35,7 @@ public class Husk extends Zombie { + + public Husk(final EntityType type, final Level level) { super(type, level); + this.setShouldBurnInDay(false); // Purpur - API for any mob to burn daylight } // Purpur start - Ridables -@@ -84,7 +85,7 @@ public class Husk extends Zombie { +@@ -92,7 +93,7 @@ public class Husk extends Zombie { @Override public boolean isSunSensitive() { @@ -270,24 +265,24 @@ index 928e2c95146bc3fc9b8c41c5b6c3970fc919bb15..31b91dbc3f3e1875fbe6750bb8155146 @Override diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java -index 35f2607d3fdfcef11218e4b96477c8f8c798361e..7a26b05c15d23eb84e34d02905b3d5c12958c034 100644 +index 0777e4e0c3aa932699f124c83a571ce913327740..dffb152543d06380618c36cf89374b7d11336039 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 { +@@ -102,11 +102,12 @@ public class Zombie extends Monster { private boolean canBreakDoors = false; private int inWaterTime = 0; public int conversionTime; - private boolean shouldBurnInDay = true; // Paper - Add more Zombie API + //private boolean shouldBurnInDay = true; // Paper - Add more Zombie API // Purpur - implemented in LivingEntity - API for any mob to burn daylight - public Zombie(EntityType type, Level level) { + public Zombie(final EntityType type, final Level level) { super(type, level); this.breakDoorGoal = new BreakDoorGoal(this, com.google.common.base.Predicates.in(level.paperConfig().entities.behavior.doorBreakingDifficulty.getOrDefault(type, level.paperConfig().entities.behavior.doorBreakingDifficulty.get(EntityType.ZOMBIE)))); // Paper - Configurable door breaking difficulty + this.setShouldBurnInDay(true); // Purpur - API for any mob to burn daylight } - public Zombie(Level level) { -@@ -347,6 +348,7 @@ public class Zombie extends Monster { + public Zombie(final Level level) { +@@ -364,6 +365,7 @@ public class Zombie extends Monster { // CraftBukkit end } @@ -295,7 +290,7 @@ index 35f2607d3fdfcef11218e4b96477c8f8c798361e..7a26b05c15d23eb84e34d02905b3d5c1 public boolean isSunSensitive() { return this.shouldBurnInDay; // Paper - Add more Zombie API } -@@ -486,7 +488,7 @@ public class Zombie extends Monster { +@@ -505,7 +507,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); @@ -304,7 +299,7 @@ index 35f2607d3fdfcef11218e4b96477c8f8c798361e..7a26b05c15d23eb84e34d02905b3d5c1 } @Override -@@ -501,7 +503,7 @@ public class Zombie extends Monster { +@@ -520,7 +522,7 @@ public class Zombie extends Monster { } else { this.getEntityData().set(DATA_DROWNED_CONVERSION_ID, false); } diff --git a/purpur-server/minecraft-patches/unapplied-features/0018-Cows-naturally-aggressive-to-players-chance.patch b/purpur-server/minecraft-patches/features/0018-Cows-naturally-aggressive-to-players-chance.patch similarity index 78% rename from purpur-server/minecraft-patches/unapplied-features/0018-Cows-naturally-aggressive-to-players-chance.patch rename to purpur-server/minecraft-patches/features/0018-Cows-naturally-aggressive-to-players-chance.patch index afa3b58ca..f27987764 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0018-Cows-naturally-aggressive-to-players-chance.patch +++ b/purpur-server/minecraft-patches/features/0018-Cows-naturally-aggressive-to-players-chance.patch @@ -5,7 +5,7 @@ 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 ccdd439a89b7e7e10ee960cfe1e5e119d5367799..49292ae53f2b4554064daa4953a8cec00aa1fa98 100644 +index 34d2394006a006ea0773a52bb43b5cb3617470e5..7cd25e2b5e2e50b50fff00ca9e5c3a48ee2a3375 100644 --- a/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java +++ b/net/minecraft/world/entity/ai/attributes/DefaultAttributes.java @@ -135,7 +135,7 @@ public class DefaultAttributes { @@ -18,19 +18,19 @@ index ccdd439a89b7e7e10ee960cfe1e5e119d5367799..49292ae53f2b4554064daa4953a8cec0 .put(EntityType.NAUTILUS, Nautilus.createAttributes().build()) .put(EntityType.OCELOT, Ocelot.createAttributes().build()) diff --git a/net/minecraft/world/entity/animal/cow/Cow.java b/net/minecraft/world/entity/animal/cow/Cow.java -index bb8c75d20e6a1300d68ae75233962bdc26736c77..9fa18b190091bbfcb9a65d8d35f68fc7375f504f 100644 +index 7d3853d693a87e5225a16285631e0e2057685c1b..cdd404f64e196629dd61035675aac984619f1e1c 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; +@@ -25,6 +25,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 + private static final EntityDataAccessor> DATA_VARIANT_ID = SynchedEntityData.defineId(Cow.class, EntityDataSerializers.COW_VARIANT); - - public Cow(EntityType type, Level level) { -@@ -49,8 +51,9 @@ public class Cow extends AbstractCow { + private static final EntityDataAccessor> DATA_SOUND_VARIANT_ID = SynchedEntityData.defineId( + Cow.class, EntityDataSerializers.COW_SOUND_VARIANT +@@ -54,8 +56,9 @@ public class Cow extends AbstractCow { // Purpur start - Configurable entity base attributes @Override public void initAttributes() { @@ -42,7 +42,7 @@ index bb8c75d20e6a1300d68ae75233962bdc26736c77..9fa18b190091bbfcb9a65d8d35f68fc7 } // Purpur end - Configurable entity base attributes -@@ -68,6 +71,13 @@ public class Cow extends AbstractCow { +@@ -73,6 +76,13 @@ public class Cow extends AbstractCow { } // Purpur end - Toggle for water sensitive mob damage @@ -54,10 +54,10 @@ index bb8c75d20e6a1300d68ae75233962bdc26736c77..9fa18b190091bbfcb9a65d8d35f68fc7 + } + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); -@@ -80,6 +90,12 @@ public class Cow extends AbstractCow { - VariantUtils.writeVariant(output, this.getVariant()); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); +@@ -93,6 +103,12 @@ public class Cow extends AbstractCow { + ); } + // Purpur start - Cows naturally aggressive to players chance @@ -67,13 +67,13 @@ index bb8c75d20e6a1300d68ae75233962bdc26736c77..9fa18b190091bbfcb9a65d8d35f68fc7 + // Purpur end - Cows naturally aggressive to players chance + @Override - protected void readAdditionalSaveData(ValueInput input) { + protected void readAdditionalSaveData(final ValueInput input) { super.readAdditionalSaveData(input); -@@ -100,6 +116,7 @@ public class Cow extends AbstractCow { +@@ -116,6 +132,7 @@ public class Cow extends AbstractCow { public SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, final @Nullable SpawnGroupData groupData ) { + this.isNaturallyAggressiveToPlayers = level.getLevel().purpurConfig.cowNaturallyAggressiveToPlayersChance > 0.0D && random.nextDouble() <= level.getLevel().purpurConfig.cowNaturallyAggressiveToPlayersChance; // Purpur - Cows naturally aggressive to players chance VariantUtils.selectVariantToSpawn(SpawnContext.create(level, this.blockPosition()), Registries.COW_VARIANT).ifPresent(this::setVariant); - return super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData); - } + this.setSoundVariant(CowSoundVariants.pickRandomSoundVariant(this.registryAccess(), level.getRandom())); + return super.finalizeSpawn(level, difficulty, spawnReason, groupData); diff --git a/purpur-server/minecraft-patches/unapplied-features/0019-Mobs-always-drop-experience.patch b/purpur-server/minecraft-patches/features/0019-Mobs-always-drop-experience.patch similarity index 81% rename from purpur-server/minecraft-patches/unapplied-features/0019-Mobs-always-drop-experience.patch rename to purpur-server/minecraft-patches/features/0019-Mobs-always-drop-experience.patch index b36075fed..fbeecd2ac 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0019-Mobs-always-drop-experience.patch +++ b/purpur-server/minecraft-patches/features/0019-Mobs-always-drop-experience.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Mobs always drop experience diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index e83900f8d6adbe8a48294f250bd6cc6e3fad8160..b642f71d282773afb9fe273cbe65765afa2d5868 100644 +index 15bb425ed1569cbf445e81aa296039df8abc4746..1dfc4f04169b60c917d9df58b4217adcb80470f8 100644 --- a/net/minecraft/world/entity/ambient/Bat.java +++ b/net/minecraft/world/entity/ambient/Bat.java @@ -116,6 +116,13 @@ public class Bat extends AmbientCreature { @@ -23,10 +23,10 @@ index e83900f8d6adbe8a48294f250bd6cc6e3fad8160..b642f71d282773afb9fe273cbe65765a public boolean isFlapping() { return !this.isResting() && this.tickCount % 10.0F == 0.0F; diff --git a/net/minecraft/world/entity/animal/axolotl/Axolotl.java b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -index 947160c4dfc4e50bb75a1a797cb2f22602b22643..e5ac43bf5631254c31d91abb1c5de408807429dd 100644 +index a3a98df8ffeb33d86330b5561252eda596642da8..85986d2dc0c12a34f990e4262f79f813c9ff4cdf 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 { +@@ -157,6 +157,13 @@ public class Axolotl extends Animal implements Bucketable { } // Purpur end - Toggle for water sensitive mob damage @@ -38,13 +38,13 @@ index 947160c4dfc4e50bb75a1a797cb2f22602b22643..e5ac43bf5631254c31d91abb1c5de408 + // Purpur end - Mobs always drop experience + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final 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 e57200d6560a38cbecd681a30b75409412fce170..10dfa28ec46727e60f8a9c90d7e8914aa8b96ea1 100644 +index 4fba5ce59065ac024a0108726623dab894ae45c5..17ec9642772d02092768da5d5a1396d357199268 100644 --- a/net/minecraft/world/entity/animal/bee/Bee.java +++ b/net/minecraft/world/entity/animal/bee/Bee.java -@@ -499,6 +499,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -502,6 +502,13 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { } // Purpur end - Toggle for water sensitive mob damage @@ -59,10 +59,10 @@ index e57200d6560a38cbecd681a30b75409412fce170..10dfa28ec46727e60f8a9c90d7e8914a 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 +index 4a59e133fc6c68f3b3d495c62bb965718643f6b8..c75abd1befdbcf1ace817cf243a50945cf706e95 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 { +@@ -120,6 +120,13 @@ public class Chicken extends Animal { } // Purpur end - Toggle for water sensitive mob damage @@ -77,10 +77,10 @@ index 6308bb606b34d781e315f56a55e6544b3c156d85..341d6ecefb126be61b5f43a73638847e 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 +index cdd404f64e196629dd61035675aac984619f1e1c..8e90f9163bcd93691bb40d1db02e06381ebe0182 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 { +@@ -76,6 +76,13 @@ public class Cow extends AbstractCow { } // Purpur end - Toggle for water sensitive mob damage @@ -95,7 +95,7 @@ index 9fa18b190091bbfcb9a65d8d35f68fc7375f504f..1463e94d3851614caee216b50e90d198 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 +index d3e5e12c4e3c168a3a15d611f8ae5845ee365080..07a1df530fcd5d684cbba4414ea0fa2010cbdb5b 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 { @@ -110,13 +110,13 @@ index a8e6e703a51130066547724dd08bdfe5e11c99e5..3327b93f095b6b6b6d5620bffd03232d + // Purpur end - Mobs always drop experience + @Override - public float getWalkTargetValue(BlockPos pos, LevelReader level) { + public float getWalkTargetValue(final BlockPos pos, final 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 e3646a05c6cb973fad36297cc18cf48587a6f5cd..ea3ccc1f39f70c8ce407ed94ab19a3caa3b90dc4 100644 +index c372a2cc7ec9ac03629a73a45bfc58f77894d63b..4f39f0213f4af3589ed53c7238c91b4300a3b174 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 { +@@ -169,6 +169,13 @@ public class Dolphin extends AgeableWaterCreature { } // Purpur end - Toggle for water sensitive mob damage @@ -129,9 +129,9 @@ index e3646a05c6cb973fad36297cc18cf48587a6f5cd..ea3ccc1f39f70c8ce407ed94ab19a3ca + @Override public @Nullable SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, final @Nullable SpawnGroupData groupData diff --git a/net/minecraft/world/entity/animal/equine/Donkey.java b/net/minecraft/world/entity/animal/equine/Donkey.java -index 6cf6853c244b7589d2a57e7ae77933d4a1503ccd..ca02355276286a88d618467d9191d648a3cf7b12 100644 +index 5e0846fcaccfab5edbeb90bc61c2360cecf7a0c4..d58d70173bc475dd22d9d4f36a9cae8d0942e050 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 { @@ -149,10 +149,10 @@ index 6cf6853c244b7589d2a57e7ae77933d4a1503ccd..ca02355276286a88d618467d9191d648 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 +index 64603ad973bdb697ca75642e8e42e7052efd4191..5d643be94db358e4093cbb00659a4e9066dddd4a 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 { +@@ -86,6 +86,13 @@ public class Horse extends AbstractHorse { } // Purpur end - Toggle for water sensitive mob damage @@ -164,13 +164,13 @@ index 1c17ab94901ce1c6370670c06bf0801ee6b5b393..bb7ae0bc176fc873b0e1c760b62c5c4e + // Purpur end - Mobs always drop experience + @Override - protected void randomizeAttributes(RandomSource random) { + protected void randomizeAttributes(final 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 +index e277a58a1c761198f59b987c95567b6e4d9c440b..fe9d0b7bc5ad62a5455a78ffb6cd04a1b8115932 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 { +@@ -165,6 +165,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { } // Purpur end - Toggle for water sensitive mob damage @@ -185,7 +185,7 @@ index eb2fc0e6d497241f1b4f3971155b10d14f5427f8..eef4b602bd03df53823da6f576246c33 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 +index 291176b409097d15c2afff7fe8deb17ba07dbc12..8425956ded89a1ffe5a56f410f155092250ac78c 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 { @@ -203,7 +203,7 @@ index 9bafe3e204b3e4624a95b130552c8230c0835a30..8514c0b7657366a1c40217b950c74c95 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 +index 9365609fad67377ffe18e11c7959e0d92367852a..16b26b4c19681b48fef9110e050145c736097adb 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 { @@ -221,7 +221,7 @@ index 3865937e4a56636cde44f7d8f16873ae16512323..2502716b8efe4584fba9d9f9989ba9cb 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 +index a9fcf7827e6a6b061c2a861d1e59bca80117699b..78a22fb382da7623bd05f5ff097fe06fc0dfec1c 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 { @@ -239,10 +239,10 @@ index 4c07cd57aa3518adb4bc9b1213cc572a5b81f935..0515d1071324d82c14be4b9e97c8a583 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 45bb4df25015568f0758095d9a309633bed520f3..63557a6c2b87e1ee4348cab61df5d900c2c1c48e 100644 +index 426b468ee821a7441d15dae3634032535cb60725..54cbd5136997bdec34df0f822e21ffe5046936d6 100644 --- a/net/minecraft/world/entity/animal/equine/ZombieHorse.java +++ b/net/minecraft/world/entity/animal/equine/ZombieHorse.java -@@ -96,6 +96,13 @@ public class ZombieHorse extends AbstractHorse { +@@ -93,6 +93,13 @@ public class ZombieHorse extends AbstractHorse { } // Purpur end - Toggle for water sensitive mob damage @@ -257,7 +257,7 @@ index 45bb4df25015568f0758095d9a309633bed520f3..63557a6c2b87e1ee4348cab61df5d900 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 +index 0493926c7918059d82bafd20fed0883bb331bd55..74acd2066aa05eb732645912eba7b24252a57f7e 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 { @@ -273,9 +273,9 @@ index 92b67565485b2fade3e80fb4b944edfc12d9e0a2..4422cc2f0ed1b603348f3f5c0d6650f8 + @Override protected void registerGoals() { - this.temptGoal = new Cat.CatTemptGoal(this, 0.6, stack -> stack.is(ItemTags.CAT_FOOD), true); + this.temptGoal = new Cat.CatTemptGoal(this, 0.6, i -> i.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 +index 9a582b789d3b3037c510c063a07f99f92ac58a1c..2fbb1668448ca7f1d2e08293a0a3e81c6a0d13a4 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 { @@ -293,7 +293,7 @@ index 13272516003f763d2c69dc599c8ff7696bec718b..8583fefcb37dc043293bf622b5a25adb 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 +index f44214eaa47c2021f7ca9c84a7b89be15fecb5bc..7d4bfca8b2608c18fc96e14f1ef9121230e27a53 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 { @@ -311,7 +311,7 @@ index 8655aae805f239cbd049065232293854b18c73cf..05de579a16726454034dc4a913161676 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 414d79f9d1fbd9857c8baeb2888017d45f34f02b..681eb25e45cec76f21cea9f77efe71290bdb547a 100644 +index 17dba2f70251c2d5f75cc116b300f328f117cecb..3d84c136fa944beed72ee2fb8f441bcb4031e233 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 { @@ -326,13 +326,13 @@ index 414d79f9d1fbd9857c8baeb2888017d45f34f02b..681eb25e45cec76f21cea9f77efe7129 + // Purpur end - Mobs always drop experience + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/fish/Salmon.java b/net/minecraft/world/entity/animal/fish/Salmon.java -index 424bd56ec9df8bd0a80d2fa79bc4f482eae2ab5c..b76b2c1e7ac93fe01bdf9ee6e3c811f448babcbb 100644 +index ba75ba1130c4fe5f4d7b29c624a17becd2a71c99..ca5cc7569205b450e53d6e8feb87ecaa2169a67f 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 { +@@ -67,6 +67,13 @@ public class Salmon extends AbstractSchoolingFish { } // Purpur end - Toggle for water sensitive mob damage @@ -347,7 +347,7 @@ index 424bd56ec9df8bd0a80d2fa79bc4f482eae2ab5c..b76b2c1e7ac93fe01bdf9ee6e3c811f4 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 +index 17bc569bf97026e2c072633f1ad6e9e0102c137a..fc500f1ca1d4280519f418cac21688c3632d251b 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 { @@ -361,14 +361,14 @@ index 04c30c60c76122018fa69cf1f3f64cae8ed62fad..c7742f06cf2bed3496c28b541e45948e + } + // Purpur end - Mobs always drop experience + - public static String getPredefinedName(int variantId) { - return "entity.minecraft.tropical_fish.predefined." + variantId; + public static String getPredefinedName(final int index) { + return "entity.minecraft.tropical_fish.predefined." + index; } diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java -index bc119c2f61adb6c6122119fda1df437bab40f9b4..f35f845e3e18c0bb0e4a076298c30be2ae479792 100644 +index aa419e7cb456f664c1eca1286777caca6bd10e7a..335da522a9b96ebc852b4ed5f22f9fd71aec23a8 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 { +@@ -215,6 +215,13 @@ public class Fox extends Animal { } // Purpur end - Toggle for water sensitive mob damage @@ -380,13 +380,13 @@ index bc119c2f61adb6c6122119fda1df437bab40f9b4..f35f845e3e18c0bb0e4a076298c30be2 + // Purpur end - Mobs always drop experience + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/animal/goat/Goat.java b/net/minecraft/world/entity/animal/goat/Goat.java -index e5f5bc2c4b4f36e0e911b2c5ef67ef6e0d4cd0b1..64916356de4b9981e04c5befef15b067914f6d75 100644 +index 0d40bbd8c42178c712f23300364138389ecde548..afc1119a6b562013a09a607ecc430d7bd46e6c82 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 { +@@ -131,6 +131,13 @@ public class Goat extends Animal { } // Purpur end - Toggle for water sensitive mob damage @@ -398,13 +398,13 @@ index e5f5bc2c4b4f36e0e911b2c5ef67ef6e0d4cd0b1..64916356de4b9981e04c5befef15b067 + // Purpur end - Mobs always drop experience + @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/animal/golem/CopperGolem.java b/net/minecraft/world/entity/animal/golem/CopperGolem.java -index e143db15040f8d5be5d07e04a41b7afaf42b4331..493d1678592bce78a15adeb4c9435fdc8e9dab8a 100644 +index 078cb2f09e9aaf05bb965a27b90f34c7c3a4147d..019aec1465be095edff6952a1f36041f030f7cb0 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 +@@ -151,6 +151,13 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab } // Purpur end - Toggle for water sensitive mob damage @@ -419,7 +419,7 @@ index e143db15040f8d5be5d07e04a41b7afaf42b4331..493d1678592bce78a15adeb4c9435fdc 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 d31c1f1b681922ca8f1657ffa333e8a6794e619f..ddde4297b77d174034300165b591a224c0401743 100644 +index 77996312597da9a2bbcf89f798c10a0be0abcd39..880a53a2f023f5bd4a112a964aceee6dcac109b1 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 { @@ -437,10 +437,10 @@ index d31c1f1b681922ca8f1657ffa333e8a6794e619f..ddde4297b77d174034300165b591a224 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 94d319a8fba3a437fb55aa7daaaba0c5c9acbb3b..c37c999671955eeaff0b145a890a512c78d642a8 100644 +index 2d3127f6846ff9eda1a0b89764dc837da6e7e0c7..ffb0e9cc4f8604fd03cb3a2412001182fb47bce8 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 +@@ -87,6 +87,13 @@ public class SnowGolem extends AbstractGolem implements RangedAttackMob, Shearab } // Purpur end - Configurable entity base attributes @@ -455,10 +455,10 @@ index 94d319a8fba3a437fb55aa7daaaba0c5c9acbb3b..c37c999671955eeaff0b145a890a512c 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 828793aaa2992fd1077040309154f814b302476a..8034ce67266b6baab35c72eaebf5ad67fc1a29c6 100644 +index d3367430da307e2c0748874cbe77f265860152a0..908e26a3aeb843585d9938f588d33b5bb5326ebe 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 { +@@ -168,6 +168,13 @@ public class HappyGhast extends Animal { } // Purpur end - Toggle for water sensitive mob damage @@ -473,10 +473,10 @@ index 828793aaa2992fd1077040309154f814b302476a..8034ce67266b6baab35c72eaebf5ad67 protected void ageBoundaryReached() { if (this.isBaby()) { diff --git a/net/minecraft/world/entity/animal/nautilus/Nautilus.java b/net/minecraft/world/entity/animal/nautilus/Nautilus.java -index 98199869b70c7c0f2b744ac74961c77d473617ca..7c4467933061f097425d6c82188a65fd5e4c4d3b 100644 +index e89c0638f7b6d1a463a895dbab5994c15aa4add3..e4c7f1aa39443b26758caac252fe90b2b766b707 100644 --- a/net/minecraft/world/entity/animal/nautilus/Nautilus.java +++ b/net/minecraft/world/entity/animal/nautilus/Nautilus.java -@@ -39,6 +39,13 @@ public class Nautilus extends AbstractNautilus { +@@ -46,6 +46,13 @@ public class Nautilus extends AbstractNautilus { } // Purpur end - Make entity breeding times configurable @@ -488,13 +488,13 @@ index 98199869b70c7c0f2b744ac74961c77d473617ca..7c4467933061f097425d6c82188a65fd + // Purpur end - Mobs always drop experience + @Override - protected Brain.Provider brainProvider() { - return NautilusAi.brainProvider(); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java b/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java -index 7dd933dd38fc50e870bc74e5a54e2b50a85fa6f3..51d3a5f0aec8794cfd1ccefffea9947b0e49e693 100644 +index ab97449bfa5e8b5615e0f2b6b16be2fe7e4233fd..869cec108d33626362400e9aa4890a92e49151e4 100644 --- a/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java +++ b/net/minecraft/world/entity/animal/nautilus/ZombieNautilus.java -@@ -62,6 +62,13 @@ public class ZombieNautilus extends AbstractNautilus { +@@ -67,6 +67,13 @@ public class ZombieNautilus extends AbstractNautilus { } // Purpur end - Make entity breeding times configurable @@ -509,10 +509,10 @@ index 7dd933dd38fc50e870bc74e5a54e2b50a85fa6f3..51d3a5f0aec8794cfd1ccefffea9947b return AbstractNautilus.createAttributes().add(Attributes.MOVEMENT_SPEED, 1.1F); } diff --git a/net/minecraft/world/entity/animal/panda/Panda.java b/net/minecraft/world/entity/animal/panda/Panda.java -index e9aa07dea0515f53a08a7066fa9e23e0ee69d69e..5116e9e16070e23d13b526d21facb7b5ad0988ba 100644 +index f97b8feaedb84baf479998cef7257231f85412d6..72ced157956c6a809d8d9f21027f21c0465b8677 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 { +@@ -160,6 +160,13 @@ public class Panda extends Animal { } // Purpur end - Toggle for water sensitive mob damage @@ -524,10 +524,10 @@ index e9aa07dea0515f53a08a7066fa9e23e0ee69d69e..5116e9e16070e23d13b526d21facb7b5 + // Purpur end - Mobs always drop experience + @Override - protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) { + protected boolean canDispenserEquipIntoSlot(final 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 +index d756d6931dbf560fef5cb9641ace6f091fbcfff9..5abbc7ef864dde0ae05ae0520518997520e8bcf6 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 { @@ -543,12 +543,12 @@ index e97782bc8232120d4e7d1feeb8ca87fd37a1fcf9..bbe3977939004b7d77e38b14d48c9c26 + @Override public @Nullable SpawnGroupData finalizeSpawn( - ServerLevelAccessor level, DifficultyInstance difficulty, EntitySpawnReason spawnReason, @Nullable SpawnGroupData spawnGroupData + final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, @Nullable SpawnGroupData groupData diff --git a/net/minecraft/world/entity/animal/pig/Pig.java b/net/minecraft/world/entity/animal/pig/Pig.java -index 020932539727739b54ed2f7899cbf11ad940f4df..45142ce558ef28455f9b74ca81d51b3ecdb7a458 100644 +index 05141bc41dc5181a8f0526528147e7a6c015a707..d699b79ffc603555213434fecc389b1882c1eef0 100644 --- a/net/minecraft/world/entity/animal/pig/Pig.java +++ b/net/minecraft/world/entity/animal/pig/Pig.java -@@ -102,6 +102,13 @@ public class Pig extends Animal implements ItemSteerable { +@@ -107,6 +107,13 @@ public class Pig extends Animal implements ItemSteerable { } // Purpur end - Toggle for water sensitive mob damage @@ -563,10 +563,10 @@ index 020932539727739b54ed2f7899cbf11ad940f4df..45142ce558ef28455f9b74ca81d51b3e 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 +index 2a28c9ef361909aa0c3946ed6857f7d340c8cfc0..5e218adce80f2d8d64cca54894abffaf6eb0baa0 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 { +@@ -141,6 +141,13 @@ public class PolarBear extends Animal implements NeutralMob { } // Purpur end - Toggle for water sensitive mob damage @@ -578,13 +578,13 @@ index 13d26a6981d6907f35f1f2bde93934c7c1fe8120..592711e205ee959cc66de80933ad5a2d + // Purpur end - Mobs always drop experience + @Override - public @Nullable AgeableMob getBreedOffspring(ServerLevel level, AgeableMob partner) { + public @Nullable AgeableMob getBreedOffspring(final ServerLevel level, final 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 +index 7dade80db9430e4db587ed23df992d70c6b7ee04..937ce47e45698392fad3fdc6eeb85e7869b679de 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 { +@@ -184,6 +184,13 @@ public class Rabbit extends Animal { } // Purpur end - Toggle for water sensitive mob damage @@ -599,7 +599,7 @@ index b1c72047f7aa63f62b0ad0274811b587b1d3486b..c39004a546c28c9f8af26e727c67dbff 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 7eca49c9237c61ab12f60ff16085aa8fd10c99ac..d712673d237f4e4d99a714ddf09c4582387f0e3c 100644 +index 0ceaa6dd493d0258c419d8b5c4394b35c0808704..55cc6040e606918042c76a7bc6cbe1a1b965c407 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 { @@ -617,7 +617,7 @@ index 7eca49c9237c61ab12f60ff16085aa8fd10c99ac..d712673d237f4e4d99a714ddf09c4582 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 +index 1fa3d614dd1c45ec42caffbe92e3f8db02b399b1..0f4587df333a68627d6db18c0583ae1e7b936b15 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 { @@ -635,10 +635,10 @@ index 2aa2a84a7ada369c45a85119a933eb92297af4dc..dd1bd8b1a348a0cc398b123a77d3cb28 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 +index e350763a3a22d825a25f02b60bd4c9223aa81f62..0a3327e22f5a2e30c70248ab46078e50281bd429 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 { +@@ -111,6 +111,13 @@ public class Squid extends AgeableWaterCreature { } // Purpur end - Toggle for water sensitive mob damage @@ -653,7 +653,7 @@ index e307ebfb8b2781b6175b520e148e6bd58d2b9dc4..6b5be8e58aa7e3acd14ff3cb1ba25d15 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 +index 6d09c0de38f2c91d2a0ab6dd0b694ab42b48a981..37345edf599a43ac48274e30f5d7aa340051c649 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 { @@ -667,14 +667,14 @@ index 7d5987fe641646ecbf8e389d57a0a9a04e9c0959..a3f2076e6f0e51ac51a8af94cae91baf + } + // Purpur end - Mobs always drop experience + - public void setHomePos(BlockPos homePos) { - this.homePos = homePos; + public void setHomePos(final BlockPos pos) { + this.homePos = pos; } diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index 20f945ee06bcdb4736e6d3a8b20a5cbd3d79df0f..7fbe841818d08fd930f7ce405e84e5ed4badb614 100644 +index 781cac493f909b02483e5c4064cc2cc791b1dabd..fed2456921421eb6c95a4d713a4bd0ed64c1415a 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -230,6 +230,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -227,6 +227,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Toggle for water sensitive mob damage @@ -689,10 +689,10 @@ index 20f945ee06bcdb4736e6d3a8b20a5cbd3d79df0f..7fbe841818d08fd930f7ce405e84e5ed 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 4afa484099c7f813d5ae8c7cc8721a0d033c8e6e..c25ed738b088fb517d76c038a1ad47cae3f7ecbc 100644 +index 10818999c4e796a4dfd5a7dd21772c9eb8ca2579..4677996d778fbd1ffa7c1278bf4ebd8ce1097eb9 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -227,6 +227,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -229,6 +229,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Toggle for water sensitive mob damage @@ -704,10 +704,10 @@ index 4afa484099c7f813d5ae8c7cc8721a0d033c8e6e..c25ed738b088fb517d76c038a1ad47ca + // Purpur end - Mobs always drop experience + @Override - protected PathNavigation createNavigation(Level level) { + protected PathNavigation createNavigation(final 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 e2afd7677986c70dd924017e8822fd6abd808f48..187da2d55cdb039b62abe708dadd6c05e13ac64f 100644 +index 7f0e76437798f1bab7956722382e1517f8f71121..257563b578762837cbea855fa42831f34fa4e7ba 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 { @@ -725,7 +725,7 @@ index e2afd7677986c70dd924017e8822fd6abd808f48..187da2d55cdb039b62abe708dadd6c05 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/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index b0ed96c243f9abb3868d92bb513ad1620aa8e269..608d787b73dce1726ccece9e0372acf995f261d4 100644 +index 80327a6ba1da0145f087a7946c7a4dfb6d947ce7..46a769f2960fd4a35305231b84c56ff36d622d8f 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 { @@ -740,10 +740,10 @@ index b0ed96c243f9abb3868d92bb513ad1620aa8e269..608d787b73dce1726ccece9e0372acf9 + // Purpur end - Mobs always drop experience + @Override - public SoundEvent getHurtSound(DamageSource damageSource) { + public SoundEvent getHurtSound(final DamageSource source) { return SoundEvents.CREEPER_HURT; diff --git a/net/minecraft/world/entity/monster/ElderGuardian.java b/net/minecraft/world/entity/monster/ElderGuardian.java -index 1ea323a17440abbe36c9528e80e169816267005b..abb7496c293175828fde54ae2b4991aa3ff6b30f 100644 +index a98967c7a76d8e25da9e31eaa8f2ae0bf0704c9d..54d3ab3cb7521f4f75bdd05b7fcf35e7195aa83d 100644 --- a/net/minecraft/world/entity/monster/ElderGuardian.java +++ b/net/minecraft/world/entity/monster/ElderGuardian.java @@ -58,6 +58,13 @@ public class ElderGuardian extends Guardian { @@ -761,7 +761,7 @@ 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 47c621f01658f3392b58f3f5c1f31bd539f63dd6..c90a955b14ae10037f31c7e9b8a86df3323602cc 100644 +index 8862ad857a4c99defe7621c59d8f3ef77ab7aff4..8979340756abaec961b2263146c1e1e79d144117 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java @@ -114,6 +114,13 @@ public class EnderMan extends Monster implements NeutralMob { @@ -779,7 +779,7 @@ index 47c621f01658f3392b58f3f5c1f31bd539f63dd6..c90a955b14ae10037f31c7e9b8a86df3 protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/monster/Endermite.java b/net/minecraft/world/entity/monster/Endermite.java -index b5e620d62702e3330f5ced19f1baeb82bdc801ec..972006a17c887f9380b1549de8a47e4d265e6e69 100644 +index 859d490dd3be2843dde3a811bcc0d51e3eae76f0..b93a5d46ccf7b2dad6afbd15884f8d8ae60cdb5a 100644 --- a/net/minecraft/world/entity/monster/Endermite.java +++ b/net/minecraft/world/entity/monster/Endermite.java @@ -79,6 +79,13 @@ public class Endermite extends Monster { @@ -797,7 +797,7 @@ index b5e620d62702e3330f5ced19f1baeb82bdc801ec..972006a17c887f9380b1549de8a47e4d protected void registerGoals() { this.goalSelector.addGoal(1, new FloatGoal(this)); diff --git a/net/minecraft/world/entity/monster/Ghast.java b/net/minecraft/world/entity/monster/Ghast.java -index 443eb9f12d6df950c59c9d4db4853087fd23d24e..673d4e06d6dc4c94ddaafcdc86cbdbd686964ddd 100644 +index 89a2097c2c26dae7f12ddbac10bc091ec7f228d7..753ba768318b2ecda5efdbd00b408aa7e1b2c56b 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 { @@ -815,7 +815,7 @@ index 443eb9f12d6df950c59c9d4db4853087fd23d24e..673d4e06d6dc4c94ddaafcdc86cbdbd6 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/Giant.java b/net/minecraft/world/entity/monster/Giant.java -index f1176f73d4468b2f39e48fe5454c5f5bf481afd9..9a081135025f114d473c50e68a778e034f33ab82 100644 +index 43ebfe06ce2a8c15787d72a8ef54cd6c7cac2bfc..07dfe0e6fd431b8417fc7f823962e4d4ad13cac5 100644 --- a/net/minecraft/world/entity/monster/Giant.java +++ b/net/minecraft/world/entity/monster/Giant.java @@ -69,6 +69,13 @@ public class Giant extends Monster { @@ -833,7 +833,7 @@ index f1176f73d4468b2f39e48fe5454c5f5bf481afd9..9a081135025f114d473c50e68a778e03 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 9948511659de9222a19f6b9f660e4441ea98a4a9..60490d0611a352ba0546b39fd41259713a7f18b5 100644 +index 9ca62d9663fc2e8eb49780ceb7ff38e0363a09a6..ef66a8e8973e0af6a3826b7b6819b9bf89af86dd 100644 --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java @@ -104,6 +104,13 @@ public class Guardian extends Monster { @@ -849,9 +849,9 @@ index 9948511659de9222a19f6b9f660e4441ea98a4a9..60490d0611a352ba0546b39fd4125971 + @Override protected void registerGoals() { - MoveTowardsRestrictionGoal moveTowardsRestrictionGoal = new MoveTowardsRestrictionGoal(this, 1.0); + MoveTowardsRestrictionGoal goal = new MoveTowardsRestrictionGoal(this, 1.0); diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java -index 1bf9d04e5e44272b02753290995795f194cbdae1..765a0d0376e344d2f108a5abe97e654bd972c80b 100644 +index fba41f261e57a050d4e24d2611cc27edcbb84ddf..4e757fc7d49c22f79eceafc02ff05da5ea4a04e9 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 { @@ -869,10 +869,10 @@ index 1bf9d04e5e44272b02753290995795f194cbdae1..765a0d0376e344d2f108a5abe97e654b 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 ff944ad57d4e9e4a910cd63282e5e7594626365e..1f3389185ccf997165dc2caf9f78ec560cfd68bd 100644 +index 6b6eed1c636f2ca65d0cbcd71e96bdd1b2063267..2b799c73bb384bdb778edda66bbb00c4ba70a2bf 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -136,6 +136,13 @@ public class Phantom extends Mob implements Enemy { +@@ -137,6 +137,13 @@ public class Phantom extends Mob implements Enemy { } // Purpur end - Toggle for water sensitive mob damage @@ -887,10 +887,10 @@ index ff944ad57d4e9e4a910cd63282e5e7594626365e..1f3389185ccf997165dc2caf9f78ec56 public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; diff --git a/net/minecraft/world/entity/monster/Ravager.java b/net/minecraft/world/entity/monster/Ravager.java -index ad2913b02ded9b5087c69ba279cebfd81d9ef75e..5e6fd02985eef337f2ff8e48fbd904a064c0560a 100644 +index bb19e3f2e6522e8b7db32061c0ae2b2a37679369..8dc443aa7847789117f6cb86415d6dd082a93e2f 100644 --- a/net/minecraft/world/entity/monster/Ravager.java +++ b/net/minecraft/world/entity/monster/Ravager.java -@@ -110,6 +110,13 @@ public class Ravager extends Raider { +@@ -108,6 +108,13 @@ public class Ravager extends Raider { } // Purpur end - Toggle for water sensitive mob damage @@ -905,10 +905,10 @@ index ad2913b02ded9b5087c69ba279cebfd81d9ef75e..5e6fd02985eef337f2ff8e48fbd904a0 protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index 0a5a6f23cd8e4317db4e7c0ba8883e99f3aff148..2b73382e5bcf47da483ea88e2eae480ebb48e8f9 100644 +index cf49a580c8dacb895b7a8ec2531d3afee2ffc30c..62bf636b9fb0f13ef7d5787001df0902719bcadf 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -140,6 +140,13 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -142,6 +142,13 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Toggle for water sensitive mob damage @@ -923,7 +923,7 @@ index 0a5a6f23cd8e4317db4e7c0ba8883e99f3aff148..2b73382e5bcf47da483ea88e2eae480e 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 c64509a5027de1369bde610feba7a39aa5b404fd..ba80f86980b6789bf944a4350b6f89d644cc283d 100644 +index 205c05f46d70d37e11a0e35c97128e0c20b94e23..b45f8eb2bd1d9b3c91716bf329febe92620e315f 100644 --- a/net/minecraft/world/entity/monster/Silverfish.java +++ b/net/minecraft/world/entity/monster/Silverfish.java @@ -72,6 +72,13 @@ public class Silverfish extends Monster { @@ -941,7 +941,7 @@ index c64509a5027de1369bde610feba7a39aa5b404fd..ba80f86980b6789bf944a4350b6f89d6 protected void registerGoals() { this.friendsGoal = new Silverfish.SilverfishWakeUpFriendsGoal(this); diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java -index c4222e17d9a1f4cba6a74099a167cff13856f3e3..29d6d0c9687b835d24fe51c3824deeb67af1ba4f 100644 +index 556930ac4d06b4f46a87d237857006729fea5ef5..dd21ca5047d16af2d7ed28c97976d845eab1b470 100644 --- a/net/minecraft/world/entity/monster/Slime.java +++ b/net/minecraft/world/entity/monster/Slime.java @@ -142,6 +142,13 @@ public class Slime extends Mob implements Enemy { @@ -959,10 +959,10 @@ index c4222e17d9a1f4cba6a74099a167cff13856f3e3..29d6d0c9687b835d24fe51c3824deeb6 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/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index 758887f3fcec2bf0946cddb184e19a1c9b64eee3..37b0c8f55ed4ac4feac6a35bd4377007a19ea2ce 100644 +index 1b6137674d807ed29d56e3f3120abe60254274e1..7c05c394138699c199e2044325d294826796217c 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 { +@@ -125,6 +125,13 @@ public class Strider extends Animal implements ItemSteerable { } // Purpur end - Make entity breeding times configurable @@ -974,13 +974,13 @@ index 758887f3fcec2bf0946cddb184e19a1c9b64eee3..37b0c8f55ed4ac4feac6a35bd4377007 + // Purpur end - Mobs always drop experience + public static boolean checkStriderSpawnRules( - EntityType entityType, LevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random - ) { + final EntityType ignoredType, + final LevelAccessor level, diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index 6ead673c44891c6b1c1688f80bf299527d7bc777..acd196d435758a8730569ba4e772bb954c4f85b6 100644 +index c7700ff6b7faf06116626ad95e11cd4604751eda..97177c9f1982e348e4987f254a9daeeac5da1cbe 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -117,6 +117,13 @@ public class Vex extends Monster implements TraceableEntity { +@@ -118,6 +118,13 @@ public class Vex extends Monster implements TraceableEntity { } // Purpur end - Toggle for water sensitive mob damage @@ -995,7 +995,7 @@ index 6ead673c44891c6b1c1688f80bf299527d7bc777..acd196d435758a8730569ba4e772bb95 public boolean isFlapping() { return this.tickCount % TICKS_PER_FLAP == 0; diff --git a/net/minecraft/world/entity/monster/Witch.java b/net/minecraft/world/entity/monster/Witch.java -index 86d9952ed0f692e8f229b0c0bcb6cacf53a00c8b..97a427faa37ce9b0c558da40d582b16ac1e96da2 100644 +index bfa222c9b61bc2d20927fdf08e8baa5fda4fdbdc..f05beafdbc3f1dcf0413bb2b9f8dbcdd35532867 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 { @@ -1013,10 +1013,10 @@ index 86d9952ed0f692e8f229b0c0bcb6cacf53a00c8b..97a427faa37ce9b0c558da40d582b16a protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Zoglin.java b/net/minecraft/world/entity/monster/Zoglin.java -index e2708eb836d60588c1bedb75c520e5007185034a..d6de61ed4415cd00858375406567ea9407030e1e 100644 +index 15e5e3c63ec9bddaf19636e27dd21d12df9318ce..547e9a61779b653c9f59fb04c03d8c2b4ee16e8e 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 { +@@ -108,6 +108,13 @@ public class Zoglin extends Monster implements HoglinBase { } // Purpur end - Toggle for water sensitive mob damage @@ -1028,13 +1028,13 @@ index e2708eb836d60588c1bedb75c520e5007185034a..d6de61ed4415cd00858375406567ea94 + // Purpur end - Mobs always drop experience + @Override - protected Brain.Provider brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/monster/hoglin/Hoglin.java b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -index 5e3f7005a7167c786038823a8437ad2e90a41d2c..460640f5512be6553f1ec69e20e27c7cc797068b 100644 +index d001cf955dba66435079eb2cc30e05aec963d2c6..b8c764cc274f43073a460a4c8643e0cb87d808ad 100644 --- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java +++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java -@@ -136,6 +136,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { +@@ -112,6 +112,13 @@ public class Hoglin extends Animal implements Enemy, HoglinBase { } // Purpur end - Toggle for water sensitive mob damage @@ -1046,13 +1046,13 @@ index 5e3f7005a7167c786038823a8437ad2e90a41d2c..460640f5512be6553f1ec69e20e27c7c + // Purpur end - Mobs always drop experience + @VisibleForTesting - public void setTimeInOverworld(int timeInOverworld) { + public void setTimeInOverworld(final 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 +index 75276deb3208437fce669f9e483ff6c7a99d69a3..452ed8d77c84c26c711531f36f47e84b7379361f 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 { +@@ -82,6 +82,13 @@ public class Evoker extends SpellcasterIllager { } // Purpur end - Toggle for water sensitive mob damage @@ -1067,10 +1067,10 @@ index c4f45f6303a46ad54991c9013608a4e5ba8b9fee..1572f7653045902fa05f0499d920eb2b 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 +index 32b8f638ea26494cae648f4bb48a664ce2a5021e..fefb7927cb9b906e00b68f43e947504dec97f52e 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 { +@@ -94,6 +94,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } // Purpur end - Toggle for water sensitive mob damage @@ -1085,7 +1085,7 @@ index 32278f51f4973d1294e52f0775697e9f5b295ee0..ea9b61b6f8463edf3497d240b010f8da 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 +index bd9092a0fecef475bde06d94bc2f6726f21404fd..e69514bf39e2acfc909cb55b1704ca3f56f704e2 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 @@ -1103,7 +1103,7 @@ index 6190286ab2f454382d497b4fce47632e6f771215..68fe150d0da04084690670f29a0a4ea0 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 +index aab0bd86da31ca73efc4988fa34c906886139ec3..c29a1aea5c09ade40e36f4cb00a677b31ad91069 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 { @@ -1121,10 +1121,10 @@ index 86b463a16e8630af4918ea43a2546995aa00244f..367c74123ee9d07795527eec6ba2f83a 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 d6c834914ddea76280466bf0f7d001a76af34f08..49ed463ae7ef65b2630a5b914689e04fa729a40c 100644 +index de86e23b377ca0727d5f5234f2bc63180ddbbad2..47bcb895bf4c6f438bb0bb82f84331487fd28c0c 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -173,6 +173,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -140,6 +140,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento } // Purpur end - Toggle for water sensitive mob damage @@ -1136,13 +1136,13 @@ index d6c834914ddea76280466bf0f7d001a76af34f08..49ed463ae7ef65b2630a5b914689e04f + // Purpur end - Mobs always drop experience + @Override - protected void addAdditionalSaveData(ValueOutput output) { + protected void addAdditionalSaveData(final 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 4bf2038fea712e65f420ade915a18470b79318fc..7baccc23f868ac9b8720bfd77b2af6b7dd368820 100644 +index 79e084304cec441966a22f0028e021d19e49bfd3..0755e3ed3b940609f0211d123c0c664905af56b5 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 { +@@ -82,6 +82,13 @@ public class PiglinBrute extends AbstractPiglin { } // Purpur end - Toggle for water sensitive mob damage @@ -1157,7 +1157,7 @@ index 4bf2038fea712e65f420ade915a18470b79318fc..7baccc23f868ac9b8720bfd77b2af6b7 return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java -index 30d79be765118a50e2e2c5bfde6bf6bbc957cf40..03e441e7e9033961dbcf60e574fae48621513c87 100644 +index a2fc1cf5fa77c1cc78610ce0b4bbd35a371878a0..7d0c6fe7290e8ad44c451b431778e1b7fe37c6e5 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 { @@ -1172,10 +1172,10 @@ index 30d79be765118a50e2e2c5bfde6bf6bbc957cf40..03e441e7e9033961dbcf60e574fae486 + // Purpur end - Mobs always drop experience + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java -index ec19c49d195daff5839c991cce63b1ffc15a7e0b..5cea4ff662c7136d2778b84c21f368cb5ac1c81a 100644 +index 64dc2a04bb2ae4dc63083a24c48f671bfc8ff8ea..76f28568aecf019ce7432ff89593b2ed4eaff8a2 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 { @@ -1190,10 +1190,10 @@ index ec19c49d195daff5839c991cce63b1ffc15a7e0b..5cea4ff662c7136d2778b84c21f368cb + // Purpur end - Mobs always drop experience + public static boolean checkStraySpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + final EntityType type, final ServerLevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final 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 +index f1cf1d01a497fc46d201ad403b459f9886059d0f..3c3c53de82856033aab31c6b03e90ba647223fa7 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 { @@ -1211,7 +1211,7 @@ index 3e8cc658b333f1259784e1426896ac8b8c1537fa..40134013e3254c6c6ed370150adb4bda 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 +index cbbfdd2dde1437955f1007618244eeb72768b8fd..24b5ba31c92923545d5b7cab758c2e30ac77d23b 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 { @@ -1226,10 +1226,10 @@ index fad3e951e443f04f5bf0423cde42c0ae299a4236..fb4caabbbe5bd0befdaba49ee3cfe70c + // Purpur end - Mobs always drop experience + @Override - public boolean doHurtTarget(ServerLevel level, Entity target) { + public boolean doHurtTarget(final ServerLevel level, final 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 +index 43c50e6808eaab4bb31ffbbc633a66bab49b9574..408bfd276b7a70103ede33f3b87d4dc1b10d34f5 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 { @@ -1247,10 +1247,10 @@ index 81c500de41b11d4aa6c52dc290f132ad2c23f009..7993ea937772cabe848726c942b6df0a 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 ec36b854dccae7cef905aeb2fcd4ec177828139c..abafb96df26b3d987ce3ec3e1e96e8fc20cb5b6b 100644 +index e4769eeacc3ac97f90acb5ed0127990466c8d886..07242b2e6ab055122360035f058c39d54dbb8dc7 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 { +@@ -140,6 +140,13 @@ public class Drowned extends Zombie implements RangedAttackMob { } // Purpur end - Toggle for water sensitive mob damage @@ -1265,10 +1265,10 @@ index ec36b854dccae7cef905aeb2fcd4ec177828139c..abafb96df26b3d987ce3ec3e1e96e8fc 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 6ee9369701b370fad3431c39e59dff1beb5752ea..44583271813ed98a591284d16767cc3411341084 100644 +index 02e935edd7a6cabbf2e6fcc6c96a9601bee71acc..5d60b230eeaec9d37e286019b8d4276cfa85a9ea 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 { +@@ -91,6 +91,13 @@ public class Husk extends Zombie { } // Purpur end - Toggle for water sensitive mob damage @@ -1283,10 +1283,10 @@ index 6ee9369701b370fad3431c39e59dff1beb5752ea..44583271813ed98a591284d16767cc34 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 2d00d951d0baf3e2b66b237ac3327effea589932..2df9517011560cc730376e99eb0f1be78f431a0e 100644 +index dffb152543d06380618c36cf89374b7d11336039..68070943966aac17e1878f6730781cf2b603be7a 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 { +@@ -160,6 +160,13 @@ public class Zombie extends Monster { } // Purpur end - Toggle for water sensitive mob damage @@ -1301,7 +1301,7 @@ index 2d00d951d0baf3e2b66b237ac3327effea589932..2df9517011560cc730376e99eb0f1be7 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 df9682cacc2913aaf51b3afbd86bbc080ab8bde0..04e1401b5a1edfe7370fa31fee67f5ad8819e41f 100644 +index ecbac0d55dbe921ac2e185e0acab5691579be512..3e96d18ed2fb67c08e77b17ec7f6418fbb5caf8f 100644 --- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java @@ -138,6 +138,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -1316,13 +1316,13 @@ index df9682cacc2913aaf51b3afbd86bbc080ab8bde0..04e1401b5a1edfe7370fa31fee67f5ad + // Purpur end - Mobs always drop experience + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java -index 9a1da88752b0dd708365dd41a074cc0e90f36e1c..528baf4ca71725d4af6876d195b6d75fdab5ca58 100644 +index 6cc4d4729520c60b98d45d5e7dd674e599616505..9e893c0c033dcc2273275b92048d9b1a941d93f2 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 { +@@ -117,6 +117,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { } // Purpur end - Toggle for water sensitive mob damage @@ -1337,10 +1337,10 @@ index 9a1da88752b0dd708365dd41a074cc0e90f36e1c..528baf4ca71725d4af6876d195b6d75f 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 b6bfe06a2ad8e4219d99de050b30ce1ad15b8b34..996468c21a79d698a8d842189ffd4f2dc86a4302 100644 +index fe93e373ea46970af5ca117e80a7d5a2497afeca..297eba0bcf340f83c5d12ced343ccbfc738d4d35 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 +@@ -291,6 +291,13 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } // Purpur end - Toggle for water sensitive mob damage @@ -1353,9 +1353,9 @@ index b6bfe06a2ad8e4219d99de050b30ce1ad15b8b34..996468c21a79d698a8d842189ffd4f2d + @Override public Brain getBrain() { - return (Brain)super.getBrain(); + return (Brain) super.getBrain(); diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java -index cabebbc25788a8c41912f97dac85af41c9433b68..9502fe0c4f125f5802fde032954c447b14435da2 100644 +index cbbfa09d53ada7c39e9504d28770867989eaa5c1..47ee1521e25c987fce6da0bd981371a7e835d565 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 diff --git a/purpur-server/minecraft-patches/unapplied-features/0020-Setting-to-reintroduce-end-void-rings.patch b/purpur-server/minecraft-patches/features/0020-Setting-to-reintroduce-end-void-rings.patch similarity index 86% rename from purpur-server/minecraft-patches/unapplied-features/0020-Setting-to-reintroduce-end-void-rings.patch rename to purpur-server/minecraft-patches/features/0020-Setting-to-reintroduce-end-void-rings.patch index b332c33f3..4756b6179 100644 --- a/purpur-server/minecraft-patches/unapplied-features/0020-Setting-to-reintroduce-end-void-rings.patch +++ b/purpur-server/minecraft-patches/features/0020-Setting-to-reintroduce-end-void-rings.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Setting to reintroduce end void rings diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 9f3aec24bd8aa75ea116375c1cf0a54bcc229fa2..4af19f9f5152e9f6386e375a1ac5280ce00f48ea 100644 +index 0d5558444e9b775c015148d79eb4b04355671cf9..ffc75fc2b04088573877b95c948f457ee2458bd7 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1313,6 +1313,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop brainProvider() { - return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); + protected Brain makeBrain(final Brain.Packed packedBrain) { + return BRAIN_PROVIDER.makeBrain(this, packedBrain); diff --git a/net/minecraft/world/entity/animal/fox/Fox.java b/net/minecraft/world/entity/animal/fox/Fox.java -index f35f845e3e18c0bb0e4a076298c30be2ae479792..98937a998f55ee462421a7477cc3e2fbf4e75ba3 100644 +index 335da522a9b96ebc852b4ed5f22f9fd71aec23a8..ba48b114282939c806523052b2ad82e5041f5d45 100644 --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java -@@ -808,6 +808,13 @@ public class Fox extends Animal { +@@ -815,6 +815,13 @@ public class Fox extends Animal { } // Purpur end - Tulips change fox type @@ -65,9 +65,9 @@ index f35f845e3e18c0bb0e4a076298c30be2ae479792..98937a998f55ee462421a7477cc3e2fb + @Override // Paper start - Cancellable death event - protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(ServerLevel level, DamageSource damageSource) { + protected org.bukkit.event.entity.EntityDeathEvent dropAllDeathLoot(final ServerLevel level, final DamageSource source) { diff --git a/net/minecraft/world/entity/monster/illager/Pillager.java b/net/minecraft/world/entity/monster/illager/Pillager.java -index 68fe150d0da04084690670f29a0a4ea035e8c921..1a283185ac03ba44bae531f9b234703fa213df1a 100644 +index e69514bf39e2acfc909cb55b1704ca3f56f704e2..20c0b12b56416bc532de4de827c88850bfd1f0f3 100644 --- a/net/minecraft/world/entity/monster/illager/Pillager.java +++ b/net/minecraft/world/entity/monster/illager/Pillager.java @@ -104,6 +104,13 @@ public class Pillager extends AbstractIllager implements CrossbowAttackMob, Inve @@ -85,7 +85,7 @@ index 68fe150d0da04084690670f29a0a4ea035e8c921..1a283185ac03ba44bae531f9b234703f 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 367c74123ee9d07795527eec6ba2f83a9e953081..97bf22925df40a2f757b50f3fc7cbefc951443bb 100644 +index c29a1aea5c09ade40e36f4cb00a677b31ad91069..d4e298ecf79ff7ebdea71b710e6df7ba72f9a0f5 100644 --- a/net/minecraft/world/entity/monster/illager/Vindicator.java +++ b/net/minecraft/world/entity/monster/illager/Vindicator.java @@ -96,6 +96,13 @@ public class Vindicator extends AbstractIllager { @@ -103,10 +103,10 @@ index 367c74123ee9d07795527eec6ba2f83a9e953081..97bf22925df40a2f757b50f3fc7cbefc 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 49ed463ae7ef65b2630a5b914689e04fa729a40c..6f1c3d423b7a37aa261c78a0c8f5e1cb02eee320 100644 +index 47bcb895bf4c6f438bb0bb82f84331487fd28c0c..93c5fa7b63548c6b1d24847f1f363c7c9e0ea0ec 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java -@@ -180,6 +180,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -147,6 +147,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento } // Purpur end - Mobs always drop experience @@ -118,22 +118,22 @@ index 49ed463ae7ef65b2630a5b914689e04fa729a40c..6f1c3d423b7a37aa261c78a0c8f5e1cb + // Purpur end - Check mobGriefing Overrides + @Override - protected void addAdditionalSaveData(ValueOutput output) { + protected void addAdditionalSaveData(final ValueOutput output) { super.addAdditionalSaveData(output); -@@ -462,7 +469,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento +@@ -430,7 +437,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @Override - public boolean wantsToPickUp(ServerLevel level, ItemStack stack) { -- return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.piglinMobGriefingOverride) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); // Purpur - Add mobGriefing override to everything affected -+ return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.piglinCanPickUpLoot) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, stack); // Purpur - Check mobGriefing Overrides + public boolean wantsToPickUp(final ServerLevel level, final ItemStack itemStack) { +- return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.piglinMobGriefingOverride) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, itemStack); // Purpur - Add mobGriefing override to everything affected ++ return level.getGameRules().get(GameRules.MOB_GRIEFING, level.purpurConfig.piglinCanPickUpLoot) && this.canPickUpLoot() && PiglinAi.wantsToPickup(this, itemStack); // Purpur - Check mobGriefing Overrides } - protected boolean canReplaceCurrentItem(ItemStack candidate) { + protected boolean canReplaceCurrentItem(final ItemStack newItemStack) { diff --git a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -index 7baccc23f868ac9b8720bfd77b2af6b7dd368820..91f1e6b1c916b06914c32b268b8b8c2eb3c49ce2 100644 +index 0755e3ed3b940609f0211d123c0c664905af56b5..3a33976a667d9d9b446b6b27b5938aff8f5d9ab6 100644 --- a/net/minecraft/world/entity/monster/piglin/PiglinBrute.java +++ b/net/minecraft/world/entity/monster/piglin/PiglinBrute.java -@@ -104,6 +104,13 @@ public class PiglinBrute extends AbstractPiglin { +@@ -89,6 +89,13 @@ public class PiglinBrute extends AbstractPiglin { } // Purpur end - Mobs always drop experience @@ -148,7 +148,7 @@ index 7baccc23f868ac9b8720bfd77b2af6b7dd368820..91f1e6b1c916b06914c32b268b8b8c2e return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) diff --git a/net/minecraft/world/entity/monster/skeleton/Bogged.java b/net/minecraft/world/entity/monster/skeleton/Bogged.java -index f1e9cec85ce911a50bb83eff9228d6b98aa00d44..59c986a28a5546a9070ec9bcf3f1994317b47fff 100644 +index 50dd01a2092f87fd9015c982f728f14965be5b81..410c5f8e1571970e8043eb5d976cd6d8b95689eb 100644 --- a/net/minecraft/world/entity/monster/skeleton/Bogged.java +++ b/net/minecraft/world/entity/monster/skeleton/Bogged.java @@ -66,6 +66,13 @@ public class Bogged extends AbstractSkeleton implements Shearable { @@ -163,10 +163,10 @@ index f1e9cec85ce911a50bb83eff9228d6b98aa00d44..59c986a28a5546a9070ec9bcf3f19943 + // Purpur end - Check mobGriefing Overrides + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/skeleton/Skeleton.java b/net/minecraft/world/entity/monster/skeleton/Skeleton.java -index 03e441e7e9033961dbcf60e574fae48621513c87..304e6e23a616ddc3312ef27ae5d94c927a52fb80 100644 +index 7d0c6fe7290e8ad44c451b431778e1b7fe37c6e5..c5b261f36f6042a395b8e1a7d54b20339e81b4b8 100644 --- a/net/minecraft/world/entity/monster/skeleton/Skeleton.java +++ b/net/minecraft/world/entity/monster/skeleton/Skeleton.java @@ -64,6 +64,13 @@ public class Skeleton extends AbstractSkeleton { @@ -181,10 +181,10 @@ index 03e441e7e9033961dbcf60e574fae48621513c87..304e6e23a616ddc3312ef27ae5d94c92 + // Purpur end - Check mobGriefing Overrides + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/skeleton/Stray.java b/net/minecraft/world/entity/monster/skeleton/Stray.java -index 5cea4ff662c7136d2778b84c21f368cb5ac1c81a..262bea9ca0daba064d2e74223b47eb1fbb761479 100644 +index 76f28568aecf019ce7432ff89593b2ed4eaff8a2..e761c97212e380b6978e5fbd1d808f4ddbb89bb5 100644 --- a/net/minecraft/world/entity/monster/skeleton/Stray.java +++ b/net/minecraft/world/entity/monster/skeleton/Stray.java @@ -61,6 +61,13 @@ public class Stray extends AbstractSkeleton { @@ -199,10 +199,10 @@ index 5cea4ff662c7136d2778b84c21f368cb5ac1c81a..262bea9ca0daba064d2e74223b47eb1f + // Purpur end - Check mobGriefing Overrides + public static boolean checkStraySpawnRules( - EntityType entityType, ServerLevelAccessor level, EntitySpawnReason spawnReason, BlockPos pos, RandomSource random + final EntityType type, final ServerLevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random ) { diff --git a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java -index 40134013e3254c6c6ed370150adb4bda7c0f2d9a..c01f182e65b7891dfdd7b92ff2c6e2cf3a8a0374 100644 +index 3c3c53de82856033aab31c6b03e90ba647223fa7..afc6272905cf6ab464cca03b37b5e6c868094796 100644 --- a/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java +++ b/net/minecraft/world/entity/monster/skeleton/WitherSkeleton.java @@ -73,6 +73,13 @@ public class WitherSkeleton extends AbstractSkeleton { @@ -220,10 +220,10 @@ index 40134013e3254c6c6ed370150adb4bda7c0f2d9a..c01f182e65b7891dfdd7b92ff2c6e2cf protected void registerGoals() { this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractPiglin.class, true)); diff --git a/net/minecraft/world/entity/monster/zombie/Drowned.java b/net/minecraft/world/entity/monster/zombie/Drowned.java -index abafb96df26b3d987ce3ec3e1e96e8fc20cb5b6b..51e9c23436b620c32c4e5a5448fac8ae67c1dcc0 100644 +index 07242b2e6ab055122360035f058c39d54dbb8dc7..3a1152e07b2cc0ee4cf84651ada3c987dc704e91 100644 --- a/net/minecraft/world/entity/monster/zombie/Drowned.java +++ b/net/minecraft/world/entity/monster/zombie/Drowned.java -@@ -140,6 +140,13 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -147,6 +147,13 @@ public class Drowned extends Zombie implements RangedAttackMob { } // Purpur end - Mobs always drop experience @@ -238,10 +238,10 @@ index abafb96df26b3d987ce3ec3e1e96e8fc20cb5b6b..51e9c23436b620c32c4e5a5448fac8ae 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 ef289dd3fe0be980c200affb0b84a1066fe52232..d1390e0a88de89b3dc381449ef98a89b327eb4c9 100644 +index 5d60b230eeaec9d37e286019b8d4276cfa85a9ea..55b2bd676f2e9633fc8250bcd984424e8c37e2ee 100644 --- a/net/minecraft/world/entity/monster/zombie/Husk.java +++ b/net/minecraft/world/entity/monster/zombie/Husk.java -@@ -90,6 +90,13 @@ public class Husk extends Zombie { +@@ -98,6 +98,13 @@ public class Husk extends Zombie { } // Purpur end - Mobs always drop experience @@ -256,10 +256,10 @@ index ef289dd3fe0be980c200affb0b84a1066fe52232..d1390e0a88de89b3dc381449ef98a89b 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 f14fc03577a94dc6bd6e536e819a32c2d6144f02..5223f68d2e20909e4df716fa86f7ad92c987a062 100644 +index 68070943966aac17e1878f6730781cf2b603be7a..88552e60c0b6b4bd68c3b82e84f2a7493803e6ec 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -157,6 +157,13 @@ public class Zombie extends Monster { +@@ -167,6 +167,13 @@ public class Zombie extends Monster { } // Purpur end - Mobs always drop experience @@ -274,7 +274,7 @@ index f14fc03577a94dc6bd6e536e819a32c2d6144f02..5223f68d2e20909e4df716fa86f7ad92 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 a9a04a4c9cedf33b68c99b2aec12289e63fa156b..9797e206a3038c3af23495b8bfd70424e4bbd4a5 100644 +index 3e96d18ed2fb67c08e77b17ec7f6418fbb5caf8f..e5eb30d3620937af3cd294bdd6b985fbb61df534 100644 --- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java @@ -145,6 +145,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -289,13 +289,13 @@ index a9a04a4c9cedf33b68c99b2aec12289e63fa156b..9797e206a3038c3af23495b8bfd70424 + // Purpur end - Check mobGriefing Overrides + @Override - protected void defineSynchedData(SynchedEntityData.Builder builder) { - super.defineSynchedData(builder); + protected void defineSynchedData(final SynchedEntityData.Builder entityData) { + super.defineSynchedData(entityData); diff --git a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java -index 528baf4ca71725d4af6876d195b6d75fdab5ca58..2d6b6bbd06d0a0443e4c32e3c9aecfe8716e1a55 100644 +index 9e893c0c033dcc2273275b92048d9b1a941d93f2..54ba4d2e8305e2d9ba0c9e71bae67bfd7b7d34b9 100644 --- a/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java +++ b/net/minecraft/world/entity/monster/zombie/ZombifiedPiglin.java -@@ -120,6 +120,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { +@@ -124,6 +124,13 @@ public class ZombifiedPiglin extends Zombie implements NeutralMob { } // Purpur end - Mobs always drop experience @@ -310,10 +310,10 @@ index 528baf4ca71725d4af6876d195b6d75fdab5ca58..2d6b6bbd06d0a0443e4c32e3c9aecfe8 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 996468c21a79d698a8d842189ffd4f2dc86a4302..0c110421074d57e7283168c1133cd4ee314b57f6 100644 +index 297eba0bcf340f83c5d12ced343ccbfc738d4d35..dab982eed3c702486c1daaa480d795723102e164 100644 --- a/net/minecraft/world/entity/npc/villager/Villager.java +++ b/net/minecraft/world/entity/npc/villager/Villager.java -@@ -296,6 +296,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -298,6 +298,13 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } // Purpur end - Mobs always drop experience @@ -326,12 +326,12 @@ index 996468c21a79d698a8d842189ffd4f2dc86a4302..0c110421074d57e7283168c1133cd4ee + @Override public Brain getBrain() { - return (Brain)super.getBrain(); + return (Brain) super.getBrain(); diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java -index b03faa7600f182a12c3a739deefc38028cf45615..60e9511bd17b6fe08009163814500ec682847fc5 100644 +index d0a9088a18e6717209f037ae48ce54db13702234..5e5c5a8362537c6ff205eed7223a3bbdbf05da4a 100644 --- a/net/minecraft/world/entity/raid/Raider.java +++ b/net/minecraft/world/entity/raid/Raider.java -@@ -396,7 +396,7 @@ public abstract class Raider extends PatrollingMonster { +@@ -399,7 +399,7 @@ public abstract class Raider extends PatrollingMonster { } private boolean cannotPickUpBanner() {