diff --git a/build-data/purpur.at b/build-data/purpur.at index f106efc02..27f9eda68 100644 --- a/build-data/purpur.at +++ b/build-data/purpur.at @@ -5,6 +5,8 @@ public net.minecraft.world.entity.LivingEntity canGlide()Z public net.minecraft.world.entity.monster.Shulker MAX_SCALE public net.minecraft.world.entity.player.Player canGlide()Z public net.minecraft.world.level.block.ShulkerBoxBlock canOpen(Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/entity/ShulkerBoxBlockEntity;)Z +public net.minecraft.world.level.block.entity.BeehiveBlockEntity$BeeData +public net.minecraft.world.level.block.entity.BeehiveBlockEntity$BeeData occupant public net.minecraft.world.level.block.entity.FuelValues values public net.minecraft.world.level.portal.PortalShape FRAME public-f net.minecraft.world.entity.EntityType dimensions diff --git a/gradle.properties b/gradle.properties index 6b6007eb5..df8c987aa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ group = org.purpurmc.purpur mcVersion = 26.1.2 apiVersion = 26.1.2 channel=STABLE -paperCommit = 5c917dababca4087b9df4d44b415d85125479830 +paperCommit = fd45f4b2e38a1b0ea18dee6fc8a8b420e9b069e1 org.gradle.configuration-cache = true org.gradle.caching = true diff --git a/purpur-server/build.gradle.kts.patch b/purpur-server/build.gradle.kts.patch index 905c0ddf3..7793cc0d6 100644 --- a/purpur-server/build.gradle.kts.patch +++ b/purpur-server/build.gradle.kts.patch @@ -27,7 +27,7 @@ + // Purpur end - Rebrand + + /*updatingMinecraft { // Purpur start - TODO - snapshot - we don't need this - // oldPaperCommit = "7e80cef5198561d0db53406127e5b8bc7af51577" + // oldPaperCommit = "711c5de2b05df39b72c44ff54e9f9381f8d153cb" - } + }*/ // Purpur end - TODO - snapshot - we don't need this } diff --git a/purpur-server/minecraft-patches/features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch index 24081e98f..253abb031 100644 --- a/purpur-server/minecraft-patches/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 64a82b414afd093c010878c150592c681665b735..1db70e2397137158c3df9603ea90743efc2da573 100644 +index 33bc4b330abf8745a379eff0d79aabd2a1b7cd40..772136351beb00825388f79e66f3e0532794e939 100644 --- a/net/minecraft/gametest/framework/GameTestHelper.java +++ b/net/minecraft/gametest/framework/GameTestHelper.java -@@ -356,6 +356,8 @@ public class GameTestHelper { +@@ -354,6 +354,8 @@ public class GameTestHelper { public void setAfk(final boolean afk) {} // Purpur - AFK API @@ -18,10 +18,10 @@ index 64a82b414afd093c010878c150592c681665b735..1db70e2397137158c3df9603ea90743e public boolean isClientAuthoritative() { return false; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 33915dbc64062bbe8d0d9df6dbdb60660c1ad9c6..07d3c51b80c251da74aba87bdbf9ac74650b83e5 100644 +index c26dd9cdd6fb0dcecc6a166dd71167c4a88a3d91..838898572cc30207a1b915dcea11f612254ac453 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1876,6 +1876,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 @@ -30,7 +30,7 @@ index 33915dbc64062bbe8d0d9df6dbdb60660c1ad9c6..07d3c51b80c251da74aba87bdbf9ac74 net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = level.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers profiler.push(() -> level + " " + level.dimension().identifier()); diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index aa1282fbd44533cbc563fff74d8a1c309f1a9cc0..1072da2fa0138d42769749cc98c6ec0f97fd6f09 100644 +index 316fece122a3b71b5c809ed15c46c8cb37d1cdbf..ba1dba4903c8d3c023e9555af67e5d62ac3b3f55 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -236,6 +236,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet @@ -42,10 +42,10 @@ index aa1282fbd44533cbc563fff74d8a1c309f1a9cc0..1072da2fa0138d42769749cc98c6ec0f @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 3e8a8509c0574e732c8054cc2b86f74dd47d29d4..1bd1bb805060604fbe4dca6d71a863bb96d12da9 100644 +index 3b655453f22be6eb65ea8b32f79e9d9b953120ee..228c81791dcc1ea0971e70bcb0cb289106466c67 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -795,6 +795,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc +@@ -776,6 +776,15 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc this.trackEnteredOrExitedLavaOnVehicle(); this.updatePlayerAttributes(); this.advancements.flushDirty(this, true); @@ -62,10 +62,10 @@ index 3e8a8509c0574e732c8054cc2b86f74dd47d29d4..1bd1bb805060604fbe4dca6d71a863bb private void updatePlayerAttributes() { diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -index abf5fc6b4beed0e3148c319cfa626be9f25d6b09..0069b240b1be6b80a979bfa9784fb4fd634e7440 100644 +index cf05034e3f37508466c61a41533e3f6c3ef2e3a5..3671945aa5d94052629c97dfbf6de581c9b20d04 100644 --- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java +++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java -@@ -3000,6 +3000,8 @@ public class ServerGamePacketListenerImpl +@@ -3002,6 +3002,8 @@ public class ServerGamePacketListenerImpl ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event); final boolean resendData = event.isCancelled() || !ServerGamePacketListenerImpl.this.player.getItemInHand(hand).is(itemType); @@ -75,39 +75,39 @@ index abf5fc6b4beed0e3148c319cfa626be9f25d6b09..0069b240b1be6b80a979bfa9784fb4fd 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 1922a09d57f7f91ef2dec814918fd9da4a9189cd..49c5c8ab8f3333d4d6a96643e7018905a533b645 100644 +index a4a0683c0287da0543a5c869163c925f899b1550..241ff14c2c27204fc8615b19700f946afdcfa2d1 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java -@@ -3396,6 +3396,13 @@ public abstract class Entity +@@ -3400,6 +3400,13 @@ public abstract class Entity - this.passengers = ImmutableList.copyOf(newPassengers); - } -+ -+ // Purpur start - Ridables -+ if (isRidable() && this.passengers.get(0) == passenger && passenger instanceof Player player) { -+ onMount(player); -+ this.rider = player; -+ } -+ // Purpur end - Ridables + this.passengers = ImmutableList.copyOf(newPassengers); } ++ ++ // Purpur start - Ridables ++ if (isRidable() && this.passengers.get(0) == passenger && passenger instanceof Player player) { ++ onMount(player); ++ this.rider = player; ++ } ++ // Purpur end - Ridables } -@@ -3437,6 +3444,14 @@ public abstract class Entity - return false; - } - // CraftBukkit end + // Paper start - Force entity dismount during teleportation +@@ -3440,6 +3447,14 @@ public abstract class Entity + return false; + } + // CraftBukkit end + -+ // Purpur start - Ridables -+ if (this.rider != null && this.passengers.get(0) == this.rider) { -+ onDismount(this.rider); -+ this.rider = null; -+ } -+ // Purpur end - Ridables ++ // Purpur start - Ridables ++ if (this.rider != null && this.passengers.get(0) == this.rider) { ++ onDismount(this.rider); ++ this.rider = null; ++ } ++ // Purpur end - Ridables + - if (this.passengers.size() == 1 && this.passengers.get(0) == passenger) { - this.passengers = ImmutableList.of(); - } else { -@@ -5417,4 +5432,44 @@ public abstract class Entity + if (this.passengers.size() == 1 && this.passengers.get(0) == passenger) { + this.passengers = ImmutableList.of(); + } else { +@@ -5419,4 +5434,44 @@ public abstract class Entity return ((ServerLevel) this.level()).isPositionEntityTicking(this.blockPosition()); } // Paper end - Expose entity id counter @@ -153,7 +153,7 @@ index 1922a09d57f7f91ef2dec814918fd9da4a9189cd..49c5c8ab8f3333d4d6a96643e7018905 + // Purpur end - Ridables } diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 0b8ab186f1e40750b158686c0ab31908fd3b1de3..cc44373545f9c29c9c827159ccd26e295e48c9d7 100644 +index aecec886b7fc1eed340fdae1074f229fd49f06ee..bb6dc165d393a527564810e0cd2f8137e5272b9e 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -243,9 +243,9 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin @@ -186,7 +186,7 @@ index 0b8ab186f1e40750b158686c0ab31908fd3b1de3..cc44373545f9c29c9c827159ccd26e29 @Override protected void checkFallDamage(final double ya, final boolean onGround, final BlockState onState, final BlockPos pos) { -@@ -3153,6 +3154,20 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3158,6 +3159,20 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.5)); } else { @@ -207,7 +207,7 @@ index 0b8ab186f1e40750b158686c0ab31908fd3b1de3..cc44373545f9c29c9c827159ccd26e29 this.moveRelative(airSpeed, input); this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.91F)); -@@ -3856,8 +3871,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3862,8 +3877,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin this.pushEntities(); profiler.pop(); // Paper start - Add EntityMoveEvent @@ -220,7 +220,7 @@ index 0b8ab186f1e40750b158686c0ab31908fd3b1de3..cc44373545f9c29c9c827159ccd26e29 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()); -@@ -3867,6 +3884,21 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3873,6 +3890,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,7 +243,7 @@ index 0b8ab186f1e40750b158686c0ab31908fd3b1de3..cc44373545f9c29c9c827159ccd26e29 // 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 f09a3510a377d749f21bef4cbb604be45cfb3090..542ee720980f1bf8408bc150612f9a96f80a594c 100644 +index 6916de6628676fc775ab4dda949ebb7facdf58b2..d9c5d2e1c638370434e52422c9643c3521f1bb42 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 Targeting, EquipmentUs @@ -265,7 +265,7 @@ index f09a3510a377d749f21bef4cbb604be45cfb3090..542ee720980f1bf8408bc150612f9a96 this.igniteForSeconds(8.0F); } } -@@ -1367,7 +1368,7 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs +@@ -1362,7 +1363,7 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs } protected InteractionResult mobInteract(final Player player, final InteractionHand hand) { @@ -274,7 +274,7 @@ index f09a3510a377d749f21bef4cbb604be45cfb3090..542ee720980f1bf8408bc150612f9a96 } protected void usePlayerItem(final Player player, final InteractionHand hand, final ItemStack itemStack) { -@@ -1710,4 +1711,58 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs +@@ -1705,4 +1706,58 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs public float chargeSpeedModifier() { return 1.0F; } @@ -334,7 +334,7 @@ index f09a3510a377d749f21bef4cbb604be45cfb3090..542ee720980f1bf8408bc150612f9a96 + // Purpur end - Ridables } diff --git a/net/minecraft/world/entity/ai/attributes/AttributeMap.java b/net/minecraft/world/entity/ai/attributes/AttributeMap.java -index 0c8a719bdfb4932171a8f66d76b00cc499f5beb9..a3a1a5562e4940c96c688820c0fba4cf53fbcd48 100644 +index 68bad6752bd313ca3ebde7fd4e3b2c46c5dee3ef..fe5f4f79e5a1b091d15fa3bfd876b831e493655c 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 { @@ -384,7 +384,7 @@ index 3b122f0bdfd8490297d173c05c1412c9fcfc886e..6b78ddb4ec40d45634288796a98e3471 .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 fea2823bf3a502e7d0e8c4f4e1e132d92d9e8375..df84c46615ef959e874b9aca7561ffd3c0bf56f8 100644 +index 21b524a24257526f40bd6864a2ac6f5e8fd29d96..a6f3c9ca1235b77bff243120bedeea9cc1293328 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 { @@ -431,7 +431,7 @@ index 99493ad5ca4222a2817ee061be01fb888666b3a4..5829ea72b321b2b63f60407aabd83e1b this.lookAtCooldown--; 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 c2831ffb9a4765a628f8f005dc1218405301e926..7f036c3548aea7a23f5a085ce6d9ce987fbc5116 100644 +index 5dd0c83e44eb68d90cda5743bc24d97044a02f6e..9861837c1d10e5ffe5dada9f4a75fb9adaccc161 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 { @@ -517,7 +517,7 @@ index c2831ffb9a4765a628f8f005dc1218405301e926..7f036c3548aea7a23f5a085ce6d9ce98 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 25b6e4904f0dff6159f3fb99e4226a397ef6a72b..cf1bfb79588236fc648aefcc64bb759862084f58 100644 +index 69638b9f5c4631ec056ec8066d091e553d814252..931726ddada92a4b1063dd9dbdc89723f6a283cc 100644 --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java @@ -100,10 +100,23 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS @@ -583,10 +583,10 @@ index 25b6e4904f0dff6159f3fb99e4226a397ef6a72b..cf1bfb79588236fc648aefcc64bb7598 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 03ec05a860781f85e58055d6f58893963781bd97..1df0f3e17dadd836dbac39feec56c3b198117340 100644 +index 14491f7136266a738bbc463731d0785bcce2b4cd..d8dcb325325ba2fc6b78ff62c95cb818c5fcf3fc 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -90,6 +90,23 @@ public class Armadillo extends Animal { +@@ -89,6 +89,23 @@ public class Armadillo extends Animal { return Animal.createAnimalAttributes().add(Attributes.MAX_HEALTH, 12.0).add(Attributes.MOVEMENT_SPEED, 0.14); } @@ -611,10 +611,10 @@ index 03ec05a860781f85e58055d6f58893963781bd97..1df0f3e17dadd836dbac39feec56c3b1 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 bcbe1d44871124e0b9b453cb7b7c453fa0144bc6..8704620cd9348d3c417cbc9591e03c70bf4d4f45 100644 +index 317e16e3a78a7d7af71b83cc25f5a00b474bc12a..993f8195bf67d675eccef47314de0ba0f257b855 100644 --- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -118,6 +118,23 @@ public class Axolotl extends Animal implements Bucketable { +@@ -117,6 +117,23 @@ public class Axolotl extends Animal implements Bucketable { this.lookControl = new Axolotl.AxolotlLookControl(this, 20); } @@ -638,7 +638,7 @@ index bcbe1d44871124e0b9b453cb7b7c453fa0144bc6..8704620cd9348d3c417cbc9591e03c70 @Override public float getWalkTargetValue(final BlockPos pos, final LevelReader level) { return 0.0F; -@@ -366,6 +383,7 @@ public class Axolotl extends Animal implements Bucketable { +@@ -365,6 +382,7 @@ public class Axolotl extends Animal implements Bucketable { protected void customServerAiStep(final ServerLevel level) { ProfilerFiller profiler = Profiler.get(); profiler.push("axolotlBrain"); @@ -646,7 +646,7 @@ index bcbe1d44871124e0b9b453cb7b7c453fa0144bc6..8704620cd9348d3c417cbc9591e03c70 this.getBrain().tick(level, this); profiler.pop(); profiler.push("axolotlActivityUpdate"); -@@ -605,23 +623,31 @@ public class Axolotl extends Animal implements Bucketable { +@@ -603,23 +621,31 @@ public class Axolotl extends Animal implements Bucketable { } @Override @@ -681,10 +681,10 @@ index bcbe1d44871124e0b9b453cb7b7c453fa0144bc6..8704620cd9348d3c417cbc9591e03c70 super.tick(); } diff --git a/net/minecraft/world/entity/animal/bee/Bee.java b/net/minecraft/world/entity/animal/bee/Bee.java -index 096afc159783c0b527b973a20a6eab377a0e0377..2b398421d196902c5c812126528f32fc9863b497 100644 +index 28cf7f1b7b947639a686b83a5a7d617af9b83e15..67971c3054fd17ee75c69c6168bd74f11dca4c86 100644 --- a/net/minecraft/world/entity/animal/bee/Bee.java +++ b/net/minecraft/world/entity/animal/bee/Bee.java -@@ -154,6 +154,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -153,6 +153,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { public Bee(final EntityType type, final Level level) { super(type, level); @@ -692,7 +692,7 @@ index 096afc159783c0b527b973a20a6eab377a0e0377..2b398421d196902c5c812126528f32fc // Paper start - Fix MC-167279 class BeeFlyingMoveControl extends FlyingMoveControl { public BeeFlyingMoveControl(final Mob mob, final int maxTurn, final boolean hoversInPlace) { -@@ -162,11 +163,24 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -161,11 +162,24 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { @Override public void tick() { @@ -717,7 +717,7 @@ index 096afc159783c0b527b973a20a6eab377a0e0377..2b398421d196902c5c812126528f32fc } this.moveControl = new BeeFlyingMoveControl(this, 20, true); // Paper end - Fix MC-167279 -@@ -178,6 +192,40 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -177,6 +191,40 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { this.setPathfindingMalus(PathType.FENCE, -1.0F); } @@ -758,7 +758,7 @@ index 096afc159783c0b527b973a20a6eab377a0e0377..2b398421d196902c5c812126528f32fc @Override protected void defineSynchedData(final SynchedEntityData.Builder entityData) { super.defineSynchedData(entityData); -@@ -192,6 +240,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -191,6 +239,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { @Override protected void registerGoals() { @@ -766,7 +766,7 @@ index 096afc159783c0b527b973a20a6eab377a0e0377..2b398421d196902c5c812126528f32fc 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)); -@@ -209,6 +258,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -208,6 +257,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)); @@ -774,14 +774,13 @@ index 096afc159783c0b527b973a20a6eab377a0e0377..2b398421d196902c5c812126528f32fc 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)); -@@ -1119,16 +1169,16 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -1087,15 +1137,15 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { } } - 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,10 +794,10 @@ index 096afc159783c0b527b973a20a6eab377a0e0377..2b398421d196902c5c812126528f32fc } diff --git a/net/minecraft/world/entity/animal/camel/Camel.java b/net/minecraft/world/entity/animal/camel/Camel.java -index 1aa18543428578ff773a32c24f33b843b10e8e27..e20cae40eb84bf01b38cf6b5249410cb7e2525a1 100644 +index 7b30263e2064d5d30a68a055bde2ad28582f4620..fcbb743a07b691f11f14febe5a05959326999293 100644 --- a/net/minecraft/world/entity/animal/camel/Camel.java +++ b/net/minecraft/world/entity/animal/camel/Camel.java -@@ -96,6 +96,13 @@ public class Camel extends AbstractHorse { +@@ -95,6 +95,13 @@ public class Camel extends AbstractHorse { navigation.setCanWalkOverFences(true); } @@ -901,7 +900,7 @@ index 340f3b24842a064044f6bf338f3888af90068eac..e200b9a459c3f410d2e9affbad8ba8e3 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 a22c787019d9de651699615947f613b24f0476c8..2131ba3eb10e869ff6dad67fb6b8097a8d6f1ab6 100644 +index c299da2b15d270445fab7a84a1d8542dd9b3fee6..7411d6aafa9ec3b5d6305bb8c1b8d03444cf6aa2 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 { @@ -938,7 +937,7 @@ index a22c787019d9de651699615947f613b24f0476c8..2131ba3eb10e869ff6dad67fb6b8097a // 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 321c9164e87b992a61f51df318cff7730b2bdac1..924fd56994f63deb4a8fe03f870d14fc943390e4 100644 +index 7c52d11673b6cd6c4ad6db598da1e03a68fa5a16..82a56ecf76f53e72d1af67228ce7f9c74678b59f 100644 --- a/net/minecraft/world/entity/animal/dolphin/Dolphin.java +++ b/net/minecraft/world/entity/animal/dolphin/Dolphin.java @@ -78,14 +78,82 @@ public class Dolphin extends AgeableWaterCreature { @@ -1063,10 +1062,10 @@ index 321c9164e87b992a61f51df318cff7730b2bdac1..924fd56994f63deb4a8fe03f870d14fc 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 b1d309a66abb9dc8ac69e4195e4987de576d6c98..1698e519a50670990e43f33c35d5a3f648c2cf61 100644 +index 52fc3d9600a7bd256647fbbfc1e460ca2b10a424..59bf0106908fba34500d1e44d6a02bb27b71ffe5 100644 --- a/net/minecraft/world/entity/animal/equine/AbstractHorse.java +++ b/net/minecraft/world/entity/animal/equine/AbstractHorse.java -@@ -129,11 +129,21 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump +@@ -128,11 +128,21 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump protected AbstractHorse(final EntityType type, final Level level) { super(type, level); @@ -1088,7 +1087,7 @@ index b1d309a66abb9dc8ac69e4195e4987de576d6c98..1698e519a50670990e43f33c35d5a3f6 this.goalSelector.addGoal(1, new RunAroundLikeCrazyGoal(this, 1.2)); this.goalSelector.addGoal(2, new BreedGoal(this, 1.0, AbstractHorse.class)); this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.0)); -@@ -143,6 +153,7 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump +@@ -142,6 +152,7 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump if (this.canPerformRearing()) { this.goalSelector.addGoal(9, new RandomStandGoal(this)); } @@ -1133,7 +1132,7 @@ index 87e34dd94340be58ade945992e26dd81ee19b0a4..d2dc51d7a8d97db64bf87f8337b10442 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 5619a7218d55c7b2ba449e9c60f4fa0160b096ee..d1049724b127c6f6307ee370ccdd4c611ec60b03 100644 +index 22fc7041bd98b54d094ee66cdb62cf983ffa5588..90928f2a840493b16b34bf870fc511e74d1150ea 100644 --- a/net/minecraft/world/entity/animal/equine/Llama.java +++ b/net/minecraft/world/entity/animal/equine/Llama.java @@ -81,7 +81,58 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { @@ -1230,7 +1229,7 @@ index 1ebf80bac3e4cc17bbee795b9cb15c656b168396..ce4c2424cd6922c03cf44cc731526775 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 c1bddbaadc8cc6d158ee79c9c37554d138a3dacc..e4ee09f1b51f80d35bd3f80f07d06093acc3bfcf 100644 +index 03d0e52213707fb052d5298000e5cd14c2e25636..8a9f46e45ce077230ec918d46f599092fbe3e851 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 { @@ -1312,7 +1311,7 @@ index a279cdff95c37434f44bdda7558286045e606f33..13857de6c4be09b7d0798d2a0fd420c7 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 5687036a49806b7177dc928fd83fb88cb8f95dc5..a3075535ed8726670c67d6aba0a32a00c53a70dc 100644 +index 0834b837b84c337366e051cec88da2c2789e7bef..36688a571cdf35697d0cd97bee316f5474bcae73 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 { @@ -1513,7 +1512,7 @@ index 9981452e2dda0675defd279c4460031dae5fd25f..8d3e8575120145f572b2c1834d243bac 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 9c5979d034c1292d7454f1b0f686fb39e3824ff3..e75e66134026a93e7681befb67abb5783fde37cf 100644 +index a967d067c3e97859a88672a3b9daf1b89d81ed3c..e96062cd57e1866c398418ebbb8f2443a668f480 100644 --- a/net/minecraft/world/entity/animal/fish/Salmon.java +++ b/net/minecraft/world/entity/animal/fish/Salmon.java @@ -41,6 +41,18 @@ public class Salmon extends AbstractSchoolingFish { @@ -1536,7 +1535,7 @@ index 9c5979d034c1292d7454f1b0f686fb39e3824ff3..e75e66134026a93e7681befb67abb578 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 28ca7d979776e1efdbeaf2758f0785053d2acb08..3d00bcbb4ac39c7d8b4bacf15d7cfe4ad5a4a706 100644 +index f846e5c736baea99fe5e411e36cf56a074145752..d48f8dc3e806ffe767565158bcfa17631839a61c 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 { @@ -1559,10 +1558,10 @@ index 28ca7d979776e1efdbeaf2758f0785053d2acb08..3d00bcbb4ac39c7d8b4bacf15d7cfe4a 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 af729d2a4d00653b46a8b55f8115b3de6aa92b75..ab45081d00a012949f43929f06e9bfcdf5b3c89a 100644 +index b3dcc836f5bf756b11194ff534535b69d98490c5..c60343771f5490236212221e7d5f2b73dee4865c 100644 --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java -@@ -155,6 +155,44 @@ public class Fox extends Animal { +@@ -154,6 +154,44 @@ public class Fox extends Animal { this.getNavigation().setRequiredPathLength(32.0F); } @@ -1607,7 +1606,7 @@ index af729d2a4d00653b46a8b55f8115b3de6aa92b75..ab45081d00a012949f43929f06e9bfcd @Override protected void defineSynchedData(final SynchedEntityData.Builder entityData) { super.defineSynchedData(entityData); -@@ -174,6 +212,7 @@ public class Fox extends Animal { +@@ -173,6 +211,7 @@ public class Fox extends Animal { this, AbstractFish.class, 20, false, false, (target, level) -> target instanceof AbstractSchoolingFish ); this.goalSelector.addGoal(0, new Fox.FoxFloatGoal()); @@ -1615,7 +1614,7 @@ index af729d2a4d00653b46a8b55f8115b3de6aa92b75..ab45081d00a012949f43929f06e9bfcd 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)); -@@ -198,6 +237,7 @@ public class Fox extends Animal { +@@ -197,6 +236,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,14 +1622,13 @@ index af729d2a4d00653b46a8b55f8115b3de6aa92b75..ab45081d00a012949f43929f06e9bfcd this.targetSelector .addGoal( 3, -@@ -1141,16 +1181,16 @@ public class Fox extends Animal { +@@ -1125,15 +1165,15 @@ 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); } @@ -1643,14 +1641,13 @@ index af729d2a4d00653b46a8b55f8115b3de6aa92b75..ab45081d00a012949f43929f06e9bfcd } } -@@ -1187,16 +1227,16 @@ public class Fox extends Animal { +@@ -1169,15 +1209,15 @@ public class Fox extends Animal { } } - 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); } @@ -1664,7 +1661,7 @@ index af729d2a4d00653b46a8b55f8115b3de6aa92b75..ab45081d00a012949f43929f06e9bfcd } } diff --git a/net/minecraft/world/entity/animal/frog/Frog.java b/net/minecraft/world/entity/animal/frog/Frog.java -index 28b4e183efd851e6d2bb5bb16904817d4c40273b..977ee6a71e0c52f115a221b09248596db2534739 100644 +index ef9f543aea1e88e1f81d888c7b21aeac934f102b..bedbe9adede69efa4c4f2e6def9aeb3e8429fc2e 100644 --- a/net/minecraft/world/entity/animal/frog/Frog.java +++ b/net/minecraft/world/entity/animal/frog/Frog.java @@ -82,6 +82,8 @@ public class Frog extends Animal { @@ -1747,8 +1744,8 @@ index 28b4e183efd851e6d2bb5bb16904817d4c40273b..977ee6a71e0c52f115a221b09248596d - 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 3d4bfeae2fddb9ace26e7dea8870704d8309862b..ed8fa3aa3d0bb3c83f46a902dfe603942c4a8f96 100644 --- a/net/minecraft/world/entity/animal/frog/Tadpole.java @@ -1814,7 +1811,7 @@ index 3d4bfeae2fddb9ace26e7dea8870704d8309862b..ed8fa3aa3d0bb3c83f46a902dfe60394 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 3cb1e55e5400c4ab78fd10fc76db38e8d0dac1a0..3116825b324091b0fd769c7293c5514d88cc3cb5 100644 +index 7df6194d8fd844b9cd4aec55bb0f613fdfefaad2..cd0f514fa6deef90efc697d30af9a88797b456f8 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java @@ -100,6 +100,23 @@ public class Goat extends Animal { @@ -1850,7 +1847,7 @@ index 3cb1e55e5400c4ab78fd10fc76db38e8d0dac1a0..3116825b324091b0fd769c7293c5514d 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 4f412c6c661d5972c61ff77fb02e55baa8020c93..dd9d71eebbd9b013ae69db7b9869be8dd30ae0ba 100644 +index 61612645df4ece5f3f6abf5f37fd717c99be10e1..d842d79bbd5253a2a701a87221258751aa112c3e 100644 --- a/net/minecraft/world/entity/animal/golem/CopperGolem.java +++ b/net/minecraft/world/entity/animal/golem/CopperGolem.java @@ -112,6 +112,28 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab @@ -1899,7 +1896,7 @@ index 4f412c6c661d5972c61ff77fb02e55baa8020c93..dd9d71eebbd9b013ae69db7b9869be8d drops = org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getDrops()); } this.shear(serverLevel, SoundSource.PLAYERS, itemStack, drops); -@@ -272,6 +295,8 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab +@@ -278,6 +301,8 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab } } @@ -1909,7 +1906,7 @@ index 4f412c6c661d5972c61ff77fb02e55baa8020c93..dd9d71eebbd9b013ae69db7b9869be8d } } diff --git a/net/minecraft/world/entity/animal/golem/IronGolem.java b/net/minecraft/world/entity/animal/golem/IronGolem.java -index f0db017fc24b2b2e078f4bfcf9e06515b4c2ef2f..b9672e22eb3655168db2f85d4a273b3604f04618 100644 +index cc49b2582073c2dbc19e3c857390b0fa0e8ad2d2..c6e0038cb3314b4db17d307b99de65dde107d5a1 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 { @@ -1949,21 +1946,22 @@ index f0db017fc24b2b2e078f4bfcf9e06515b4c2ef2f..b9672e22eb3655168db2f85d4a273b36 this.targetSelector.addGoal(1, new DefendVillageTargetGoal(this)); this.targetSelector.addGoal(2, new HurtByTargetGoal(this)); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -271,12 +291,12 @@ public class IronGolem extends AbstractGolem implements NeutralMob { +@@ -271,13 +291,13 @@ public class IronGolem extends AbstractGolem implements NeutralMob { 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 healthBefore = this.getHealth(); - this.heal(25.0F); - if (this.getHealth() == healthBefore) { -- return InteractionResult.PASS; -+ return tryRide(player, hand); // Purpur - Ridables - } else { - float pitch = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; - this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, pitch); + } + + float healthBefore = this.getHealth(); + this.heal(25.0F); + if (this.getHealth() == healthBefore) { +- return InteractionResult.PASS; ++ return tryRide(player, hand); // Purpur - Ridables + } + + float pitch = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; diff --git a/net/minecraft/world/entity/animal/golem/SnowGolem.java b/net/minecraft/world/entity/animal/golem/SnowGolem.java index 0993ec37f58cbc6b201ebc9aeb39aee438bd1cf9..6875e40687bbde6aba25da7d3145eccdccea6f52 100644 --- a/net/minecraft/world/entity/animal/golem/SnowGolem.java @@ -2027,10 +2025,10 @@ index 0993ec37f58cbc6b201ebc9aeb39aee438bd1cf9..6875e40687bbde6aba25da7d3145eccd } diff --git a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java -index a7a9deaf637c2e994940ee8fdad7e5e09464dabe..d7f7bafb7c7854ce6bf64bbbab022fdb85a2e9d7 100644 +index 9624a1f4cd829411e46213201200e3af54d57699..0ffa1ed6fe9e8aa01c91dee4cefb8b9a1273770b 100644 --- a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +++ b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java -@@ -134,6 +134,13 @@ public class HappyGhast extends Animal { +@@ -133,6 +133,13 @@ public class HappyGhast extends Animal { this.removeAllGoals(goal -> true); } @@ -2045,10 +2043,10 @@ index a7a9deaf637c2e994940ee8fdad7e5e09464dabe..d7f7bafb7c7854ce6bf64bbbab022fdb 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 cce6231b717027a70e85c641ccdab445225a990e..d18577440823cde6f44eb653c5f23afb09ea89ac 100644 +index 7bb37a2efaec248a51da2b89ecad536d424d5393..e551907cd2721fa330639aa590ef76711e7e21d6 100644 --- a/net/minecraft/world/entity/animal/panda/Panda.java +++ b/net/minecraft/world/entity/animal/panda/Panda.java -@@ -111,6 +111,32 @@ public class Panda extends Animal { +@@ -110,6 +110,32 @@ public class Panda extends Animal { } } @@ -2081,7 +2079,7 @@ index cce6231b717027a70e85c641ccdab445225a990e..d18577440823cde6f44eb653c5f23afb @Override protected boolean canDispenserEquipIntoSlot(final EquipmentSlot slot) { return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); -@@ -263,6 +289,7 @@ public class Panda extends Animal { +@@ -262,6 +288,7 @@ public class Panda extends Animal { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -2089,7 +2087,7 @@ index cce6231b717027a70e85c641ccdab445225a990e..d18577440823cde6f44eb653c5f23afb 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)); -@@ -278,6 +305,7 @@ public class Panda extends Animal { +@@ -277,6 +304,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)); @@ -2097,25 +2095,25 @@ index cce6231b717027a70e85c641ccdab445225a990e..d18577440823cde6f44eb653c5f23afb this.targetSelector.addGoal(1, new Panda.PandaHurtByTargetGoal(this).setAlertOthers()); } -@@ -616,7 +644,7 @@ public class Panda extends Animal { +@@ -615,7 +643,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; -@@ -658,7 +686,7 @@ public class Panda extends Animal { + } + + if (this.isOnBack()) { +@@ -661,7 +689,7 @@ public class Panda extends Animal { return InteractionResult.SUCCESS_SERVER; } else { -- 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 +- return this.isBaby() && player.isHolding(Items.GOLDEN_DANDELION) ? super.mobInteract(player, hand) : InteractionResult.PASS; ++ return tryRide(player, hand, this.isBaby() && player.isHolding(Items.GOLDEN_DANDELION) ? super.mobInteract(player, hand) : InteractionResult.PASS); // Purpur - Ridables } } -@@ -965,7 +993,7 @@ public class Panda extends Animal { +@@ -968,7 +996,7 @@ public class Panda extends Animal { } } @@ -2124,7 +2122,7 @@ index cce6231b717027a70e85c641ccdab445225a990e..d18577440823cde6f44eb653c5f23afb private final Panda panda; public PandaMoveControl(final Panda mob) { -@@ -974,9 +1002,9 @@ public class Panda extends Animal { +@@ -977,9 +1005,9 @@ public class Panda extends Animal { } @Override @@ -2137,7 +2135,7 @@ index cce6231b717027a70e85c641ccdab445225a990e..d18577440823cde6f44eb653c5f23afb } } diff --git a/net/minecraft/world/entity/animal/parrot/Parrot.java b/net/minecraft/world/entity/animal/parrot/Parrot.java -index 24045d497aa11632438d4cbd1088168a7b6866e5..5173a05a15209972905024f9c4fa097e5a95092f 100644 +index 2fb6b134794d232ddb06176a6c3bb69431c7663c..0cc9e9dcdaeaee8db350b4dc4acb1e6c370aa2c3 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 { @@ -2224,7 +2222,7 @@ index 24045d497aa11632438d4cbd1088168a7b6866e5..5173a05a15209972905024f9c4fa097e 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 7cb1b0afd67ab8d1dcddaf685ccb814d1e29961d..57a80fbffd74a4bc0ec9f9e65abd7e2b68ef09a6 100644 +index ff9c2cd82c89c5c6be00467360dfef84a9ca7a96..ed655afebba29cccb7c15e6f15aee6478ecdaee4 100644 --- a/net/minecraft/world/entity/animal/pig/Pig.java +++ b/net/minecraft/world/entity/animal/pig/Pig.java @@ -68,9 +68,27 @@ public class Pig extends Animal implements ItemSteerable { @@ -2256,10 +2254,10 @@ index 7cb1b0afd67ab8d1dcddaf685ccb814d1e29961d..57a80fbffd74a4bc0ec9f9e65abd7e2b this.goalSelector.addGoal(3, new BreedGoal(this, 1.0)); 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 813247e74bddfa600b4d0bcbefd44209dfdae35c..d368954be1fc54052c29dd102e97404a46c87326 100644 +index 8bcfe80e696fe2f0a781a496772b2995f0151ab4..a7a77f9cae2f524ce7abbc694cdae7c95bef3e16 100644 --- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java +++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java -@@ -62,6 +62,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -61,6 +61,7 @@ public class PolarBear extends Animal implements NeutralMob { private static final UniformInt PERSISTENT_ANGER_TIME = TimeUtil.rangeOfSeconds(20, 39); private long persistentAngerEndTime; private @Nullable EntityReference persistentAngerTarget; @@ -2267,7 +2265,7 @@ index 813247e74bddfa600b4d0bcbefd44209dfdae35c..d368954be1fc54052c29dd102e97404a public PolarBear(final EntityType type, final Level level) { super(type, level); -@@ -90,6 +91,34 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -89,6 +90,34 @@ public class PolarBear extends Animal implements NeutralMob { } // Purpur end - Breedable Polar Bears @@ -2302,7 +2300,7 @@ index 813247e74bddfa600b4d0bcbefd44209dfdae35c..d368954be1fc54052c29dd102e97404a @Override public @Nullable AgeableMob getBreedOffspring(final ServerLevel level, final AgeableMob partner) { return EntityType.POLAR_BEAR.create(level, EntitySpawnReason.BREEDING); -@@ -104,6 +133,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -103,6 +132,7 @@ public class PolarBear extends Animal implements NeutralMob { protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -2310,7 +2308,7 @@ index 813247e74bddfa600b4d0bcbefd44209dfdae35c..d368954be1fc54052c29dd102e97404a this.goalSelector.addGoal(1, new PolarBear.PolarBearMeleeAttackGoal()); this.goalSelector.addGoal(1, new PanicGoal(this, 2.0, bear -> bear.isBaby() ? DamageTypeTags.PANIC_CAUSES : DamageTypeTags.PANIC_ENVIRONMENTAL_CAUSES)); // Purpur start - Breedable Polar Bears -@@ -116,6 +146,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -115,6 +145,7 @@ public class PolarBear extends Animal implements NeutralMob { this.goalSelector.addGoal(5, new RandomStrollGoal(this, 1.0)); this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F)); this.goalSelector.addGoal(7, new RandomLookAroundGoal(this)); @@ -2318,7 +2316,7 @@ index 813247e74bddfa600b4d0bcbefd44209dfdae35c..d368954be1fc54052c29dd102e97404a this.targetSelector.addGoal(1, new PolarBear.PolarBearHurtByTargetGoal()); this.targetSelector.addGoal(2, new PolarBear.PolarBearAttackPlayersGoal()); this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); -@@ -233,6 +264,12 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -232,6 +263,12 @@ public class PolarBear extends Animal implements NeutralMob { if (!this.level().isClientSide()) { this.updatePersistentAnger((ServerLevel)this.level(), true); } @@ -2331,7 +2329,7 @@ index 813247e74bddfa600b4d0bcbefd44209dfdae35c..d368954be1fc54052c29dd102e97404a } @Override -@@ -252,6 +289,7 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -251,6 +288,7 @@ public class PolarBear extends Animal implements NeutralMob { public void setStanding(final boolean value) { this.entityData.set(DATA_STANDING_ID, value); @@ -2340,7 +2338,7 @@ index 813247e74bddfa600b4d0bcbefd44209dfdae35c..d368954be1fc54052c29dd102e97404a 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 ab7e618ab8ef872d794f1ff82de881a5bca04bc5..1aede74986ccd58a9066d5baf4b5f55c62b11044 100644 +index 977143e1072b5691f32a0aa11e24a4e8b907476c..0053a1e7ed9b577128241e0c72f59d66eb532726 100644 --- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java +++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java @@ -108,6 +108,7 @@ public class Rabbit extends Animal { @@ -2504,7 +2502,7 @@ index 87fd91714510638386b13d285db889c075669f3e..08cd6e675107bf622b634c1f0e2cd53e this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); 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 c947f26f57de71ac0eafc0f56a96fec12ce5dba5..0f6f2b3818001ee786c941fdffccec80fb966e52 100644 +index 42c6100b82b82e3cebd6d808f644f4fc666037e3..b980ed12f7f20d89c6bd01d2c94cb2cc15f5c561 100644 --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java @@ -94,6 +94,23 @@ public class Sniffer extends Animal { @@ -2564,7 +2562,7 @@ index 7db02196ed1dd9057c9418d3d96164bb5082380b..51a0771819abfdde5043eaeca62b0ce4 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 c93dd55163a6121658a8944864d9e7036f0bccab..0854e0494f704e97e80581b80bf34df72786d1d9 100644 +index 45e170bbcc72206ed0018440c435359084749a7f..76c9c4cb6f7567946bc90e2d59990d5aabd8e4d9 100644 --- a/net/minecraft/world/entity/animal/squid/Squid.java +++ b/net/minecraft/world/entity/animal/squid/Squid.java @@ -74,9 +74,32 @@ public class Squid extends AgeableWaterCreature { @@ -2600,7 +2598,7 @@ index c93dd55163a6121658a8944864d9e7036f0bccab..0854e0494f704e97e80581b80bf34df7 this.goalSelector.addGoal(1, new Squid.SquidFleeGoal()); } -@@ -338,6 +361,37 @@ public class Squid extends AgeableWaterCreature { +@@ -333,6 +356,37 @@ public class Squid extends AgeableWaterCreature { @Override public void tick() { @@ -2709,10 +2707,10 @@ index d03a219af35e3c577386b87d553cc53c1e922553..53fc1012d46e20b623246cecae87b3fe 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 ec58779b3e899394f762b9780fd28790bbcbe537..a9349f047e6253b609b59a7590c0082a257bb9a5 100644 +index 3519e9289f79d89bcaa3ad51fe07657018aa607f..17c3d76f0d606722dbc657250a85de9306838356 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -183,9 +183,32 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -182,9 +182,32 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Configurable default collar color @@ -2745,7 +2743,7 @@ index ec58779b3e899394f762b9780fd28790bbcbe537..a9349f047e6253b609b59a7590c0082a 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)); -@@ -198,6 +221,7 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -197,6 +220,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)); @@ -2754,7 +2752,7 @@ index ec58779b3e899394f762b9780fd28790bbcbe537..a9349f047e6253b609b59a7590c0082a 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 6510f6e372de1a00deb985bc5539458f741b5a28..18b909626ca4b8cdad094671f7429acfa2c4888d 100644 +index 166361e45756b0cfce09502a89bd3a878820df08..bede0e9ce5b7c73d589511b71ad2a5f9e628eebc 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 { @@ -2892,11 +2890,11 @@ index 6510f6e372de1a00deb985bc5539458f741b5a28..18b909626ca4b8cdad094671f7429acf 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 +- if (this.level() instanceof ServerLevel serverLevel && this.hurtTime == 0) { ++ if (this.level() instanceof ServerLevel serverLevel && this.hurtTime == 0 && !hasRider) { // Purpur - Ridables this.knockBack( - serverLevelx, - serverLevelx.getEntities( + serverLevel, + serverLevel.getEntities( @@ -338,9 +413,9 @@ public class EnderDragon extends Mob implements Enemy { } @@ -2928,10 +2926,10 @@ index a8e3df21c27b9c86f9f03ea436ef4099a0805b71..a677aed54e16f3150ea1eabe22935a3d 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 75b9376d3109ad641e1762d9e670cb3005ca3c60..1f85cad7ac4c7cd2133142e74d51c2ad84fd4427 100644 +index 356e7f28786643e9cf2288addc3dac2a1ff4d617..852a604d8c06e9871da4c28d60b44a5869258011 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -74,6 +74,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -73,6 +73,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; @@ -2939,7 +2937,7 @@ index 75b9376d3109ad641e1762d9e670cb3005ca3c60..1f85cad7ac4c7cd2133142e74d51c2ad private boolean canPortal = false; // Paper 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 { +@@ -82,10 +83,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 @@ -2964,7 +2962,7 @@ index 75b9376d3109ad641e1762d9e670cb3005ca3c60..1f85cad7ac4c7cd2133142e74d51c2ad this.setHealth(this.getMaxHealth()); this.xpReward = 50; } -@@ -101,6 +115,105 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -100,6 +114,105 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Summoner API @@ -3070,7 +3068,7 @@ index 75b9376d3109ad641e1762d9e670cb3005ca3c60..1f85cad7ac4c7cd2133142e74d51c2ad @Override protected PathNavigation createNavigation(final Level level) { FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); -@@ -111,11 +224,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -110,11 +223,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { @Override protected void registerGoals() { @@ -3084,7 +3082,7 @@ index 75b9376d3109ad641e1762d9e670cb3005ca3c60..1f85cad7ac4c7cd2133142e74d51c2ad this.targetSelector.addGoal(1, new HurtByTargetGoal(this)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 0, false, false, LIVING_ENTITY_SELECTOR)); } -@@ -275,6 +390,15 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -274,6 +389,15 @@ public class WitherBoss extends Monster implements RangedAttackMob { @Override protected void customServerAiStep(final ServerLevel level) { @@ -3100,7 +3098,7 @@ index 75b9376d3109ad641e1762d9e670cb3005ca3c60..1f85cad7ac4c7cd2133142e74d51c2ad if (this.getInvulnerableTicks() > 0) { int newCount = this.getInvulnerableTicks() - 1; this.bossEvent.setProgress(1.0F - newCount / 220.0F); -@@ -578,11 +702,11 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -581,11 +705,11 @@ public class WitherBoss extends Monster implements RangedAttackMob { } public int getAlternativeTarget(final int headIndex) { @@ -3198,7 +3196,7 @@ index d48e066e8c43494aa74158452da369e5617d6a7e..c1acc0a648493ec33ef4fc4a48b52fe0 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 47f8a3415016831f90ba55c5d7331248f870689c..654e923ce9fb8a725077acc8e9c9b8c7658e23f9 100644 +index 4811c0607acbdf0e8f74327542560b96c84f728b..e5f7d276c083cdb78d2f420c03be1b08115d5597 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 { @@ -3332,7 +3330,7 @@ index ed994bae12ccf0500fb01ca84d40177b067b9ac2..b86f600b1101fe1fc9f7cac5cc47c3f0 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 f7a99b4a33b10a1791137282183888cf453b1c95..36aa44008e98e3a717cbf93d29f3e8780219dc6e 100644 +index 5b9733f1227f049ca3e00dc437fc3bc455271229..8b958dbdec8e68690525d345bd2f1038b1466ef9 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 { @@ -3385,11 +3383,11 @@ index f7a99b4a33b10a1791137282183888cf453b1c95..36aa44008e98e3a717cbf93d29f3e878 if (this.isInvulnerableTo(level, source)) { return false; + } 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 thrownPotion = source.getDirectEntity() instanceof AbstractThrownPotion potion ? potion : null; + } 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 + + 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 f507c54b8b9f4560a20462f4a76bd5b104e2ba15..c66b18f8f71ecf2c1d91b46eb8c9c0b5cb865c06 100644 +index c5957be3e49710ac7d03cf5f1362d8745889fc16..8405358d2221d76bc0949047fcc6f17fdfc99dfc 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 { @@ -3427,7 +3425,7 @@ index f507c54b8b9f4560a20462f4a76bd5b104e2ba15..c66b18f8f71ecf2c1d91b46eb8c9c0b5 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 25fc1dd56e87955589ccf3d48a010223fa9fcb00..0e056fbb4580e562928150e5002a44df001767a0 100644 +index f5b023651d6c3b21d3925856b5f851d879237381..0d40b789dc426c42aca47c01b4db57fb2b282f0d 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 { @@ -3535,7 +3533,7 @@ index 5f8074c93d2ad3d163bb416b16711d82edd7dacc..1b7a75a2be45928093382fa2f2da079f 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 b1e3b4e01f04139658bfb1350c36ca5594aaceb0..032b92678f2ac0d21df751d19009f11861c1efca 100644 +index 45f972568e2b0aa16ca19f02dff7a790c694985f..6ad546f033919c6f0ba1091222a7af0f365fabb0 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 { @@ -3582,7 +3580,7 @@ index b1e3b4e01f04139658bfb1350c36ca5594aaceb0..032b92678f2ac0d21df751d19009f118 this.targetSelector.addGoal(1, new NearestAttackableTargetGoal<>(this, LivingEntity.class, 10, true, false, new Guardian.GuardianAttackSelector(this))); } -@@ -342,7 +364,7 @@ public class Guardian extends Monster { +@@ -344,7 +366,7 @@ public class Guardian extends Monster { @Override protected void travelInWater(final Vec3 input, final double baseGravity, final boolean isFalling, final double oldY) { @@ -3591,7 +3589,7 @@ index b1e3b4e01f04139658bfb1350c36ca5594aaceb0..032b92678f2ac0d21df751d19009f118 this.move(MoverType.SELF, this.getDeltaMovement()); this.setDeltaMovement(this.getDeltaMovement().scale(0.9)); if (!this.isMoving() && this.getTarget() == null) { -@@ -447,7 +469,7 @@ public class Guardian extends Monster { +@@ -449,7 +471,7 @@ public class Guardian extends Monster { } } @@ -3600,7 +3598,7 @@ index b1e3b4e01f04139658bfb1350c36ca5594aaceb0..032b92678f2ac0d21df751d19009f118 private final Guardian guardian; public GuardianMoveControl(final Guardian guardian) { -@@ -455,8 +477,17 @@ public class Guardian extends Monster { +@@ -457,8 +479,17 @@ public class Guardian extends Monster { this.guardian = guardian; } @@ -3619,7 +3617,7 @@ index b1e3b4e01f04139658bfb1350c36ca5594aaceb0..032b92678f2ac0d21df751d19009f118 if (this.operation == MoveControl.Operation.MOVE_TO && !this.guardian.getNavigation().isDone()) { 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 { +@@ -468,7 +499,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(); @@ -3670,10 +3668,10 @@ index f6021d3e41bcf7c65c708f9937bafafecea34ce3..600da11f46673177a0ff1f56c93a60d9 @Override diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index d416108d33680c9f33d6f3e1b09bdb9164c8ee64..582890eb5a5b4757ad67bc2426cf3db9a8a335af 100644 +index c3b6aab3eabb4b7efef17979a28246143d71e896..961a874d3eeee40d4c45ae511412ac0167ae54ac 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -62,6 +62,52 @@ public class Phantom extends Mob implements Enemy { +@@ -61,6 +61,52 @@ public class Phantom extends Mob implements Enemy { this.lookControl = new Phantom.PhantomLookControl(this); } @@ -3726,7 +3724,7 @@ index d416108d33680c9f33d6f3e1b09bdb9164c8ee64..582890eb5a5b4757ad67bc2426cf3db9 @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; -@@ -74,9 +120,11 @@ public class Phantom extends Mob implements Enemy { +@@ -73,9 +119,11 @@ public class Phantom extends Mob implements Enemy { @Override protected void registerGoals() { @@ -3738,7 +3736,7 @@ index d416108d33680c9f33d6f3e1b09bdb9164c8ee64..582890eb5a5b4757ad67bc2426cf3db9 this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -92,6 +140,7 @@ public class Phantom extends Mob implements Enemy { +@@ -91,6 +139,7 @@ public class Phantom extends Mob implements Enemy { private void updatePhantomSizeInfo() { this.refreshDimensions(); @@ -3746,7 +3744,7 @@ index d416108d33680c9f33d6f3e1b09bdb9164c8ee64..582890eb5a5b4757ad67bc2426cf3db9 this.getAttribute(Attributes.ATTACK_DAMAGE).setBaseValue(6 + this.getPhantomSize()); } -@@ -160,6 +209,15 @@ public class Phantom extends Mob implements Enemy { +@@ -159,6 +208,15 @@ public class Phantom extends Mob implements Enemy { @Override public void travel(final Vec3 input) { this.travelFlying(input, 0.2F); @@ -3762,7 +3760,7 @@ index d416108d33680c9f33d6f3e1b09bdb9164c8ee64..582890eb5a5b4757ad67bc2426cf3db9 } @Override -@@ -419,17 +477,23 @@ public class Phantom extends Mob implements Enemy { +@@ -400,25 +458,42 @@ public class Phantom extends Mob implements Enemy { } } @@ -3786,11 +3784,10 @@ index d416108d33680c9f33d6f3e1b09bdb9164c8ee64..582890eb5a5b4757ad67bc2426cf3db9 - private class PhantomMoveControl extends MoveControl { + private class PhantomMoveControl extends org.purpurmc.purpur.controller.FlyingMoveControllerWASD { // Purpur - Ridables - private float speed; + private float speed = 0.1F; public PhantomMoveControl(final Mob mob) { -@@ -438,8 +502,19 @@ public class Phantom extends Mob implements Enemy { - this.speed = 0.1F; + super(mob); } + // Purpur start - Ridables @@ -3865,10 +3862,10 @@ index c88545ac6fc99e5d055126ef39f799f9caef257b..1d02a5a037cb50844419ef41227be242 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 22474b08a7a76ca1a68be121d4c82fdb375c1b16..70eeb536cd18662e75079109142e9e3f8eceec61 100644 +index 1f7a8b12a37b42fa38cb7136cd9ef5b3bab45d6b..746dfa496dc6cde62ab3c890aa6fbdbe68086ea9 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -110,12 +110,31 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -109,12 +109,31 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Shulker change color with dye @@ -3900,17 +3897,17 @@ index 22474b08a7a76ca1a68be121d4c82fdb375c1b16..70eeb536cd18662e75079109142e9e3f 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)); -@@ -712,7 +731,7 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -709,7 +728,7 @@ public class Shulker extends AbstractGolem implements Enemy { } } - 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 ba4ba5dfb1e51e2f45b0b81012ed6be27362c55c..68080332052f1e18d7be7d5c4c27347f3d57ddcc 100644 +index 95896f9276f3d4afa8141f2beed06974240a1318..4bda4d98e94f906cd86eafd412dd393b534ff8df 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 { @@ -4072,7 +4069,7 @@ index 04f0c15a891c86ab42fe5aa719cb1357f68dd0f6..47c6dfee0254c4ccd62ed4ff584a7823 } } diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index d09c1aabd5d11498a65b53fc080a1a3dea2187a3..76180ed355b0d3cb52bfebc7cbf32b91486d6f5b 100644 +index 9bf12a67f7175ae7c7dadee84a5ab0de5cae43e8..039b83311bee193038968bf44c0bcbc98c5579df 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -93,6 +93,23 @@ public class Strider extends Animal implements ItemSteerable { @@ -4107,20 +4104,20 @@ index d09c1aabd5d11498a65b53fc080a1a3dea2187a3..76180ed355b0d3cb52bfebc7cbf32b91 this.goalSelector.addGoal(2, new BreedGoal(this, 1.0)); this.temptGoal = new TemptGoal(this, 1.4, i -> i.is(ItemTags.STRIDER_TEMPT_ITEMS), false); this.goalSelector.addGoal(3, this.temptGoal); -@@ -424,7 +442,7 @@ public class Strider extends Animal implements ItemSteerable { +@@ -422,7 +440,7 @@ public class Strider extends Animal implements ItemSteerable { + InteractionResult interactionResult = super.mobInteract(player, hand); + if (!interactionResult.consumesAction()) { 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 (hasFood && !this.isSilent()) { - this.level() +- return this.isEquippableInSlot(itemStack, EquipmentSlot.SADDLE) ? itemStack.interactLivingEntity(player, this, hand) : InteractionResult.PASS; ++ return this.isEquippableInSlot(itemStack, EquipmentSlot.SADDLE) ? itemStack.interactLivingEntity(player, this, hand) : tryRide(player, hand); // Purpur - Ridables + } + + if (hasFood && !this.isSilent()) { diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index de29a98dad6df73b58d96ef46cb87bdb1c11de5f..884ac753ab4b496429c4cf808f173aa4bdbf0ea9 100644 +index e23aa0c86cd4070628f29b51eb4f804bb63a4f27..0621c1a46c392b8fcf5235f7483d0d8a0ac598ed 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -59,6 +59,50 @@ public class Vex extends Monster implements TraceableEntity { +@@ -58,6 +58,50 @@ public class Vex extends Monster implements TraceableEntity { this.xpReward = 3; } @@ -4171,7 +4168,7 @@ index de29a98dad6df73b58d96ef46cb87bdb1c11de5f..884ac753ab4b496429c4cf808f173aa4 @Override public boolean isFlapping() { return this.tickCount % TICKS_PER_FLAP == 0; -@@ -71,7 +115,7 @@ public class Vex extends Monster implements TraceableEntity { +@@ -70,7 +114,7 @@ public class Vex extends Monster implements TraceableEntity { @Override public void tick() { @@ -4180,7 +4177,7 @@ index de29a98dad6df73b58d96ef46cb87bdb1c11de5f..884ac753ab4b496429c4cf808f173aa4 super.tick(); this.noPhysics = false; this.setNoGravity(true); -@@ -85,17 +129,19 @@ public class Vex extends Monster implements TraceableEntity { +@@ -84,17 +128,19 @@ public class Vex extends Monster implements TraceableEntity { protected void registerGoals() { super.registerGoals(); this.goalSelector.addGoal(0, new FloatGoal(this)); @@ -4201,14 +4198,13 @@ index de29a98dad6df73b58d96ef46cb87bdb1c11de5f..884ac753ab4b496429c4cf808f173aa4 } @Override -@@ -298,14 +344,14 @@ public class Vex extends Monster implements TraceableEntity { +@@ -293,13 +339,13 @@ public class Vex extends Monster implements TraceableEntity { } } - 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); } @@ -4218,7 +4214,7 @@ index de29a98dad6df73b58d96ef46cb87bdb1c11de5f..884ac753ab4b496429c4cf808f173aa4 if (this.operation == MoveControl.Operation.MOVE_TO) { 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 { +@@ -307,7 +353,7 @@ public class Vex extends Monster implements TraceableEntity { this.operation = MoveControl.Operation.WAIT; Vex.this.setDeltaMovement(Vex.this.getDeltaMovement().scale(0.5)); } else { @@ -4317,10 +4313,10 @@ index a58ad6176864c299725f5d51b3c239259f3b9c20..ec4d124b6a714d6b57d006ba70d838a3 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 6c46a3d57201c3f83cb5269dc9aef4023d20d8e9..d7a2e2a660d9844e159ca196d155ed76d277040d 100644 +index 7e4910d8492dae511db604e52fe5dfa6373c76ee..fdbf9b64871c5cdb7ed9fa56c669bd77d1a19ac2 100644 --- a/net/minecraft/world/entity/monster/creaking/Creaking.java +++ b/net/minecraft/world/entity/monster/creaking/Creaking.java -@@ -107,6 +107,29 @@ public class Creaking extends Monster { +@@ -106,6 +106,29 @@ public class Creaking extends Monster { return this.getHomePos() != null; } @@ -4350,14 +4346,13 @@ index 6c46a3d57201c3f83cb5269dc9aef4023d20d8e9..d7a2e2a660d9844e159ca196d155ed76 @Override protected BodyRotationControl createBodyControl() { return new Creaking.CreakingBodyRotationControl(this); -@@ -548,30 +571,30 @@ public class Creaking extends Monster { +@@ -548,28 +571,28 @@ public class Creaking extends Monster { } } - 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); } @@ -4374,7 +4369,6 @@ index 6c46a3d57201c3f83cb5269dc9aef4023d20d8e9..d7a2e2a660d9844e159ca196d155ed76 - 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); } @@ -4424,10 +4418,10 @@ index e3f59999c9592af213b21afb43bcaddb94fd8279..7ba62badc9b832bdedbec5984421abfe 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 9c0ca3786a9ac50537d6e9ed2f8b21bb27407fb2..f1ded053c1ff4cc45496b61cf9e010e3632674cd 100644 +index 442940e8bbcd45271e71d91ecae9adbb0ef6fae2..2d8654f1b16ee3177466dc21aff7c2bdbce310a7 100644 --- a/net/minecraft/world/entity/monster/illager/Evoker.java +++ b/net/minecraft/world/entity/monster/illager/Evoker.java -@@ -50,10 +50,28 @@ public class Evoker extends SpellcasterIllager { +@@ -49,10 +49,28 @@ public class Evoker extends SpellcasterIllager { this.xpReward = 10; } @@ -4456,7 +4450,7 @@ index 9c0ca3786a9ac50537d6e9ed2f8b21bb27407fb2..f1ded053c1ff4cc45496b61cf9e010e3 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)); -@@ -63,6 +81,7 @@ public class Evoker extends SpellcasterIllager { +@@ -62,6 +80,7 @@ public class Evoker extends SpellcasterIllager { this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6)); this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); @@ -4465,10 +4459,10 @@ index 9c0ca3786a9ac50537d6e9ed2f8b21bb27407fb2..f1ded053c1ff4cc45496b61cf9e010e3 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 bc64ea6051d9d1401ff0192456564b05b53e6d8f..6a9f25c465a2b54969d7ec3b658355f485f36722 100644 +index f4b93c3dd12d762f280c7b52af5d3b5f58cb9cef..9ea4745eb0d72c25ac5b89a6bfa5ba2846740f07 100644 --- a/net/minecraft/world/entity/monster/illager/Illusioner.java +++ b/net/minecraft/world/entity/monster/illager/Illusioner.java -@@ -60,10 +60,28 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -59,10 +59,28 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } } @@ -4497,7 +4491,7 @@ index bc64ea6051d9d1401ff0192456564b05b53e6d8f..6a9f25c465a2b54969d7ec3b658355f4 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()); -@@ -72,6 +90,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -71,6 +89,7 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { this.goalSelector.addGoal(8, new RandomStrollGoal(this, 0.6)); this.goalSelector.addGoal(9, new LookAtPlayerGoal(this, Player.class, 3.0F, 1.0F)); this.goalSelector.addGoal(10, new LookAtPlayerGoal(this, Mob.class, 8.0F)); @@ -4585,7 +4579,7 @@ index 4404765ba6b971f5525d3fba73a57d17d5f16dec..c3164a33fd8010e1920eead11c482641 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 0cbe847539e81784050c25873d11133f24f80f82..f53cf55c490585595381c184e6dced8d9dcc0439 100644 +index a6623851235d8c6fa6fe7519b5d04674ecd31eb5..f617f3cbd41e9b60faf1489dd32972c6a2467fe1 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -108,6 +108,23 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -4657,10 +4651,10 @@ index ca543d886dee48a03175d0c96051d4f956d33a9d..75fea76d60b76a81646aa3ae4defa6cc 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 f8f300faa99bd5314ae272f404567636b7c73cc4..32da5212c85c829eeedc9d0f7904bbcaa3ce5ed3 100644 +index 297d7ce0e5e38471f22dd61123ccf0348e85b9bf..695dca87fc3ef633290f9abe1089e7a6a0e7feb9 100644 --- a/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java +++ b/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java -@@ -80,12 +80,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo +@@ -75,12 +75,14 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo @Override protected void registerGoals() { @@ -4760,7 +4754,7 @@ index dd5db995d603cc9c8a263255a16dedb766244499..1d706fe3bca726a4e606232039beeade 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 27f0e22f015aad556bff6dac404b6ed2df04e486..fc4ed0855a00a90cb7232ac9e28510b09163a74d 100644 +index de05a15d4609bb76c57101b8c5a3a3600833fd2d..3651c21dc87a76ad4aa268a2de6686016b589e6c 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 { @@ -4855,10 +4849,10 @@ index 1507f340b16fd95985bfe49870e923c626833d18..546561f6b9960de22d84468a317c65f3 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 eb7908467737e949ead0289bb43d40f008746fb8..8bb0990298135a48dcb3dacf71a2194248cce58f 100644 +index 72332ef3956b0cc1550221dfa6179ea0a6ecc87a..4af25b2afa2cb8a2fec84d9281bd386d1517a644 100644 --- a/net/minecraft/world/entity/monster/warden/Warden.java +++ b/net/minecraft/world/entity/monster/warden/Warden.java -@@ -133,8 +133,32 @@ public class Warden extends Monster implements VibrationSystem { +@@ -132,8 +132,32 @@ public class Warden extends Monster implements VibrationSystem { this.setPathfindingMalus(PathType.LAVA, 8.0F); this.setPathfindingMalus(PathType.FIRE, 0.0F); this.setPathfindingMalus(PathType.FIRE_IN_NEIGHBOR, 0.0F); @@ -4891,7 +4885,7 @@ index eb7908467737e949ead0289bb43d40f008746fb8..8bb0990298135a48dcb3dacf71a21942 @Override 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 { +@@ -288,6 +312,7 @@ public class Warden extends Monster implements VibrationSystem { protected void customServerAiStep(final ServerLevel level) { ProfilerFiller profiler = Profiler.get(); profiler.push("wardenBrain"); @@ -4899,7 +4893,7 @@ index eb7908467737e949ead0289bb43d40f008746fb8..8bb0990298135a48dcb3dacf71a21942 this.getBrain().tick(level, this); profiler.pop(); super.customServerAiStep(level); -@@ -391,6 +416,7 @@ public class Warden extends Monster implements VibrationSystem { +@@ -390,6 +415,7 @@ public class Warden extends Monster implements VibrationSystem { @Contract("null->false") public boolean canTargetEntity(final @Nullable Entity entity) { @@ -4908,7 +4902,7 @@ index eb7908467737e949ead0289bb43d40f008746fb8..8bb0990298135a48dcb3dacf71a21942 && 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 4d1ac2c1c0a5dee069c632ce4d92ea0aa4b63b6f..4b033392e1ba25dbcfd7710d3a8bfbc040d42938 100644 +index 78cb0e6d7161aaf2da9bc0ef90bc5946e98c8129..643cf630000cd389ff7ae073a1850f2ae3f4a458 100644 --- a/net/minecraft/world/entity/monster/zombie/Drowned.java +++ b/net/minecraft/world/entity/monster/zombie/Drowned.java @@ -81,6 +81,23 @@ public class Drowned extends Zombie implements RangedAttackMob { @@ -4935,7 +4929,7 @@ index 4d1ac2c1c0a5dee069c632ce4d92ea0aa4b63b6f..4b033392e1ba25dbcfd7710d3a8bfbc0 @Override protected PathNavigation createNavigation(final Level level) { return new AmphibiousPathNavigation(this, level); -@@ -445,7 +462,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -447,7 +464,7 @@ public class Drowned extends Zombie implements RangedAttackMob { } } @@ -4944,7 +4938,7 @@ index 4d1ac2c1c0a5dee069c632ce4d92ea0aa4b63b6f..4b033392e1ba25dbcfd7710d3a8bfbc0 private final Drowned drowned; public DrownedMoveControl(final Drowned drowned) { -@@ -454,7 +471,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -456,7 +473,7 @@ public class Drowned extends Zombie implements RangedAttackMob { } @Override @@ -4953,7 +4947,7 @@ index 4d1ac2c1c0a5dee069c632ce4d92ea0aa4b63b6f..4b033392e1ba25dbcfd7710d3a8bfbc0 LivingEntity target = this.drowned.getTarget(); if (this.drowned.wantsToSwim() && this.drowned.isInWater()) { if (target != null && target.getY() > this.drowned.getY() || this.drowned.searchingForLand) { -@@ -474,7 +491,7 @@ public class Drowned extends Zombie implements RangedAttackMob { +@@ -476,7 +493,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(); @@ -4962,7 +4956,7 @@ index 4d1ac2c1c0a5dee069c632ce4d92ea0aa4b63b6f..4b033392e1ba25dbcfd7710d3a8bfbc0 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 { +@@ -485,7 +502,7 @@ public class Drowned extends Zombie implements RangedAttackMob { this.drowned.setDeltaMovement(this.drowned.getDeltaMovement().add(0.0, -0.008, 0.0)); } @@ -5000,10 +4994,10 @@ index 4e5f6cf6c8ffc965fd3e6b3069998d2b39e4e779..dfb43d27865674f4f13050682eda38af 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 b0c8610dd3b8f7cf14db2d2f3169dfac106c0fee..e76895db48b00150a749a6e3d1fb2807dc9852bd 100644 +index 6f5bdf9657a8b30d8b9390e02e1660eba31b096a..5d86cfd5c5d679368ddebf1afd7e32702b6e34a9 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -113,11 +113,30 @@ public class Zombie extends Monster { +@@ -112,11 +112,30 @@ public class Zombie extends Monster { this(EntityType.ZOMBIE, level); } @@ -5091,7 +5085,7 @@ index 2d294595b2d9e4daaf221482514329126d59f077..eb3ec4314603f61a041740d5b5e52165 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 b46ce266b57670dfaaf9adb251ff32ad9e862766..c73f48509a060a05f9f9c3062dbbcbcde9b0ec71 100644 +index 18e4071adb53edf1e511893dc2a21d955ba55900..627461178e2ab4f59699e04b16d8d0f337a0daba 100644 --- a/net/minecraft/world/entity/npc/villager/Villager.java +++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -252,6 +252,28 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re @@ -5132,33 +5126,33 @@ index b46ce266b57670dfaaf9adb251ff32ad9e862766..c73f48509a060a05f9f9c3062dbbcbcd this.getBrain().tick(level, this); // Paper - EAR 2 } else if (this.isLobotomized && shouldRestock(level)) restock(); -@@ -392,7 +414,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re - return super.mobInteract(player, hand); - } else if (this.isBaby()) { +@@ -394,7 +416,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re + + if (this.isBaby()) { this.setUnhappy(); - return InteractionResult.SUCCESS; + return tryRide(player, hand, InteractionResult.SUCCESS); // Purpur - Ridables - } else { - if (!this.level().isClientSide()) { - boolean noOffers = this.getOffers().isEmpty(); -@@ -405,9 +427,11 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re - } + } - if (noOffers) { -- return InteractionResult.CONSUME; -+ return tryRide(player, hand, InteractionResult.CONSUME); // 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); + if (!this.level().isClientSide()) { +@@ -408,9 +430,11 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } + + if (noOffers) { +- return InteractionResult.CONSUME; ++ return tryRide(player, hand, InteractionResult.CONSUME); // 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 a37fa3473db1f48212eecea683aea53284d50f15..2d0203b256080c3779331ff686714ae491d7b3ec 100644 +index f99d5379a83dc9aabe8c8fef52bb2b0cccc40e19..4c35ca3877b88b13a1919d0625e5055b4554057f 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 +@@ -67,6 +67,23 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over } // Purpur end - Allow leashing villagers @@ -5182,7 +5176,7 @@ index a37fa3473db1f48212eecea683aea53284d50f15..2d0203b256080c3779331ff686714ae4 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); -@@ -125,8 +142,9 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +@@ -124,8 +141,9 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over if (!this.level().isClientSide()) { if (this.getOffers().isEmpty()) { @@ -5194,10 +5188,10 @@ index a37fa3473db1f48212eecea683aea53284d50f15..2d0203b256080c3779331ff686714ae4 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 f147403c3cff53c8d4fb3f7d62131582244eb7c0..54e99bf8787be854e2b0d18584b58f42deaee7ea 100644 +index 7c4ae5904081da7b0e4c135c243f2d9cebb161d9..3b0a0525cdca3ea5b91834e04b42696a7cedde10 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -194,6 +194,19 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -193,6 +193,19 @@ public abstract class Player extends Avatar implements ContainerUser { } // CraftBukkit end diff --git a/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch b/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch index 708216c02..4029a35ff 100644 --- a/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch +++ b/purpur-server/minecraft-patches/features/0002-Configurable-entity-base-attributes.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Configurable entity base attributes diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 40f3e802ca9a9ca9977ce32a24bc56af971f2eaa..a20626d0b750ba89836d806bef61528758849311 100644 +index bb6dc165d393a527564810e0cd2f8137e5272b9e..3bc8a8d26569a3c26e518cd48c52b9b6c9e38294 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -296,6 +296,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin @@ -26,7 +26,7 @@ index 40f3e802ca9a9ca9977ce32a24bc56af971f2eaa..a20626d0b750ba89836d806bef615287 return (Brain)this.brain; } diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index 7f036c3548aea7a23f5a085ce6d9ce987fbc5116..f40892bbe424408e3d11c887d5bd0fef179aaced 100644 +index 9861837c1d10e5ffe5dada9f4a75fb9adaccc161..cb242c69be97e0927dd62714f1a9b112c0dec84b 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,7 +52,7 @@ index 7f036c3548aea7a23f5a085ce6d9ce987fbc5116..f40892bbe424408e3d11c887d5bd0fef 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 cf1bfb79588236fc648aefcc64bb759862084f58..3a78175273efa24a6bf98ee44fe24a4df71e63ed 100644 +index 931726ddada92a4b1063dd9dbdc89723f6a283cc..f5bf06a36f4ffd0370a95ef6d18e99d4daedcd65 100644 --- a/net/minecraft/world/entity/animal/allay/Allay.java +++ b/net/minecraft/world/entity/animal/allay/Allay.java @@ -154,6 +154,14 @@ public class Allay extends PathfinderMob implements InventoryCarrier, VibrationS @@ -71,10 +71,10 @@ index cf1bfb79588236fc648aefcc64bb759862084f58..3a78175273efa24a6bf98ee44fe24a4d 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 1df0f3e17dadd836dbac39feec56c3b198117340..7c2c71a57b9278aea428e314462cebc08e168b50 100644 +index d8dcb325325ba2fc6b78ff62c95cb818c5fcf3fc..b55d1d5abe06d753063ea7939bd975c055a1cc95 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -107,6 +107,14 @@ public class Armadillo extends Animal { +@@ -106,6 +106,14 @@ public class Armadillo extends Animal { } // Purpur end - Ridables @@ -90,10 +90,10 @@ index 1df0f3e17dadd836dbac39feec56c3b198117340..7c2c71a57b9278aea428e314462cebc0 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 8704620cd9348d3c417cbc9591e03c70bf4d4f45..c10b06f8adcd59869d043e48cfe3fdb60051c3db 100644 +index 993f8195bf67d675eccef47314de0ba0f257b855..e0b9b15b2727953deb7850ed57edd7248f88c184 100644 --- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -135,6 +135,14 @@ public class Axolotl extends Animal implements Bucketable { +@@ -134,6 +134,14 @@ public class Axolotl extends Animal implements Bucketable { } // Purpur end - Ridables @@ -109,10 +109,10 @@ index 8704620cd9348d3c417cbc9591e03c70bf4d4f45..c10b06f8adcd59869d043e48cfe3fdb6 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 2b398421d196902c5c812126528f32fc9863b497..b22f49887219bcffe8e30fd22e9f9dd67fc371bc 100644 +index 67971c3054fd17ee75c69c6168bd74f11dca4c86..24dfd3846abcb0f4f00d9c0e58f1e5389e7db658 100644 --- a/net/minecraft/world/entity/animal/bee/Bee.java +++ b/net/minecraft/world/entity/animal/bee/Bee.java -@@ -480,6 +480,14 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -479,6 +479,14 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { return beehiveBlockEntity != null && beehiveBlockEntity.isFireNearby(); } @@ -128,10 +128,10 @@ index 2b398421d196902c5c812126528f32fc9863b497..b22f49887219bcffe8e30fd22e9f9dd6 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 e20cae40eb84bf01b38cf6b5249410cb7e2525a1..0b3cf5ad57350c5c7a453dc7a96891238491a41a 100644 +index fcbb743a07b691f11f14febe5a05959326999293..aee34b1ac868f0f0fc24e3ffe022d51141143c9b 100644 --- a/net/minecraft/world/entity/animal/camel/Camel.java +++ b/net/minecraft/world/entity/animal/camel/Camel.java -@@ -349,6 +349,23 @@ public class Camel extends AbstractHorse { +@@ -348,6 +348,23 @@ public class Camel extends AbstractHorse { return this.dashCooldown; } @@ -194,7 +194,7 @@ index e200b9a459c3f410d2e9affbad8ba8e37e1a1ca5..33c0b8f2c43065ea89b3f9c6a519dde2 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 2131ba3eb10e869ff6dad67fb6b8097a8d6f1ab6..d6ec397a14753526dd34ab3a7e69ae4be36c04a6 100644 +index 7411d6aafa9ec3b5d6305bb8c1b8d03444cf6aa2..58d37bd62fec5071fb4a0c297f6c2ef89a3d79e4 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 { @@ -212,7 +212,7 @@ index 2131ba3eb10e869ff6dad67fb6b8097a8d6f1ab6..d6ec397a14753526dd34ab3a7e69ae4b 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 924fd56994f63deb4a8fe03f870d14fc943390e4..b2e6307ead267fa8a1acd6956c409f2bcbf28c41 100644 +index 82a56ecf76f53e72d1af67228ce7f9c74678b59f..f8e155393b0c2a69018da88556116b4eeb416d83 100644 --- a/net/minecraft/world/entity/animal/dolphin/Dolphin.java +++ b/net/minecraft/world/entity/animal/dolphin/Dolphin.java @@ -154,6 +154,14 @@ public class Dolphin extends AgeableWaterCreature { @@ -231,10 +231,10 @@ index 924fd56994f63deb4a8fe03f870d14fc943390e4..b2e6307ead267fa8a1acd6956c409f2b public @Nullable SpawnGroupData finalizeSpawn( 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 1698e519a50670990e43f33c35d5a3f648c2cf61..ad21f1725c8d10e26382c8f7a0fccb7094580082 100644 +index 59bf0106908fba34500d1e44d6a02bb27b71ffe5..8f6d6f4cc72670576e7fb0fb3cfee018fa0857d6 100644 --- a/net/minecraft/world/entity/animal/equine/AbstractHorse.java +++ b/net/minecraft/world/entity/animal/equine/AbstractHorse.java -@@ -141,6 +141,46 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump +@@ -140,6 +140,46 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump } // Purpur end - Ridables @@ -281,7 +281,7 @@ index 1698e519a50670990e43f33c35d5a3f648c2cf61..ad21f1725c8d10e26382c8f7a0fccb70 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HorseHasRider(this)); // Purpur - Ridables -@@ -1057,7 +1097,7 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump +@@ -1058,7 +1098,7 @@ public abstract class AbstractHorse extends Animal implements PlayerRideableJump groupData = new AgeableMob.AgeableMobGroupData(0.2F); } @@ -347,7 +347,7 @@ index d2dc51d7a8d97db64bf87f8337b10442acc5bc47..8ba8430f41ce74736f405bfac2ef5de6 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 d1049724b127c6f6307ee370ccdd4c611ec60b03..5a62d6fcc6420878a5d612e556503f01f5084d44 100644 +index 90928f2a840493b16b34bf870fc511e74d1150ea..942f55f750b7ba0cf25429ca888a46bc4c172eb3 100644 --- a/net/minecraft/world/entity/animal/equine/Llama.java +++ b/net/minecraft/world/entity/animal/equine/Llama.java @@ -134,6 +134,23 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { @@ -403,7 +403,7 @@ index ce4c2424cd6922c03cf44cc731526775eba25220..a866b93312391142b030605e2108fe52 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 e4ee09f1b51f80d35bd3f80f07d06093acc3bfcf..fcc9b9f884aed489ab6016d1de3dfd861781d8e5 100644 +index 8a9f46e45ce077230ec918d46f599092fbe3e851..6b12c3a1a99ce66751f8e7d65ee1f6c21ffb0833 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 { @@ -487,7 +487,7 @@ index 13857de6c4be09b7d0798d2a0fd420c705ac1d5d..ae429aec9be39d9af7da4671db15a450 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 a3075535ed8726670c67d6aba0a32a00c53a70dc..e31cf2f1c4a0a419ba378424ea0a059a0117e0a4 100644 +index 36688a571cdf35697d0cd97bee316f5474bcae73..74c271dd9d55c846ed5440ff0d9c378a06da059d 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 { @@ -561,7 +561,7 @@ index 8d3e8575120145f572b2c1834d243bac8eb28586..26acbeff80d3a4216b69b9842381f3fa 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 e75e66134026a93e7681befb67abb5783fde37cf..d9276ab9af526f1714d3241bbf6f9c7906adec70 100644 +index e96062cd57e1866c398418ebbb8f2443a668f480..9bce191fbc3b68a051f50e85674b8cfd42832a85 100644 --- a/net/minecraft/world/entity/animal/fish/Salmon.java +++ b/net/minecraft/world/entity/animal/fish/Salmon.java @@ -53,6 +53,13 @@ public class Salmon extends AbstractSchoolingFish { @@ -579,7 +579,7 @@ index e75e66134026a93e7681befb67abb5783fde37cf..d9276ab9af526f1714d3241bbf6f9c79 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 3d00bcbb4ac39c7d8b4bacf15d7cfe4ad5a4a706..fbe7b76aac06bb0dce7ae53dea85e947a53d1b64 100644 +index d48f8dc3e806ffe767565158bcfa17631839a61c..e9692aacca5f32c4280b16b4eabecf87c2ed5aeb 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 { @@ -597,10 +597,10 @@ index 3d00bcbb4ac39c7d8b4bacf15d7cfe4ad5a4a706..fbe7b76aac06bb0dce7ae53dea85e947 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 ab45081d00a012949f43929f06e9bfcdf5b3c89a..ec4137a994005c4e7845d63d9347c0586c6f77ee 100644 +index c60343771f5490236212221e7d5f2b73dee4865c..d218a71c2475240438029ca44e86d7584ff36f73 100644 --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java -@@ -193,6 +193,14 @@ public class Fox extends Animal { +@@ -192,6 +192,14 @@ public class Fox extends Animal { } // Purpur end - Ridables @@ -616,7 +616,7 @@ index ab45081d00a012949f43929f06e9bfcdf5b3c89a..ec4137a994005c4e7845d63d9347c058 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 dd9d71eebbd9b013ae69db7b9869be8dd30ae0ba..bc66450f8d1be97f11f8380755a9973e8ef4befa 100644 +index d842d79bbd5253a2a701a87221258751aa112c3e..00877102ad4261ecd7191e402cf4e381dd6e40b3 100644 --- a/net/minecraft/world/entity/animal/golem/CopperGolem.java +++ b/net/minecraft/world/entity/animal/golem/CopperGolem.java @@ -134,6 +134,16 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab @@ -637,7 +637,7 @@ index dd9d71eebbd9b013ae69db7b9869be8dd30ae0ba..bc66450f8d1be97f11f8380755a9973e 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 b9672e22eb3655168db2f85d4a273b3604f04618..ec08c9c2ac32863807061d93ec8894bd094f7ab4 100644 +index c6e0038cb3314b4db17d307b99de65dde107d5a1..cd68a06abb509dbdbcf909d3f3e142c7a1f896cf 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 { @@ -675,10 +675,10 @@ index 6875e40687bbde6aba25da7d3145eccdccea6f52..bd594838ae25f16e6e16335e06c4d981 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 f1da6beccfd658d8209dbc3e52f570a476f1c95b..f7f65e0935404a2eb404e5053acb9f6acd353272 100644 +index 0ffa1ed6fe9e8aa01c91dee4cefb8b9a1273770b..7991ef3a11c7901d361fef6349aef37737a69b76 100644 --- a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +++ b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java -@@ -141,6 +141,19 @@ public class HappyGhast extends Animal { +@@ -140,6 +140,19 @@ public class HappyGhast extends Animal { } // Purpur end - Ridables @@ -698,7 +698,7 @@ index f1da6beccfd658d8209dbc3e52f570a476f1c95b..f7f65e0935404a2eb404e5053acb9f6a @Override protected void ageBoundaryReached() { if (this.isBaby()) { -@@ -164,7 +177,7 @@ public class HappyGhast extends Animal { +@@ -163,7 +176,7 @@ public class HappyGhast extends Animal { @Override protected float sanitizeScale(final float scale) { @@ -752,10 +752,10 @@ index c4661d5d89d1a5f4b106a9a015cdaed1976efce4..087e768c35c2c2af191c75648b278154 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 d18577440823cde6f44eb653c5f23afb09ea89ac..838bc9b3f5bc3df3db16ba564222eed65215461a 100644 +index e551907cd2721fa330639aa590ef76711e7e21d6..83ec6995b5fc47872efb5039c3e24cd62da22d10 100644 --- a/net/minecraft/world/entity/animal/panda/Panda.java +++ b/net/minecraft/world/entity/animal/panda/Panda.java -@@ -137,6 +137,15 @@ public class Panda extends Animal { +@@ -136,6 +136,15 @@ public class Panda extends Animal { } // Purpur end - Ridables @@ -771,7 +771,7 @@ index d18577440823cde6f44eb653c5f23afb09ea89ac..838bc9b3f5bc3df3db16ba564222eed6 @Override protected boolean canDispenserEquipIntoSlot(final EquipmentSlot slot) { return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot(); -@@ -624,7 +633,11 @@ public class Panda extends Animal { +@@ -623,7 +632,11 @@ public class Panda extends Animal { public void setAttributes() { if (this.isWeak()) { @@ -785,7 +785,7 @@ index d18577440823cde6f44eb653c5f23afb09ea89ac..838bc9b3f5bc3df3db16ba564222eed6 if (this.isLazy()) { diff --git a/net/minecraft/world/entity/animal/parrot/Parrot.java b/net/minecraft/world/entity/animal/parrot/Parrot.java -index 5173a05a15209972905024f9c4fa097e5a95092f..d3b9a3ac77f03e3b6b580a678283f85a19cb660e 100644 +index 0cc9e9dcdaeaee8db350b4dc4acb1e6c370aa2c3..c11c6fdc96d696a2f8c4aee96f4ddf6c4f9b9676 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 { @@ -804,7 +804,7 @@ index 5173a05a15209972905024f9c4fa097e5a95092f..d3b9a3ac77f03e3b6b580a678283f85a public @Nullable SpawnGroupData finalizeSpawn( 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 57a80fbffd74a4bc0ec9f9e65abd7e2b68ef09a6..02ed5052bd06844ec6811c4249398ba8ba8c4ea6 100644 +index ed655afebba29cccb7c15e6f15aee6478ecdaee4..7246b53d2fba7e547d41fd5db1eb487738e5b51e 100644 --- a/net/minecraft/world/entity/animal/pig/Pig.java +++ b/net/minecraft/world/entity/animal/pig/Pig.java @@ -85,6 +85,14 @@ public class Pig extends Animal implements ItemSteerable { @@ -823,10 +823,10 @@ index 57a80fbffd74a4bc0ec9f9e65abd7e2b68ef09a6..02ed5052bd06844ec6811c4249398ba8 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 d368954be1fc54052c29dd102e97404a46c87326..e50c934e2c9959f843aae2b2dd05a682ca5f59fc 100644 +index a7a77f9cae2f524ce7abbc694cdae7c95bef3e16..ddfc7cab1b3864fc523e0837ff4acb8454e83ac9 100644 --- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java +++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java -@@ -119,6 +119,14 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -118,6 +118,14 @@ public class PolarBear extends Animal implements NeutralMob { } // Purpur end - Ridables @@ -842,7 +842,7 @@ index d368954be1fc54052c29dd102e97404a46c87326..e50c934e2c9959f843aae2b2dd05a682 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 fa6fd57be6e4a36e701eb61634440a79b47bbd94..bf643b9e6929890f061ac2c44b196460234095c4 100644 +index 0053a1e7ed9b577128241e0c72f59d66eb532726..4aa18f0ce6f07f479f1d856c9cef9fa5d6329138 100644 --- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java +++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java @@ -162,6 +162,14 @@ public class Rabbit extends Animal { @@ -880,7 +880,7 @@ index 08cd6e675107bf622b634c1f0e2cd53e33ef3569..eb919dc63d950af08448b75559467ec8 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 0f6f2b3818001ee786c941fdffccec80fb966e52..7335e46f249b9a88ca0401493636f6e06c0e196d 100644 +index b980ed12f7f20d89c6bd01d2c94cb2cc15f5c561..73a1ba04a6a3ef0d0aba3301b6c1dfefeacb4df6 100644 --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java @@ -111,6 +111,14 @@ public class Sniffer extends Animal { @@ -917,7 +917,7 @@ index 51a0771819abfdde5043eaeca62b0ce45c40039e..cb3d0bd838473af87af74c7d1bab3859 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 0854e0494f704e97e80581b80bf34df72786d1d9..49ef7f4004a2f82df2d8cbf0d0473a5d84588fac 100644 +index 76c9c4cb6f7567946bc90e2d59990d5aabd8e4d9..da8e8d817f959ffcbc0a84a40af854ecfc939ef2 100644 --- a/net/minecraft/world/entity/animal/squid/Squid.java +++ b/net/minecraft/world/entity/animal/squid/Squid.java @@ -96,6 +96,14 @@ public class Squid extends AgeableWaterCreature { @@ -955,10 +955,10 @@ index 53fc1012d46e20b623246cecae87b3feb1a0fda6..2dfcf0c9f8eb762d1683d2841a05219c this.homePos = pos; } diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index a9349f047e6253b609b59a7590c0082a257bb9a5..d457bd20c8d644d60795776b4c19a88a8b1ffd09 100644 +index 17c3d76f0d606722dbc657250a85de9306838356..ab9e4583dd29e692a3632d23c479539a3f19e042 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -205,6 +205,14 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -204,6 +204,14 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Ridables @@ -974,7 +974,7 @@ index a9349f047e6253b609b59a7590c0082a257bb9a5..d457bd20c8d644d60795776b4c19a88a 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 18b909626ca4b8cdad094671f7429acfa2c4888d..24e765b67ee7730b4e1f74a8f5de897eaf479f01 100644 +index bede0e9ce5b7c73d589511b71ad2a5f9e628eebc..6e2afa71d0d2da4cca868f617d29b3cc9071553d 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,7 +991,7 @@ index 18b909626ca4b8cdad094671f7429acfa2c4888d..24e765b67ee7730b4e1f74a8f5de897e public static AttributeSupplier.Builder createAttributes() { return Mob.createMobAttributes().add(Attributes.MAX_HEALTH, 200.0).add(Attributes.CAMERA_DISTANCE, 16.0); } -@@ -1060,7 +1067,7 @@ public class EnderDragon extends Mob implements Enemy { +@@ -1061,7 +1068,7 @@ public class EnderDragon extends Mob implements Enemy { @Override protected float sanitizeScale(final float scale) { @@ -1001,10 +1001,10 @@ index 18b909626ca4b8cdad094671f7429acfa2c4888d..24e765b67ee7730b4e1f74a8f5de897e // 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 1f85cad7ac4c7cd2133142e74d51c2ad84fd4427..fb04a6d53cc12038f4c55db84278632582c698fc 100644 +index 852a604d8c06e9871da4c28d60b44a5869258011..8b2716294b18da6fae981e088b8ddb1f2ffcfb2e 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -214,6 +214,14 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -213,6 +213,14 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Ridables @@ -1019,7 +1019,7 @@ index 1f85cad7ac4c7cd2133142e74d51c2ad84fd4427..fb04a6d53cc12038f4c55db842786325 @Override protected PathNavigation createNavigation(final Level level) { FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); -@@ -436,7 +444,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -435,7 +443,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { this.setInvulnerableTicks(newCount); if (this.tickCount % 10 == 0) { @@ -1048,7 +1048,7 @@ index c1acc0a648493ec33ef4fc4a48b52fe0b3dc04b2..b553c6dd60bd23fba7ee3df9886561fc 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 654e923ce9fb8a725077acc8e9c9b8c7658e23f9..73b0efd692205f56862c7287d7222efebe3faf73 100644 +index e5f7d276c083cdb78d2f420c03be1b08115d5597..01c722932aaed2221badaa6231d8a20d005b087b 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 { @@ -1086,7 +1086,7 @@ index b86f600b1101fe1fc9f7cac5cc47c3f048e0f885..ffcfe02c51f6df1bd238c821a8d6535f 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 36aa44008e98e3a717cbf93d29f3e8780219dc6e..30450300bdf9e4b5ef4293e9c371484ba6aabebc 100644 +index 8b958dbdec8e68690525d345bd2f1038b1466ef9..e9b28ab9af835e8394855f08edb3cc463022d6f9 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 36aa44008e98e3a717cbf93d29f3e8780219dc6e..30450300bdf9e4b5ef4293e9c371484b 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 c66b18f8f71ecf2c1d91b46eb8c9c0b5cb865c06..040f0b59d93b1b94495253f3286bdba123c22ef4 100644 +index 8405358d2221d76bc0949047fcc6f17fdfc99dfc..c10982945974171e478690d2db5080551cb29cdb 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 c66b18f8f71ecf2c1d91b46eb8c9c0b5cb865c06..040f0b59d93b1b94495253f3286bdba1 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 0e056fbb4580e562928150e5002a44df001767a0..4a786f17a7a8e6175775c4705445e9dff1b2aa7c 100644 +index 0d40b789dc426c42aca47c01b4db57fb2b282f0d..5ebb6dc59ee8a845a983de207e763e1df103a4f7 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 { @@ -1164,7 +1164,7 @@ index 1b7a75a2be45928093382fa2f2da079ffc5d190d..7b6952f13e18548d0e71035d6cd6cfb2 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 032b92678f2ac0d21df751d19009f11861c1efca..d5880eebf3c64dab03234ac55110645541413c4a 100644 +index 6ad546f033919c6f0ba1091222a7af0f365fabb0..2616aab01c6c43fcc259c42c9d5c43fc73794caf 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 { @@ -1216,10 +1216,10 @@ index 600da11f46673177a0ff1f56c93a60d94df40025..d40a4daeec1500f2d9865022ee6e3c38 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 582890eb5a5b4757ad67bc2426cf3db9a8a335af..a22f245acca8e5ea3334708a27ed5029e472c205 100644 +index 961a874d3eeee40d4c45ae511412ac0167ae54ac..194b398a85550edc752b54636079e16a4de27ba7 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -141,7 +141,10 @@ public class Phantom extends Mob implements Enemy { +@@ -140,7 +140,10 @@ public class Phantom extends Mob implements Enemy { private void updatePhantomSizeInfo() { this.refreshDimensions(); if (level().purpurConfig.phantomFlamesOnSwoop && attackPhase == AttackPhase.SWOOP) shoot(); // Purpur - Ridables - Phantom flames on swoop @@ -1231,7 +1231,7 @@ index 582890eb5a5b4757ad67bc2426cf3db9a8a335af..a22f245acca8e5ea3334708a27ed5029 } public int getPhantomSize() { -@@ -161,6 +164,23 @@ public class Phantom extends Mob implements Enemy { +@@ -160,6 +163,23 @@ public class Phantom extends Mob implements Enemy { return this.getId() * 3; } @@ -1275,10 +1275,10 @@ index 1d02a5a037cb50844419ef41227be2427cdff4ca..3e2fa1f4e9c820af76ef5f4354ca66fa protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index cdcc2e23259bc259ed2edc7e2eff8ddc4636a5bb..2ba213e85002f7c76e3dbd8b386ebbb0b11fa86b 100644 +index 746dfa496dc6cde62ab3c890aa6fbdbe68086ea9..b07dd45cf3ee07d8e51aa9473ee22fab577809c6 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -127,6 +127,14 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -126,6 +126,14 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Ridables @@ -1293,7 +1293,7 @@ index cdcc2e23259bc259ed2edc7e2eff8ddc4636a5bb..2ba213e85002f7c76e3dbd8b386ebbb0 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -603,7 +611,7 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -602,7 +610,7 @@ public class Shulker extends AbstractGolem implements Enemy { @Override protected float sanitizeScale(final float scale) { @@ -1303,7 +1303,7 @@ index cdcc2e23259bc259ed2edc7e2eff8ddc4636a5bb..2ba213e85002f7c76e3dbd8b386ebbb0 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 68080332052f1e18d7be7d5c4c27347f3d57ddcc..355475b12c6f3fcc9fe88ca63ab88cabac9d6fb1 100644 +index 4bda4d98e94f906cd86eafd412dd393b534ff8df..6037500c084e709110dfe512f110b505111b6d71 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 { @@ -1380,7 +1380,7 @@ index 47c6dfee0254c4ccd62ed4ff584a78234284a815..f541ccef625ab0d560f4781c28ad7ae3 this.setHealth(this.getMaxHealth()); } diff --git a/net/minecraft/world/entity/monster/Strider.java b/net/minecraft/world/entity/monster/Strider.java -index 76180ed355b0d3cb52bfebc7cbf32b91486d6f5b..f8134a362a2faa49beccb840ea8a899aa4681638 100644 +index f2ef42ce208c2bceb01f9a34bd3a58ac29beb6d9..47a5ce453ea7b291e5cca12c7cb86ccba9d55cc8 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -110,6 +110,14 @@ public class Strider extends Animal implements ItemSteerable { @@ -1399,10 +1399,10 @@ index 76180ed355b0d3cb52bfebc7cbf32b91486d6f5b..f8134a362a2faa49beccb840ea8a899a 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 884ac753ab4b496429c4cf808f173aa4bdbf0ea9..29e9a0deb5aa99800dc6554ad6bba36bbe6dd80e 100644 +index 0621c1a46c392b8fcf5235f7483d0d8a0ac598ed..4b5aade3de8ff29943b58741db5e310851a33561 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -103,6 +103,14 @@ public class Vex extends Monster implements TraceableEntity { +@@ -102,6 +102,14 @@ public class Vex extends Monster implements TraceableEntity { } // Purpur end - Ridables @@ -1456,10 +1456,10 @@ index 1a5e3a38671602e097e1e7f00d8f80e46b1596a0..4d4593f89e20e8e72a979cc2dee54566 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 d7a2e2a660d9844e159ca196d155ed76d277040d..c4f29fac9e5c636248e22345c61fb89b45b9eefd 100644 +index fdbf9b64871c5cdb7ed9fa56c669bd77d1a19ac2..ca64ff27b53ba5d3e9b06311757a0ff3baa8ca6b 100644 --- a/net/minecraft/world/entity/monster/creaking/Creaking.java +++ b/net/minecraft/world/entity/monster/creaking/Creaking.java -@@ -130,6 +130,14 @@ public class Creaking extends Monster { +@@ -129,6 +129,14 @@ public class Creaking extends Monster { } // Purpur end - Ridables @@ -1494,10 +1494,10 @@ index 7ba62badc9b832bdedbec5984421abfee242fa16..352139672f2cf1a7d624db4cc5bdef3a 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 f1ded053c1ff4cc45496b61cf9e010e3632674cd..212c74328b1f2c4bb8753787f70246249ab5fe75 100644 +index 2d8654f1b16ee3177466dc21aff7c2bdbce310a7..d41c3efa257f82981fbbabd527c4e748f448bfa9 100644 --- a/net/minecraft/world/entity/monster/illager/Evoker.java +++ b/net/minecraft/world/entity/monster/illager/Evoker.java -@@ -67,6 +67,14 @@ public class Evoker extends SpellcasterIllager { +@@ -66,6 +66,14 @@ public class Evoker extends SpellcasterIllager { } // Purpur end - Ridables @@ -1513,10 +1513,10 @@ index f1ded053c1ff4cc45496b61cf9e010e3632674cd..212c74328b1f2c4bb8753787f7024624 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 6a9f25c465a2b54969d7ec3b658355f485f36722..bc19b4c293a4101abd559c61c59021e076420b32 100644 +index 9ea4745eb0d72c25ac5b89a6bfa5ba2846740f07..0150ebdcbb681bcf8128eec34fd6e3fbfb85a79f 100644 --- a/net/minecraft/world/entity/monster/illager/Illusioner.java +++ b/net/minecraft/world/entity/monster/illager/Illusioner.java -@@ -77,6 +77,16 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -76,6 +76,16 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } // Purpur end - Ridables @@ -1572,7 +1572,7 @@ index c3164a33fd8010e1920eead11c482641f17b3a65..865395b9ceddfaac4fc88701878a1cf3 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 f53cf55c490585595381c184e6dced8d9dcc0439..0d0a86b5c485a60d0e85b3acc6f0cc01ce6c0bfe 100644 +index f617f3cbd41e9b60faf1489dd32972c6a2467fe1..17ce12d23ec9e1e03c02755711dfecb6d207af61 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -125,6 +125,14 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -1665,7 +1665,7 @@ index 1d706fe3bca726a4e606232039beeadedf75b499..ce9364040d6e856fd1fa42baa75b4030 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 fc4ed0855a00a90cb7232ac9e28510b09163a74d..024b6d01eaf36ec6c9a85da669cc6bd0a4a6fc90 100644 +index 3651c21dc87a76ad4aa268a2de6686016b589e6c..0d370f992e5ef601d8032230c927164d760a95e1 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 { @@ -1722,7 +1722,7 @@ index 546561f6b9960de22d84468a317c65f3cf406b29..8834ecb96e3a6ec28f8700b23971d001 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 4b033392e1ba25dbcfd7710d3a8bfbc040d42938..573abf9eae9f5492e4231d663814352f7e046fe2 100644 +index 643cf630000cd389ff7ae073a1850f2ae3f4a458..36184895787abaf54072fbae6ade286076b6f3c8 100644 --- a/net/minecraft/world/entity/monster/zombie/Drowned.java +++ b/net/minecraft/world/entity/monster/zombie/Drowned.java @@ -103,6 +103,19 @@ public class Drowned extends Zombie implements RangedAttackMob { @@ -1769,10 +1769,10 @@ index dfb43d27865674f4f13050682eda38afe2731f00..1c985585a2da43e59bb5b9ebd742e1e3 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 e76895db48b00150a749a6e3d1fb2807dc9852bd..1fbebd0cd04182679400ef3c33bf0730c01bc645 100644 +index 5d86cfd5c5d679368ddebf1afd7e32702b6e34a9..875993036ebd0f8a08d28f0e04f0c82b294e3ff5 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -130,6 +130,14 @@ public class Zombie extends Monster { +@@ -129,6 +129,14 @@ public class Zombie extends Monster { } // Purpur end - Ridables @@ -1787,7 +1787,7 @@ index e76895db48b00150a749a6e3d1fb2807dc9852bd..1fbebd0cd04182679400ef3c33bf0730 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -637,7 +645,7 @@ public class Zombie extends Monster { +@@ -634,7 +642,7 @@ public class Zombie extends Monster { } protected void randomizeReinforcementsChance() { @@ -1848,7 +1848,7 @@ index eb3ec4314603f61a041740d5b5e52165dac6ebc6..b6c14d7c5fbe7f37d4d5b865aae60d4a @Override diff --git a/net/minecraft/world/entity/npc/villager/Villager.java b/net/minecraft/world/entity/npc/villager/Villager.java -index af194ac19c110b9a69967631ca189494a166b55b..80f5197c4b33d75ee4d3791db22ed5e43f5c2a65 100644 +index 627461178e2ab4f59699e04b16d8d0f337a0daba..33b219e4422d22bb88aa17841c0380398e9c149b 100644 --- a/net/minecraft/world/entity/npc/villager/Villager.java +++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -274,6 +274,14 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re @@ -1867,10 +1867,10 @@ index af194ac19c110b9a69967631ca189494a166b55b..80f5197c4b33d75ee4d3791db22ed5e4 public Brain 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 2d0203b256080c3779331ff686714ae491d7b3ec..848aeba87bd220d7241c5adeba26fbd6591dbbae 100644 +index 4c35ca3877b88b13a1919d0625e5055b4554057f..f93fc5710e6c95b1c7782ff1024e52bee9fb6102 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 +@@ -84,6 +84,13 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over } // Purpur end - Ridables diff --git a/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch b/purpur-server/minecraft-patches/features/0003-Barrels-and-enderchests-6-rows.patch index b1cdbe6c5..8572658a8 100644 --- a/purpur-server/minecraft-patches/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 7c0382f7cb42f448e947001542b7f40f11b018e9..341021c3952b89b6e234ce777aa37856eea58ff8 100644 +index 5da9ae5617568aaadfe2bf90e3a358d271e0c2c2..e33f57caf9640e891b87a0e9bdcd5a44911bec73 100644 --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -888,6 +888,27 @@ public abstract class PlayerList { +@@ -885,6 +885,27 @@ public abstract class PlayerList { player.getBukkitEntity().recalculatePermissions(); // CraftBukkit this.server.getCommands().sendCommands(player); } // Paper - Add sendOpLevel API @@ -37,10 +37,10 @@ index 7c0382f7cb42f448e947001542b7f40f11b018e9..341021c3952b89b6e234ce777aa37856 // 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 68688267947f19154a220fc4bea828232d08c313..fbf8d50b0e757b329818d868d86d4e8c4088ec07 100644 +index 3b0a0525cdca3ea5b91834e04b42696a7cedde10..4d80fd91a1f610e5af0ad258f94dc16f2f77ef0d 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -176,6 +176,7 @@ public abstract class Player extends Avatar implements ContainerUser { +@@ -175,6 +175,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 @@ -137,18 +137,18 @@ index 4df3a32faf85595372f4b250482d852c985ea3ab..33c4c2cc8b488df5276d21e0f4e29cc0 if (!itemStack.isEmpty()) { output.add(new ItemStackWithSlot(i, itemStack)); diff --git a/net/minecraft/world/level/block/EnderChestBlock.java b/net/minecraft/world/level/block/EnderChestBlock.java -index 24a2c411da0ebbb7f97d621bb76ff686621f9aae..7ba9e8f6414246b589ff423fac63f80505326505 100644 +index f70a729ab3678fd22d0229bc15d289ddc49b9d01..6a1ea62c737eba6ea30605be89255fb6c221c204 100644 --- a/net/minecraft/world/level/block/EnderChestBlock.java +++ b/net/minecraft/world/level/block/EnderChestBlock.java -@@ -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, 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); +@@ -89,7 +89,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, 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); @@ -102,6 +102,35 @@ public class EnderChestBlock extends AbstractChestBlock i } } @@ -186,10 +186,10 @@ index 24a2c411da0ebbb7f97d621bb76ff686621f9aae..7ba9e8f6414246b589ff423fac63f805 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 da5fdf77dd26d97c8b92bac9a6af8d922c31eb9c..c788746268d7317d8d4a7220fa9c71f5d04eedd6 100644 +index 5ba46020b47edfc886ecd5c33483ebb0fa57e5dc..b62a024d2ba1d5d09c81c5060e4eb1a04095681f 100644 --- a/net/minecraft/world/level/block/entity/BarrelBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BarrelBlockEntity.java -@@ -60,7 +60,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { +@@ -59,7 +59,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { } // CraftBukkit end private static final Component DEFAULT_NAME = Component.translatable("container.barrel"); @@ -205,9 +205,9 @@ index da5fdf77dd26d97c8b92bac9a6af8d922c31eb9c..c788746268d7317d8d4a7220fa9c71f5 + }, ItemStack.EMPTY); + // Purpur end - Barrels and enderchests 6 rows public final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() { - { - Objects.requireNonNull(BarrelBlockEntity.this); -@@ -123,7 +132,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { + // Paper start - delay open/close callbacks + @Override +@@ -118,7 +127,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { @Override public int getContainerSize() { @@ -225,7 +225,7 @@ index da5fdf77dd26d97c8b92bac9a6af8d922c31eb9c..c788746268d7317d8d4a7220fa9c71f5 } @Override -@@ -143,7 +161,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { +@@ -138,7 +156,16 @@ public class BarrelBlockEntity extends RandomizableContainerBlockEntity { @Override protected AbstractContainerMenu createMenu(final int containerId, final Inventory inventory) { diff --git a/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch b/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch index 50dacaa8b..248961840 100644 --- a/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch +++ b/purpur-server/minecraft-patches/features/0006-Minecart-settings-and-WASD-controls.patch @@ -5,23 +5,23 @@ Subject: [PATCH] Minecart settings and WASD controls diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java -index 1bd1bb805060604fbe4dca6d71a863bb96d12da9..a41e8e61df1f3d7a861cd1b4060bc3ec424d45bd 100644 +index 228c81791dcc1ea0971e70bcb0cb289106466c67..88aad415396d1e74da8b7544b566844e30761219 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -1332,6 +1332,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc - } else { - // Purpur start - Add boat fall damage config - 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; -+ } -+ // Purpur end - Minecart settings and WASD controls - if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.boat.Boat && !level().purpurConfig.boatsDoFallDamage) { - return false; - } +@@ -1309,6 +1309,11 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc + + // Purpur start - Add boat fall damage config + 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; ++ } ++ // Purpur end - Minecart settings and WASD controls + if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.boat.Boat && !level().purpurConfig.boatsDoFallDamage) { + return false; + } diff --git a/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java b/net/minecraft/world/entity/vehicle/minecart/AbstractMinecart.java -index 7ba197b9bda1f98e24882be40d78fabb0db9d36b..f807e424850bcd22ca35860b37fde45c37187b1e 100644 +index 1c043c1136fc42e888125047ed73b1dc32276183..41d82befd5d30a0bc1db083df9012e0b477239b4 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 { @@ -127,26 +127,16 @@ index 7ba197b9bda1f98e24882be40d78fabb0db9d36b..f807e424850bcd22ca35860b37fde45c 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 7464dbde8cc3348748d2a3733624bd2274f9c735..91df0baebab1da9cd060cb93698c7f154c719669 100644 +index 2ce6aecf5e34528c9601ce2f071bebd6c2f47243..a817247544186e51d3748af0ecfd78164e37e012 100644 --- a/net/minecraft/world/item/MinecartItem.java +++ b/net/minecraft/world/item/MinecartItem.java -@@ -30,8 +30,9 @@ public class MinecartItem extends Item { +@@ -30,7 +30,8 @@ public class MinecartItem extends Item { 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()) pos = pos.relative(context.getClickedFace()); -+ } // else { // Purpur - Minecart settings and WASD controls - ItemStack itemStack = context.getItemInHand(); - RailShape shape = blockState.getBlock() instanceof BaseRailBlock - ? blockState.getValue(((BaseRailBlock)blockState.getBlock()).getShapeProperty()) -@@ -70,6 +71,6 @@ public class MinecartItem extends Item { - itemStack.shrink(1); - return InteractionResult.SUCCESS; - } -- } -+ // } // Purpur - Minecart settings and WASD controls - } - } + } + + ItemStack itemStack = context.getItemInHand(); diff --git a/purpur-server/minecraft-patches/features/0007-Villagers-follow-emerald-blocks.patch b/purpur-server/minecraft-patches/features/0007-Villagers-follow-emerald-blocks.patch index 65c8be431..2aa4da127 100644 --- a/purpur-server/minecraft-patches/features/0007-Villagers-follow-emerald-blocks.patch +++ b/purpur-server/minecraft-patches/features/0007-Villagers-follow-emerald-blocks.patch @@ -31,7 +31,7 @@ index af2bd8a5cf760792a63dfb9c2370360f288beab6..016167a6ff90dfe5a2e66596eaab2c8f @Override diff --git a/net/minecraft/world/entity/npc/villager/AbstractVillager.java b/net/minecraft/world/entity/npc/villager/AbstractVillager.java -index b5247d45159898cd6ede425a4a99db8439a105b6..0c9fba0e41126a585c2471abc2f18ff50a691805 100644 +index 9582f694ddbb47be7d820c5fe8791d5ba112ec6b..ac7d5c63d4140b08e4bc63fc42b43036736101aa 100644 --- a/net/minecraft/world/entity/npc/villager/AbstractVillager.java +++ b/net/minecraft/world/entity/npc/villager/AbstractVillager.java @@ -52,6 +52,7 @@ import org.jspecify.annotations.Nullable; @@ -43,7 +43,7 @@ index b5247d45159898cd6ede425a4a99db8439a105b6..0c9fba0e41126a585c2471abc2f18ff5 private static final EntityDataAccessor DATA_UNHAPPY_COUNTER = SynchedEntityData.defineId(AbstractVillager.class, EntityDataSerializers.INT); 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 80f5197c4b33d75ee4d3791db22ed5e43f5c2a65..19bba23d87543574d5d8a4139ac93e751fe690d9 100644 +index 33b219e4422d22bb88aa17841c0380398e9c149b..e06be61042e8cb873aed23ebcb94cc688a2668cc 100644 --- a/net/minecraft/world/entity/npc/villager/Villager.java +++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -271,6 +271,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re @@ -72,10 +72,10 @@ index 80f5197c4b33d75ee4d3791db22ed5e43f5c2a65..19bba23d87543574d5d8a4139ac93e75 public boolean assignProfessionWhenSpawned() { diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java -index 848aeba87bd220d7241c5adeba26fbd6591dbbae..ea74d8ac0b5de890124361e65aeb9a08ad09fa1b 100644 +index f93fc5710e6c95b1c7782ff1024e52bee9fb6102..292980e7445d969475332d18b158a0092ad847fe 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 +@@ -88,9 +88,16 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over @Override public void initAttributes() { this.getAttribute(net.minecraft.world.entity.ai.attributes.Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.wanderingTraderMaxHealth); @@ -92,7 +92,7 @@ index 848aeba87bd220d7241c5adeba26fbd6591dbbae..ea74d8ac0b5de890124361e65aeb9a08 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); -@@ -123,6 +130,7 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over +@@ -122,6 +129,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/features/0008-Implement-elytra-settings.patch b/purpur-server/minecraft-patches/features/0008-Implement-elytra-settings.patch index 03e21e22b..e76f7dcf0 100644 --- a/purpur-server/minecraft-patches/features/0008-Implement-elytra-settings.patch +++ b/purpur-server/minecraft-patches/features/0008-Implement-elytra-settings.patch @@ -5,10 +5,10 @@ Subject: [PATCH] Implement elytra settings diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 8f536177aabda1387d3562912b48ae8fce1dd278..fbb288020b0526d44312610782f41ab443a42ad9 100644 +index 3bc8a8d26569a3c26e518cd48c52b9b6c9e38294..34d122f58ff32cb47b79ab1348fee3224315d2dd 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -3937,7 +3937,16 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3943,7 +3943,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); @@ -27,7 +27,7 @@ index 8f536177aabda1387d3562912b48ae8fce1dd278..fbb288020b0526d44312610782f41ab4 this.gameEvent(GameEvent.ELYTRA_GLIDE); diff --git a/net/minecraft/world/item/FireworkRocketItem.java b/net/minecraft/world/item/FireworkRocketItem.java -index 0afc0916e358d4b9c9c360358a6c1aebe1ac723b..ce4380f76c89008b5fa8cd5fd666a0c22e93b26b 100644 +index b3443ff2d06af328493046e723efc11d299a2824..3c001b3810097d5cb60ad64e0727d8d9907f6a38 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 { @@ -49,7 +49,7 @@ index 0afc0916e358d4b9c9c360358a6c1aebe1ac723b..ce4380f76c89008b5fa8cd5fd666a0c2 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 aa62f69da48884f1d4e8834fe4cb9c02ce1d472e..2e511d2adaedef5e954532783beb8a77b3e000d4 100644 +index d71fe8e6699e2e3298240e091832d33215837a4a..f9d2aa76bd273c40d39c30e1c9fddb2749b18865 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java @@ -694,6 +694,14 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { @@ -68,13 +68,13 @@ index aa62f69da48884f1d4e8834fe4cb9c02ce1d472e..2e511d2adaedef5e954532783beb8a77 onBreak.accept(item); } diff --git a/net/minecraft/world/item/TridentItem.java b/net/minecraft/world/item/TridentItem.java -index 4352c807848acbac4e58cd84f376425c3ae6f2f7..50e38d147934d060a0cf342cec609d7d10476298 100644 +index 0321dffbbea8bf35640680eedd21cd9f9daa6c04..91f81dbf4e1fbf029c8f70ad3a80a489e1188a54 100644 --- a/net/minecraft/world/item/TridentItem.java +++ b/net/minecraft/world/item/TridentItem.java -@@ -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 +@@ -127,6 +127,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()) { @@ -85,6 +85,6 @@ index 4352c807848acbac4e58cd84f376425c3ae6f2f7..50e38d147934d060a0cf342cec609d7d + } + } + // Purpur end - Implement elytra settings - player.push(xd, yd, zd); - player.startAutoSpinAttack(20, 8.0F, itemStack); - if (player.onGround()) { + player.push(xd, yd, zd); + player.startAutoSpinAttack(20, 8.0F, itemStack); + if (player.onGround()) { diff --git a/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch b/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch index 0b16da0bb..32e940021 100644 --- a/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch +++ b/purpur-server/minecraft-patches/features/0009-Configurable-jockey-options.patch @@ -5,7 +5,7 @@ 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 573abf9eae9f5492e4231d663814352f7e046fe2..0f64fe7e15655c63f996106d504ab4d18dac4a1c 100644 +index 36184895787abaf54072fbae6ade286076b6f3c8..8102352e1b59608b19a68f4e5080180c9a3999b5 100644 --- a/net/minecraft/world/entity/monster/zombie/Drowned.java +++ b/net/minecraft/world/entity/monster/zombie/Drowned.java @@ -116,6 +116,23 @@ public class Drowned extends Zombie implements RangedAttackMob { @@ -61,10 +61,10 @@ index 1c985585a2da43e59bb5b9ebd742e1e31b2cda29..c3f2d9ab49eb501f26939387624f3262 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 1fbebd0cd04182679400ef3c33bf0730c01bc645..bf94d8e9512eeb294914c748be091f6565cca676 100644 +index 875993036ebd0f8a08d28f0e04f0c82b294e3ff5..4b7a00ae57526db73dda9f92a31a95c97b0bc41c 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -138,6 +138,20 @@ public class Zombie extends Monster { +@@ -137,6 +137,20 @@ public class Zombie extends Monster { } // Purpur end - Configurable entity base attributes @@ -85,7 +85,7 @@ index 1fbebd0cd04182679400ef3c33bf0730c01bc645..bf94d8e9512eeb294914c748be091f65 @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables -@@ -550,19 +564,18 @@ public class Zombie extends Monster { +@@ -547,19 +561,18 @@ public class Zombie extends Monster { } if (groupData instanceof Zombie.ZombieGroupData zombieData) { @@ -111,7 +111,7 @@ index 1fbebd0cd04182679400ef3c33bf0730c01bc645..bf94d8e9512eeb294914c748be091f65 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 { +@@ -568,6 +581,7 @@ public class Zombie extends Monster { this.startRiding(chicken, false, false); level.addFreshEntity(chicken, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.MOUNT); // CraftBukkit } diff --git a/purpur-server/minecraft-patches/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 index 355d42c8f..c6a4e29b0 100644 --- a/purpur-server/minecraft-patches/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 0bfb8cd53e87d986679d4e26ebf77c52e58c1c10..fd901b84bc105a2ccf59eef687a20d53b84e1906 100644 +index aa5426c1c407a3534c587d558d56364ebd99dca3..7a85db931978b39f82947ed619edd3c83ae04dce 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java +++ b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java @@ -27,6 +27,12 @@ public class EndCrystal extends Entity { @@ -72,10 +72,10 @@ index 0bfb8cd53e87d986679d4e26ebf77c52e58c1c10..fd901b84bc105a2ccf59eef687a20d53 @Override diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index a22f245acca8e5ea3334708a27ed5029e472c205..962539961aeb73914f5d250afa7a4109765bf438 100644 +index 194b398a85550edc752b54636079e16a4de27ba7..1474d005d8333f592856ba4cdfc396cb4b93159a 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -50,6 +50,7 @@ public class Phantom extends Mob implements Enemy { +@@ -49,6 +49,7 @@ public class Phantom extends Mob implements Enemy { private Vec3 moveTargetPoint = Vec3.ZERO; public @Nullable BlockPos anchorPoint; private Phantom.AttackPhase attackPhase = Phantom.AttackPhase.CIRCLE; @@ -83,7 +83,7 @@ index a22f245acca8e5ea3334708a27ed5029e472c205..962539961aeb73914f5d250afa7a4109 // Paper start public java.util.@Nullable UUID spawningEntity; public boolean shouldBurnInDay = true; -@@ -108,6 +109,25 @@ public class Phantom extends Mob implements Enemy { +@@ -107,6 +108,25 @@ public class Phantom extends Mob implements Enemy { } // Purpur end - Ridables @@ -109,7 +109,7 @@ index a22f245acca8e5ea3334708a27ed5029e472c205..962539961aeb73914f5d250afa7a4109 @Override public boolean isFlapping() { return (this.getUniqueFlapTickOffset() + this.tickCount) % TICKS_PER_FLAP == 0; -@@ -121,9 +141,15 @@ public class Phantom extends Mob implements Enemy { +@@ -120,9 +140,15 @@ public class Phantom extends Mob implements Enemy { @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables @@ -128,7 +128,7 @@ index a22f245acca8e5ea3334708a27ed5029e472c205..962539961aeb73914f5d250afa7a4109 this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -513,6 +539,124 @@ public class Phantom extends Mob implements Enemy { +@@ -494,6 +520,124 @@ public class Phantom extends Mob implements Enemy { } } @@ -251,5 +251,5 @@ index a22f245acca8e5ea3334708a27ed5029e472c205..962539961aeb73914f5d250afa7a4109 + // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms + private class PhantomMoveControl extends org.purpurmc.purpur.controller.FlyingMoveControllerWASD { // Purpur - Ridables - private float speed; + private float speed = 0.1F; diff --git a/purpur-server/minecraft-patches/features/0011-Phantoms-burn-in-light.patch b/purpur-server/minecraft-patches/features/0011-Phantoms-burn-in-light.patch index 58e06d950..79dc7725a 100644 --- a/purpur-server/minecraft-patches/features/0011-Phantoms-burn-in-light.patch +++ b/purpur-server/minecraft-patches/features/0011-Phantoms-burn-in-light.patch @@ -5,10 +5,10 @@ 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 962539961aeb73914f5d250afa7a4109765bf438..b3a79a6387fbf00c97da4452cb48e4808e5391be 100644 +index 1474d005d8333f592856ba4cdfc396cb4b93159a..03db90080675c879688c37e568dc25603b4972b1 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -55,6 +55,7 @@ public class Phantom extends Mob implements Enemy { +@@ -54,6 +54,7 @@ public class Phantom extends Mob implements Enemy { public java.util.@Nullable UUID spawningEntity; public boolean shouldBurnInDay = true; // Paper end @@ -16,7 +16,7 @@ index 962539961aeb73914f5d250afa7a4109765bf438..b3a79a6387fbf00c97da4452cb48e480 public Phantom(final EntityType type, final Level level) { super(type, level); -@@ -239,7 +240,11 @@ public class Phantom extends Mob implements Enemy { +@@ -238,7 +239,11 @@ public class Phantom extends Mob implements Enemy { // Paper start @Override public boolean isSunBurnTick() { @@ -29,15 +29,17 @@ index 962539961aeb73914f5d250afa7a4109765bf438..b3a79a6387fbf00c97da4452cb48e480 } // Paper end -@@ -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()); +@@ -355,7 +360,8 @@ 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 (!players.isEmpty()) { ++ 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()); -@@ -752,6 +758,12 @@ public class Phantom extends Mob implements Enemy { + for (Player player : players) { +@@ -724,6 +730,12 @@ public class Phantom extends Mob implements Enemy { return false; } else if (!target.isAlive()) { return false; @@ -49,4 +51,4 @@ index 962539961aeb73914f5d250afa7a4109765bf438..b3a79a6387fbf00c97da4452cb48e480 + // Purpur end - Phantoms burn in light } else if (target instanceof Player player && (target.isSpectator() || player.isCreative())) { return false; - } else if (!this.canUse()) { + } else { diff --git a/purpur-server/minecraft-patches/features/0012-Make-entity-breeding-times-configurable.patch b/purpur-server/minecraft-patches/features/0012-Make-entity-breeding-times-configurable.patch index 1fecf31b5..deba4b950 100644 --- a/purpur-server/minecraft-patches/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 37cf6c4cef5a8885fddd9f637cac024892b498a3..859842ba642f4307e5a1f834007afe505ce58a8c 100644 +index 2f89f27a7a5935c08ab45c09e281801fe885cc3a..74ff05c1ec402c4fdf2dee6173f7ae90ec9af9b6 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(child, source, target, null, null, 0).isCancelled()) { - return Optional.empty(); - } -- source.setAge(6000); -- target.setAge(6000); +@@ -119,8 +119,10 @@ public class VillagerMakeLove extends Behavior { + if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreedEvent(child, source, target, null, null, 0).isCancelled()) { + return Optional.empty(); + } +- source.setAge(6000); +- target.setAge(6000); + // Purpur start - Make entity breeding times configurable + source.setAge(level.purpurConfig.villagerBreedingTicks); + target.setAge(level.purpurConfig.villagerBreedingTicks); + // Purpur end - Make entity breeding times configurable - level.addFreshEntityWithPassengers(child, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); - // CraftBukkit end - call EntityBreedEvent - level.broadcastEntityEvent(child, EntityEvent.LOVE_HEARTS); + level.addFreshEntityWithPassengers(child, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); + // CraftBukkit end - call EntityBreedEvent + 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 774210ebe09af15f85a919512dfd2f98e7bdee6e..407ffe0e6b5893c3abf0b1ff60fd0a27ec965e0c 100644 +index 0742f39f6b56a0c16878bdc23874bd71d247b8b1..cd1d0b07dcb89b977cd4c00130c57269e25760bc 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 { @@ -47,10 +47,10 @@ index 774210ebe09af15f85a919512dfd2f98e7bdee6e..407ffe0e6b5893c3abf0b1ff60fd0a27 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 7c2c71a57b9278aea428e314462cebc08e168b50..83688ac732758ee0613fc2e187838b4607b8edc9 100644 +index b55d1d5abe06d753063ea7939bd975c055a1cc95..eecedf1067f7ff1236a3c48cf22db30c623bf490 100644 --- a/net/minecraft/world/entity/animal/armadillo/Armadillo.java +++ b/net/minecraft/world/entity/animal/armadillo/Armadillo.java -@@ -115,6 +115,13 @@ public class Armadillo extends Animal { +@@ -114,6 +114,13 @@ public class Armadillo extends Animal { } // Purpur end - Configurable entity base attributes @@ -65,10 +65,10 @@ index 7c2c71a57b9278aea428e314462cebc08e168b50..83688ac732758ee0613fc2e187838b46 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 c10b06f8adcd59869d043e48cfe3fdb60051c3db..d4178d85b74a41a0d2808681008f1686578db98d 100644 +index e0b9b15b2727953deb7850ed57edd7248f88c184..3f1c56981c5da00bf7d07c9faf80d3386442723c 100644 --- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -143,6 +143,13 @@ public class Axolotl extends Animal implements Bucketable { +@@ -142,6 +142,13 @@ public class Axolotl extends Animal implements Bucketable { } // Purpur end - Configurable entity base attributes @@ -83,10 +83,10 @@ index c10b06f8adcd59869d043e48cfe3fdb60051c3db..d4178d85b74a41a0d2808681008f1686 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 b22f49887219bcffe8e30fd22e9f9dd67fc371bc..44f11b07a2b8a37db399976c4c79b44c4416f2e9 100644 +index 24dfd3846abcb0f4f00d9c0e58f1e5389e7db658..0a06e8df6e111ba65269365f3d021b57d7f87e60 100644 --- a/net/minecraft/world/entity/animal/bee/Bee.java +++ b/net/minecraft/world/entity/animal/bee/Bee.java -@@ -488,6 +488,13 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -487,6 +487,13 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { } // Purpur end - Configurable entity base attributes @@ -101,10 +101,10 @@ index b22f49887219bcffe8e30fd22e9f9dd67fc371bc..44f11b07a2b8a37db399976c4c79b44c 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 0b3cf5ad57350c5c7a453dc7a96891238491a41a..5a66cdb4a75651a9dc017d80f2c2f56e878d83ad 100644 +index aee34b1ac868f0f0fc24e3ffe022d51141143c9b..92fc921c4024b59dc2c30c5adf35e06a7978abd2 100644 --- a/net/minecraft/world/entity/animal/camel/Camel.java +++ b/net/minecraft/world/entity/animal/camel/Camel.java -@@ -103,6 +103,13 @@ public class Camel extends AbstractHorse { +@@ -102,6 +102,13 @@ public class Camel extends AbstractHorse { } // Purpur end - Ridables @@ -155,7 +155,7 @@ index 33c0b8f2c43065ea89b3f9c6a519dde27620ed07..7981f60f10c44ab2459933cb15ee9611 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 d6ec397a14753526dd34ab3a7e69ae4be36c04a6..68a4edef68c9db6b2b0716fc6283e2c7345d4cda 100644 +index 58d37bd62fec5071fb4a0c297f6c2ef89a3d79e4..88ac1974f09b9213f124550b1873d28d8c926083 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 { @@ -209,7 +209,7 @@ index 8ba8430f41ce74736f405bfac2ef5de6fffe7d49..dbb586058f38b6c4f81e2f6567b7ae8e 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 5a62d6fcc6420878a5d612e556503f01f5084d44..138e10184c2b115e04a8a4c73ccc9a87a90e7409 100644 +index 942f55f750b7ba0cf25429ca888a46bc4c172eb3..08dcee8ef18818ad6963762198b9e60e9c7d4d04 100644 --- a/net/minecraft/world/entity/animal/equine/Llama.java +++ b/net/minecraft/world/entity/animal/equine/Llama.java @@ -151,6 +151,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { @@ -245,7 +245,7 @@ index a866b93312391142b030605e2108fe522d3d8ddd..cf0f3c9d5f8ff348e6fb76db823da4ca 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 fcc9b9f884aed489ab6016d1de3dfd861781d8e5..a4a878791be034140a50b901d5daf2533d299756 100644 +index 6b12c3a1a99ce66751f8e7d65ee1f6c21ffb0833..cfce6db53e670b39a0db7f6a17857dda0ad160f6 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 { @@ -299,7 +299,7 @@ index ae429aec9be39d9af7da4671db15a4506da135d9..4be11663154a870a21832ddba05764a8 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 e31cf2f1c4a0a419ba378424ea0a059a0117e0a4..334879e3f1a28825749e7e4a3863454ee0a5ac9a 100644 +index 74c271dd9d55c846ed5440ff0d9c378a06da059d..51a587af3507415dad42f764d8fe72c5856cb6a7 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 { @@ -335,10 +335,10 @@ index 4bf42db19d0f58338f32af1ab7c802c274a8581c..2accf49e8dd907c8a482e5317d07b28f 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 ec4137a994005c4e7845d63d9347c0586c6f77ee..579718387c43ef36eacfe3abfb789b64e17fa55f 100644 +index d218a71c2475240438029ca44e86d7584ff36f73..bd4c29146ec791a7939fdea6c3f22badaa7b393a 100644 --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java -@@ -201,6 +201,13 @@ public class Fox extends Animal { +@@ -200,6 +200,13 @@ public class Fox extends Animal { } // Purpur end - Configurable entity base attributes @@ -352,7 +352,7 @@ index ec4137a994005c4e7845d63d9347c0586c6f77ee..579718387c43ef36eacfe3abfb789b64 @Override protected void defineSynchedData(final SynchedEntityData.Builder entityData) { super.defineSynchedData(entityData); -@@ -1016,8 +1023,10 @@ public class Fox extends Animal { +@@ -1003,8 +1010,10 @@ public class Fox extends Animal { CriteriaTriggers.BRED_ANIMALS.trigger(loveCause, this.animal, this.partner, offspring); } @@ -366,7 +366,7 @@ index ec4137a994005c4e7845d63d9347c0586c6f77ee..579718387c43ef36eacfe3abfb789b64 this.partner.resetLove(); 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 977ee6a71e0c52f115a221b09248596db2534739..3d2f06b4e686345632a2493366177e9002cae554 100644 +index bedbe9adede69efa4c4f2e6def9aeb3e8429fc2e..94cd1064b8544060f2838fb776d95c19bcaf629b 100644 --- a/net/minecraft/world/entity/animal/frog/Frog.java +++ b/net/minecraft/world/entity/animal/frog/Frog.java @@ -141,6 +141,13 @@ public class Frog extends Animal { @@ -384,7 +384,7 @@ index 977ee6a71e0c52f115a221b09248596db2534739..3d2f06b4e686345632a2493366177e90 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 d4353bb9ba2168b81726bfaa406175e7f2af601a..c8b2ef70ca3f730d87c30af9f29adb2ad083d26f 100644 +index cd0f514fa6deef90efc697d30af9a88797b456f8..8651caf56331d78f80982b9be1fa24cb963a78a4 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java @@ -117,6 +117,13 @@ public class Goat extends Animal { @@ -402,10 +402,10 @@ index d4353bb9ba2168b81726bfaa406175e7f2af601a..c8b2ef70ca3f730d87c30af9f29adb2a 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 f7f65e0935404a2eb404e5053acb9f6acd353272..b049adf5604555041102497d7fe0c865c56d751f 100644 +index 7991ef3a11c7901d361fef6349aef37737a69b76..cc3ecc13bfcd367f8c6aeb55380bf509e525d85b 100644 --- a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +++ b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java -@@ -154,6 +154,13 @@ public class HappyGhast extends Animal { +@@ -153,6 +153,13 @@ public class HappyGhast extends Animal { } // Purpur end - Configurable entity base attributes @@ -456,10 +456,10 @@ index 087e768c35c2c2af191c75648b278154ce5e593c..18bfb321e3728d3fa0596da0b86e4b76 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 838bc9b3f5bc3df3db16ba564222eed65215461a..f413e018856d485f706d2b8742b92b3253fe6532 100644 +index 83ec6995b5fc47872efb5039c3e24cd62da22d10..25232dc02916a0d7189d925c858d88ab71ea5677 100644 --- a/net/minecraft/world/entity/animal/panda/Panda.java +++ b/net/minecraft/world/entity/animal/panda/Panda.java -@@ -146,6 +146,13 @@ public class Panda extends Animal { +@@ -145,6 +145,13 @@ public class Panda extends Animal { } // Purpur end - Configurable entity base attributes @@ -474,7 +474,7 @@ index 838bc9b3f5bc3df3db16ba564222eed65215461a..f413e018856d485f706d2b8742b92b32 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 d3b9a3ac77f03e3b6b580a678283f85a19cb660e..af3d3b90f2e4d433b3b842dbc37d8c507a73dc1f 100644 +index c11c6fdc96d696a2f8c4aee96f4ddf6c4f9b9676..346cc1fa117229b95eef86b1bf2e9fe3a84970cf 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 { @@ -492,7 +492,7 @@ index d3b9a3ac77f03e3b6b580a678283f85a19cb660e..af3d3b90f2e4d433b3b842dbc37d8c50 public @Nullable SpawnGroupData finalizeSpawn( 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 02ed5052bd06844ec6811c4249398ba8ba8c4ea6..514f13a6965b5f53890ddd2e47ea89e0c1a515c1 100644 +index 7246b53d2fba7e547d41fd5db1eb487738e5b51e..14696e16da919a78d0098ad07a911b82ed6b60da 100644 --- a/net/minecraft/world/entity/animal/pig/Pig.java +++ b/net/minecraft/world/entity/animal/pig/Pig.java @@ -93,6 +93,13 @@ public class Pig extends Animal implements ItemSteerable { @@ -510,10 +510,10 @@ index 02ed5052bd06844ec6811c4249398ba8ba8c4ea6..514f13a6965b5f53890ddd2e47ea89e0 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 e50c934e2c9959f843aae2b2dd05a682ca5f59fc..6d4713663c94e91da7d809e65fa205aff2782f38 100644 +index ddfc7cab1b3864fc523e0837ff4acb8454e83ac9..38d4e31ddd9bd169dd30b6dee456f0d3f10f106d 100644 --- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java +++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java -@@ -127,6 +127,13 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -126,6 +126,13 @@ public class PolarBear extends Animal implements NeutralMob { } // Purpur end - Configurable entity base attributes @@ -528,7 +528,7 @@ index e50c934e2c9959f843aae2b2dd05a682ca5f59fc..6d4713663c94e91da7d809e65fa205af 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 bf643b9e6929890f061ac2c44b196460234095c4..3aefbdc3e537bc53bba296c7876dee93c95a77ca 100644 +index 4aa18f0ce6f07f479f1d856c9cef9fa5d6329138..f0a0c698c612de039a24b51f6afa87df8008d5b7 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 { @@ -564,7 +564,7 @@ index eb919dc63d950af08448b75559467ec88623d6b8..e83fe71b4f63f8f7fa1976f7d2165c36 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 7335e46f249b9a88ca0401493636f6e06c0e196d..f169d075cdaa1426c152a8f2682dbaba23de4ccc 100644 +index 73a1ba04a6a3ef0d0aba3301b6c1dfefeacb4df6..3a0d1901dcc42aa61ccaba8db5caef671f994bf5 100644 --- a/net/minecraft/world/entity/animal/sniffer/Sniffer.java +++ b/net/minecraft/world/entity/animal/sniffer/Sniffer.java @@ -119,6 +119,13 @@ public class Sniffer extends Animal { @@ -613,10 +613,10 @@ index 2dfcf0c9f8eb762d1683d2841a05219c497fddfc..62d9fce83cc44165c5356049a12bf608 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 d457bd20c8d644d60795776b4c19a88a8b1ffd09..0ac4e30fd4f3158b5f53e9ba8bc70964907c63a2 100644 +index ab9e4583dd29e692a3632d23c479539a3f19e042..f84b35919e49c1a86cbc4bdec1f9f81f2dac633d 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -213,6 +213,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -212,6 +212,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Configurable entity base attributes @@ -631,7 +631,7 @@ index d457bd20c8d644d60795776b4c19a88a8b1ffd09..0ac4e30fd4f3158b5f53e9ba8bc70964 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 f8134a362a2faa49beccb840ea8a899aa4681638..38a17c219bce1a8a8a67b136e0eaf5cf15ec94fd 100644 +index 47a5ce453ea7b291e5cca12c7cb86ccba9d55cc8..b6c20ce23cc1c97c337c5df6e03ad79a51c08702 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -118,6 +118,13 @@ public class Strider extends Animal implements ItemSteerable { diff --git a/purpur-server/minecraft-patches/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 index bcb9077ab..d4852e889 100644 --- a/purpur-server/minecraft-patches/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,10 +6,10 @@ 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 3f4986d6a755088a2014a373767e51efa976e997..8cb13a742a1cc03d60c78d0bf5be8c6a8cd1a6ae 100644 +index 0f48cba7d4a5246baa58aaf7e42deff93a0307de..8ed90c7e793c12a130a3214f54aab5482e8e1a8a 100644 --- a/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/net/minecraft/world/entity/decoration/ArmorStand.java -@@ -452,6 +452,7 @@ public class ArmorStand extends LivingEntity { +@@ -475,6 +475,7 @@ public class ArmorStand extends LivingEntity { private org.bukkit.event.entity.EntityDeathEvent brokenByPlayer(final ServerLevel level, final DamageSource source) { // Paper ItemStack result = new ItemStack(Items.ARMOR_STAND); @@ -18,10 +18,10 @@ index 3f4986d6a755088a2014a373767e51efa976e997..8cb13a742a1cc03d60c78d0bf5be8c6a 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 898f64de427b84cbf9b0e5198098f8e2e9040928..bc12a7a96d8db8eb6ad2bcfccaa69464c1e2170d 100644 +index 9cc2af3db862fdfa45a67ef4b9c49581d7d69d36..b62bf660b9ccc479afdd9d277a78aa857211ef12 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 { +@@ -248,7 +248,11 @@ public class ItemFrame extends HangingEntity { this.removeFramedMap(itemStack); } else { if (withFrame) { @@ -35,7 +35,7 @@ index 898f64de427b84cbf9b0e5198098f8e2e9040928..bc12a7a96d8db8eb6ad2bcfccaa69464 if (!itemStack.isEmpty()) { diff --git a/net/minecraft/world/entity/decoration/painting/Painting.java b/net/minecraft/world/entity/decoration/painting/Painting.java -index 7195082470ca411caf9c071e970edddae93cb127..9740bb9ec78cad900b9fa7d8ed6fca6a4016de03 100644 +index e43a510250b7c9b2b5542c30a9aca8be23004794..bb4081d0345a59b209c076fafaee1d1872ea0285 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 { @@ -52,10 +52,10 @@ index 7195082470ca411caf9c071e970edddae93cb127..9740bb9ec78cad900b9fa7d8ed6fca6a } } diff --git a/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java b/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java -index a820abd08a5e2a7deada616305f3a3e8ecc4fea8..f289bd4a4251dc98b194b79d030dc480dd9dbb66 100644 +index b78a488780dcf1be542fcb2c271b06939ede7053..37386231ba0de8cec1a671b95ca9cc96446115be 100644 --- a/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java +++ b/net/minecraft/world/entity/vehicle/boat/AbstractBoat.java -@@ -822,7 +822,13 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable { +@@ -820,7 +820,13 @@ public abstract class AbstractBoat extends VehicleEntity implements Leashable { @Override public final ItemStack getPickResult() { @@ -71,42 +71,42 @@ index a820abd08a5e2a7deada616305f3a3e8ecc4fea8..f289bd4a4251dc98b194b79d030dc480 @Override diff --git a/net/minecraft/world/item/ArmorStandItem.java b/net/minecraft/world/item/ArmorStandItem.java -index 4b4cc75640cc567a74c99ec8653436b2f2a50df6..47d1e104d910addcf8322976061ef38d8c791ea8 100644 +index 62b2da0f028d21f6f759bb13acaf0ed62c673386..f0cb4717a0ffb30ca81d957e0d5f468c187dd693 100644 --- a/net/minecraft/world/item/ArmorStandItem.java +++ b/net/minecraft/world/item/ArmorStandItem.java -@@ -51,6 +51,10 @@ public class ArmorStandItem extends Item { - return InteractionResult.FAIL; - } - // CraftBukkit end -+ // Purpur start - Apply display names from item forms of entities to entities and vice versa -+ 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(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()); +@@ -52,6 +52,10 @@ public class ArmorStandItem extends Item { + return InteractionResult.FAIL; + } + // CraftBukkit end ++ // Purpur start - Apply display names from item forms of entities to entities and vice versa ++ 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(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 cd7f38ab2553062dcd003bd6f758e4aba77051ea..2b90dec5d564f05f350637a9645d76d4ab7d6126 100644 +index 8d30c52c46b5f81cd0b9eef6b9c2301613f23892..7c4786b14acbeaa9fd8f98281ed74efbccdd15c9 100644 --- a/net/minecraft/world/item/BoatItem.java +++ b/net/minecraft/world/item/BoatItem.java -@@ -63,6 +63,7 @@ public class BoatItem extends Item { - return InteractionResult.FAIL; - } else { - boat.setYRot(player.getYRot()); -+ if (!level.purpurConfig.persistentDroppableEntityDisplayNames) boat.setCustomName(null); // Purpur - Apply display names from item forms of entities to entities and vice versa - if (!level.noCollision(boat, boat.getBoundingBox())) { - return InteractionResult.FAIL; - } else { -diff --git a/net/minecraft/world/item/HangingEntityItem.java b/net/minecraft/world/item/HangingEntityItem.java -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 { - entity = new GlowItemFrame(level, blockPos, clickedFace); +@@ -65,6 +65,7 @@ public class BoatItem extends Item { } -- 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 + boat.setYRot(player.getYRot()); ++ if (!level.purpurConfig.persistentDroppableEntityDisplayNames) boat.setCustomName(null); // Purpur - Apply display names from item forms of entities to entities and vice versa + if (!level.noCollision(boat, boat.getBoundingBox())) { + return InteractionResult.FAIL; + } +diff --git a/net/minecraft/world/item/HangingEntityItem.java b/net/minecraft/world/item/HangingEntityItem.java +index b90397101ffb45b1a0aee3103be2d3100ae02788..a611db7d20c8652abac02c2bb80bfd974a990df0 100644 +--- a/net/minecraft/world/item/HangingEntityItem.java ++++ b/net/minecraft/world/item/HangingEntityItem.java +@@ -60,7 +60,7 @@ public class HangingEntityItem extends Item { + entity = new GlowItemFrame(level, blockPos, clickedFace); + } + +- 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/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 index aaf04a29f..752c1a56e 100644 --- a/purpur-server/minecraft-patches/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 6f7af24143421cac84d9c1175acd88a776d8652d..d3f88e3274abc5904544a84a6f1e1d10a441b1e7 100644 +index f5e93036b5ecb46e4f81aff27d93d27cda49e1b0..959f9fb20c428879fdc2d4a59904cf6b1a8f4d88 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 { @@ -19,19 +19,20 @@ index 6f7af24143421cac84d9c1175acd88a776d8652d..d3f88e3274abc5904544a84a6f1e1d10 public HarvestFarmland() { super( -@@ -49,9 +50,10 @@ public class HarvestFarmland extends Behavior { - protected boolean checkExtraStartConditions(final ServerLevel level, final Villager body) { - if (!level.getGameRules().get(GameRules.MOB_GRIEFING)) { +@@ -51,10 +52,11 @@ public class HarvestFarmland extends Behavior { return false; -- } 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 && 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 { +- if (!body.getVillagerData().profession().is(VillagerProfession.FARMER)) { ++ 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; + } + ++ 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(); + +@@ -83,6 +85,7 @@ public class HarvestFarmland extends Behavior { BlockState state = level.getBlockState(blockPos); Block block = state.getBlock(); Block blockBelow = level.getBlockState(blockPos.below()).getBlock(); @@ -39,7 +40,7 @@ index 6f7af24143421cac84d9c1175acd88a776d8652d..d3f88e3274abc5904544a84a6f1e1d10 return block instanceof CropBlock && ((CropBlock)block).isMaxAge(state) || state.isAir() && blockBelow instanceof FarmlandBlock; } -@@ -107,19 +110,19 @@ public class HarvestFarmland extends Behavior { +@@ -109,19 +112,19 @@ public class HarvestFarmland extends Behavior { BlockState blockState = level.getBlockState(this.aboveFarmlandPos); Block block = blockState.getBlock(); Block blockBelow = level.getBlockState(this.aboveFarmlandPos.below()).getBlock(); @@ -62,7 +63,7 @@ index 6f7af24143421cac84d9c1175acd88a776d8652d..d3f88e3274abc5904544a84a6f1e1d10 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 { +@@ -136,7 +139,7 @@ public class HarvestFarmland extends Behavior { this.aboveFarmlandPos.getX(), this.aboveFarmlandPos.getY(), this.aboveFarmlandPos.getZ(), @@ -135,7 +136,7 @@ index ec12508c112b1e7748a5d197b73a0d540bed10fc..f2daabad51d565cae11e8bfce8b1bf40 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 19bba23d87543574d5d8a4139ac93e751fe690d9..27b2675059795b54b7d217442065bd50618ac7ae 100644 +index e06be61042e8cb873aed23ebcb94cc688a2668cc..744a7251f0ab9d7cb09ccdc7d1f0bbcd62483da1 100644 --- a/net/minecraft/world/entity/npc/villager/Villager.java +++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -148,7 +148,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re @@ -147,7 +148,7 @@ index 19bba23d87543574d5d8a4139ac93e751fe690d9..27b2675059795b54b7d217442065bd50 ImmutableSet.of(Pair.of(MemoryModuleType.JOB_SITE, MemoryStatus.VALUE_PRESENT)) ) ); -@@ -945,7 +945,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re +@@ -947,7 +947,7 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re } public boolean hasFarmSeeds() { diff --git a/purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch b/purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch index 11e98a85f..3f191371f 100644 --- a/purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch +++ b/purpur-server/minecraft-patches/features/0015-Add-mobGriefing-override-to-everything-affected.patch @@ -5,10 +5,10 @@ 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 fd20156ba4319778323756485557b3dbc32b09c1..5ce6af2b5b22f439aa747d937f0baef7c2479635 100644 +index 34d122f58ff32cb47b79ab1348fee3224315d2dd..af7a1eebe6f3d9876a1a730f4ca9b0814ed57332 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java -@@ -1950,7 +1950,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -1953,7 +1953,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin if (this.level() instanceof ServerLevel serverLevel) { boolean var6 = false; if (this.dead && killer instanceof WitherBoss) { // Paper @@ -18,7 +18,7 @@ index fd20156ba4319778323756485557b3dbc32b09c1..5ce6af2b5b22f439aa747d937f0baef7 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 542ee720980f1bf8408bc150612f9a96f80a594c..6847463312a41f30cbca4116bfe5c9f2b56a451d 100644 +index d9c5d2e1c638370434e52422c9643c3521f1bb42..d5c50e5f5a850995d4636e155e5d51e190b7095c 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -566,7 +566,7 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs @@ -31,7 +31,7 @@ index 542ee720980f1bf8408bc150612f9a96f80a594c..6847463312a41f30cbca4116bfe5c9f2 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 d3f88e3274abc5904544a84a6f1e1d10a441b1e7..002328d8e8b7a5b2322872814c81a287d62ff89d 100644 +index 959f9fb20c428879fdc2d4a59904cf6b1a8f4d88..a3590f9b54520c2b7e11de706fba685c3b860f7c 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 { @@ -41,8 +41,8 @@ index d3f88e3274abc5904544a84a6f1e1d10a441b1e7..002328d8e8b7a5b2322872814c81a287 - 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 (!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 e33598c3ea748f81c7efcaa06d9d0597624a852b..80a42d030969e264a93108ca3f2c296dd295ad1d 100644 --- a/net/minecraft/world/entity/ai/goal/BreakDoorGoal.java @@ -57,7 +57,7 @@ index e33598c3ea748f81c7efcaa06d9d0597624a852b..80a42d030969e264a93108ca3f2c296d && !this.isOpen(); } diff --git a/net/minecraft/world/entity/ai/goal/EatBlockGoal.java b/net/minecraft/world/entity/ai/goal/EatBlockGoal.java -index 0f52b048c33f3dbafd5734dc724bcd74db43884a..a40284d4f3812a169e94593ec14192e079133bd4 100644 +index c2a1b2b79c4b55dc09558cf6d998f09308196cb2..96cc2c94fe5bfde6a04b83b9bdb925e1454d109c 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 { @@ -79,7 +79,7 @@ index 0f52b048c33f3dbafd5734dc724bcd74db43884a..a40284d4f3812a169e94593ec14192e0 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 ca91cadd8d52c09a735e6447664bed4753f3cdd3..3277777cb8672d29a0d49ef03f9cf35cc5df3838 100644 +index ff0f99d4b560a1c0721885b0eba5bd5ab2087bd7..51c72524c14c078d1bb0539f0b54fc4af1c1412d 100644 --- a/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java +++ b/net/minecraft/world/entity/ai/goal/RemoveBlockGoal.java @@ -34,7 +34,7 @@ public class RemoveBlockGoal extends MoveToBlockGoal { @@ -92,10 +92,10 @@ index ca91cadd8d52c09a735e6447664bed4753f3cdd3..3277777cb8672d29a0d49ef03f9cf35c } 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 579718387c43ef36eacfe3abfb789b64e17fa55f..29c09797530fa25e31177cf402ecac6a8f43bb23 100644 +index bd4c29146ec791a7939fdea6c3f22badaa7b393a..ed481b0d7c7787ef01797ef553b85b1bac6027c9 100644 --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java -@@ -1082,7 +1082,7 @@ public class Fox extends Animal { +@@ -1068,7 +1068,7 @@ public class Fox extends Animal { } protected void onReachedTarget() { @@ -118,7 +118,7 @@ index bd594838ae25f16e6e16335e06c4d981c5ecdc2a..7091f5bc2ecb9d4b86162fe364447df6 } diff --git a/net/minecraft/world/entity/animal/rabbit/Rabbit.java b/net/minecraft/world/entity/animal/rabbit/Rabbit.java -index 3aefbdc3e537bc53bba296c7876dee93c95a77ca..4d79ce89c21ba0b973bbda01bf53665e3b7a1902 100644 +index f0a0c698c612de039a24b51f6afa87df8008d5b7..07db369d748df1e870339eb06032146d6fba8d35 100644 --- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java +++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java @@ -696,7 +696,7 @@ public class Rabbit extends Animal { @@ -131,7 +131,7 @@ index 3aefbdc3e537bc53bba296c7876dee93c95a77ca..4d79ce89c21ba0b973bbda01bf53665e } diff --git a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -index 24e765b67ee7730b4e1f74a8f5de897eaf479f01..89acbf42f9ce83c41bb2167e332e1b20e6e8fa56 100644 +index 6e2afa71d0d2da4cca868f617d29b3cc9071553d..9cdbb284c190f2130824c881000880958994013f 100644 --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java @@ -535,7 +535,7 @@ public class EnderDragon extends Mob implements Enemy { @@ -144,10 +144,10 @@ index 24e765b67ee7730b4e1f74a8f5de897eaf479f01..89acbf42f9ce83c41bb2167e332e1b20 //flag1 = level.removeBlock(blockPos, false) || flag1; destroyedBlock = true; diff --git a/net/minecraft/world/entity/boss/wither/WitherBoss.java b/net/minecraft/world/entity/boss/wither/WitherBoss.java -index fb04a6d53cc12038f4c55db84278632582c698fc..30d9d12d67e2adb7d37c2a38ea1a5b528ba4ab06 100644 +index 8b2716294b18da6fae981e088b8ddb1f2ffcfb2e..06f09cf81d1ad42beda79dbd5087c2d7264a9612 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -493,7 +493,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -492,7 +492,7 @@ public class WitherBoss extends Monster implements RangedAttackMob { if (this.destroyBlocksTick > 0) { this.destroyBlocksTick--; @@ -157,10 +157,10 @@ index fb04a6d53cc12038f4c55db84278632582c698fc..30d9d12d67e2adb7d37c2a38ea1a5b52 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 30450300bdf9e4b5ef4293e9c371484ba6aabebc..46a60e17837411e46a543d6f0254d7280d30a94c 100644 +index e9b28ab9af835e8394855f08edb3cc463022d6f9..3f233ad5cf2514813ec8d3d36a59f716615a8b18 100644 --- a/net/minecraft/world/entity/monster/EnderMan.java +++ b/net/minecraft/world/entity/monster/EnderMan.java -@@ -505,7 +505,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -504,7 +504,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 30450300bdf9e4b5ef4293e9c371484ba6aabebc..46a60e17837411e46a543d6f0254d728 && this.enderman.getRandom().nextInt(reducedTickDelay(2000)) == 0; } -@@ -649,7 +649,7 @@ public class EnderMan extends Monster implements NeutralMob { +@@ -648,7 +648,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 @@ -192,19 +192,19 @@ index 3e2fa1f4e9c820af76ef5f4354ca66fae182da7b..01e09b39ac5385e7cbfa8a38df94884c 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 355475b12c6f3fcc9fe88ca63ab88cabac9d6fb1..e5a0a199685366f082904eb5e7550f0160f9c706 100644 +index 6037500c084e709110dfe512f110b505111b6d71..34bb4c573f72b32931e47e5502a342a8d2283a6c 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 { - return false; - } else { - RandomSource random = this.mob.getRandom(); -- 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 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 { +@@ -173,7 +173,7 @@ public class Silverfish extends Monster { + } + + RandomSource random = this.mob.getRandom(); +- 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 pos = BlockPos.containing(this.mob.getX(), this.mob.getY() + 0.5, this.mob.getZ()).relative(this.selectedDirection); + BlockState blockState = this.mob.level().getBlockState(pos); +@@ -249,7 +249,7 @@ public class Silverfish extends Monster { Block block = blockState.getBlock(); if (block instanceof InfestedBlock) { // CraftBukkit start @@ -214,20 +214,20 @@ index 355475b12c6f3fcc9fe88ca63ab88cabac9d6fb1..e5a0a199685366f082904eb5e7550f01 continue; } diff --git a/net/minecraft/world/entity/monster/illager/Evoker.java b/net/minecraft/world/entity/monster/illager/Evoker.java -index 212c74328b1f2c4bb8753787f70246249ab5fe75..b6a84372a9d1486998a92fdfa1f44f2158c03a51 100644 +index d41c3efa257f82981fbbabd527c4e748f448bfa9..40fb26c7b0f5975a58d218d799fa391661e1c748 100644 --- a/net/minecraft/world/entity/monster/illager/Evoker.java +++ b/net/minecraft/world/entity/monster/illager/Evoker.java -@@ -334,7 +334,7 @@ public class Evoker extends SpellcasterIllager { +@@ -318,7 +318,7 @@ public class Evoker extends SpellcasterIllager { + } + + 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 { - 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 entities = level.getNearbyEntities( + } + diff --git a/net/minecraft/world/entity/monster/piglin/Piglin.java b/net/minecraft/world/entity/monster/piglin/Piglin.java -index 0d0a86b5c485a60d0e85b3acc6f0cc01ce6c0bfe..356fc7507b58cc38cdf5ee11618ad3551fb3c6a2 100644 +index 17ce12d23ec9e1e03c02755711dfecb6d207af61..d00490669c66343e37d2a54a051f02995e686c84 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -416,7 +416,7 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -240,7 +240,7 @@ index 0d0a86b5c485a60d0e85b3acc6f0cc01ce6c0bfe..356fc7507b58cc38cdf5ee11618ad355 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 2ee2103e78f2b73d1e6df59b92037f219d82e191..47a27f0415a769c90a99d8868f19a8297d4c1d23 100644 +index 9af4bf76974f05d9f752bbd4e8037560ec481cdf..7f3673a44b0200d18dbf7f1fac8d377bfc994232 100644 --- a/net/minecraft/world/entity/projectile/Projectile.java +++ b/net/minecraft/world/entity/projectile/Projectile.java @@ -460,7 +460,7 @@ public abstract class Projectile extends Entity implements TraceableEntity { @@ -294,10 +294,10 @@ index 55000ce5010321323bf79007ef8de637a492657f..b7f5f434b8b3abbaab7f65fc591ddf18 // CraftBukkit end } diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java -index 72fda1b1a5cd26f98828c130a52835cc6213aed4..f37216b7f2d094ba98ea5eb004b599ad6dd8697d 100644 +index cf689dae6978577970e39bf3004be551b4908cd1..869af8dffe56a52ea1406a6598df733f724ee654 100644 --- a/net/minecraft/world/entity/raid/Raider.java +++ b/net/minecraft/world/entity/raid/Raider.java -@@ -400,7 +400,7 @@ public abstract class Raider extends PatrollingMonster { +@@ -397,7 +397,7 @@ public abstract class Raider extends PatrollingMonster { } private boolean cannotPickUpBanner() { @@ -305,7 +305,7 @@ index 72fda1b1a5cd26f98828c130a52835cc6213aed4..f37216b7f2d094ba98ea5eb004b599ad + if (!getServerLevel(this.mob).getGameRules().get(net.minecraft.world.level.gamerules.GameRules.MOB_GRIEFING, this.mob.level().purpurConfig.pillagerMobGriefingOverride)) return true; // Paper - respect game and entity rules for picking up items // Purpur - Add mobGriefing override to everything affected if (!this.mob.hasActiveRaid()) { return true; - } else if (this.mob.getCurrentRaid().isOver()) { + } diff --git a/net/minecraft/world/level/block/CropBlock.java b/net/minecraft/world/level/block/CropBlock.java index a47e5e38ef5c13da3827174121c1ec4b9ffbbce2..0dfb632b339b24564744b1f5c0d52d7fed66d265 100644 --- a/net/minecraft/world/level/block/CropBlock.java diff --git a/purpur-server/minecraft-patches/features/0016-Toggle-for-water-sensitive-mob-damage.patch b/purpur-server/minecraft-patches/features/0016-Toggle-for-water-sensitive-mob-damage.patch index 663b0ac4d..8a0150d68 100644 --- a/purpur-server/minecraft-patches/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 f40892bbe424408e3d11c887d5bd0fef179aaced..15bb425ed1569cbf445e81aa296039df8abc4746 100644 +index cb242c69be97e0927dd62714f1a9b112c0dec84b..626463a20f49c807eae86b30fe38c514311abd88 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 f40892bbe424408e3d11c887d5bd0fef179aaced..15bb425ed1569cbf445e81aa296039df 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 d4178d85b74a41a0d2808681008f1686578db98d..a3a98df8ffeb33d86330b5561252eda596642da8 100644 +index 3f1c56981c5da00bf7d07c9faf80d3386442723c..72583935d49eb513e1e3211863865f154e742aeb 100644 --- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -150,6 +150,13 @@ public class Axolotl extends Animal implements Bucketable { +@@ -149,6 +149,13 @@ public class Axolotl extends Animal implements Bucketable { } // Purpur end - Make entity breeding times configurable @@ -41,10 +41,10 @@ index d4178d85b74a41a0d2808681008f1686578db98d..a3a98df8ffeb33d86330b5561252eda5 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 44f11b07a2b8a37db399976c4c79b44c4416f2e9..e85c33e4d0d19d4e7f8ef837ec0a611e19bc19e4 100644 +index 0a06e8df6e111ba65269365f3d021b57d7f87e60..df53953b532ebb4cdc78ea1e1cab0b0ed48ce960 100644 --- a/net/minecraft/world/entity/animal/bee/Bee.java +++ b/net/minecraft/world/entity/animal/bee/Bee.java -@@ -186,7 +186,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -185,7 +185,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { // Paper end - Fix MC-167279 this.lookControl = new Bee.BeeLookControl(this); this.setPathfindingMalus(PathType.FIRE_IN_NEIGHBOR, -1.0F); @@ -53,7 +53,7 @@ index 44f11b07a2b8a37db399976c4c79b44c4416f2e9..e85c33e4d0d19d4e7f8ef837ec0a611e this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F); this.setPathfindingMalus(PathType.COCOA, -1.0F); this.setPathfindingMalus(PathType.FENCE, -1.0F); -@@ -495,6 +495,13 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -494,6 +494,13 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { } // Purpur end - Make entity breeding times configurable @@ -104,7 +104,7 @@ index 7981f60f10c44ab2459933cb15ee961103922364..7d3853d693a87e5225a16285631e0e20 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 68a4edef68c9db6b2b0716fc6283e2c7345d4cda..d3e5e12c4e3c168a3a15d611f8ae5845ee365080 100644 +index 88ac1974f09b9213f124550b1873d28d8c926083..9bdc0bb89e554957c70d97e6ca60f1c4aa1ef91b 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 { @@ -122,7 +122,7 @@ index 68a4edef68c9db6b2b0716fc6283e2c7345d4cda..d3e5e12c4e3c168a3a15d611f8ae5845 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 b2e6307ead267fa8a1acd6956c409f2bcbf28c41..0cab39846b6ad5d0e0ce627d6a84f73340fcd328 100644 +index f8e155393b0c2a69018da88556116b4eeb416d83..58ce1ab82ab9883853eeffd103a1b72053c59798 100644 --- a/net/minecraft/world/entity/animal/dolphin/Dolphin.java +++ b/net/minecraft/world/entity/animal/dolphin/Dolphin.java @@ -162,6 +162,13 @@ public class Dolphin extends AgeableWaterCreature { @@ -176,7 +176,7 @@ index dbb586058f38b6c4f81e2f6567b7ae8ebbaff5a2..64603ad973bdb697ca75642e8e42e705 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 138e10184c2b115e04a8a4c73ccc9a87a90e7409..c56d6f3a8a0c5a95da49ab34c72659872259a723 100644 +index 08dcee8ef18818ad6963762198b9e60e9c7d4d04..4b7a9c76df89cb0494db9375940bc219093f04c1 100644 --- a/net/minecraft/world/entity/animal/equine/Llama.java +++ b/net/minecraft/world/entity/animal/equine/Llama.java @@ -158,6 +158,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { @@ -212,7 +212,7 @@ index cf0f3c9d5f8ff348e6fb76db823da4cadce4fc5b..291176b409097d15c2afff7fe8deb17b 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 a4a878791be034140a50b901d5daf2533d299756..9365609fad67377ffe18e11c7959e0d92367852a 100644 +index cfce6db53e670b39a0db7f6a17857dda0ad160f6..02aa9a838e0cbd62bc0a2e0f30e0cfc9a3995a41 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 { @@ -266,7 +266,7 @@ index 4be11663154a870a21832ddba05764a897ce90bd..586151b916a5e21c36578aa04cab9d71 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 334879e3f1a28825749e7e4a3863454ee0a5ac9a..966b2cbc5b4f71d2cfa8759c2263407ee73c3d8e 100644 +index 51a587af3507415dad42f764d8fe72c5856cb6a7..609cf964f5020728321da2e08ccd94dc925cc4c7 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 { @@ -338,7 +338,7 @@ index 26acbeff80d3a4216b69b9842381f3fa48c9862b..a0f1ea76011dc3aa6e8a702528062f5f 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 d9276ab9af526f1714d3241bbf6f9c7906adec70..ba75ba1130c4fe5f4d7b29c624a17becd2a71c99 100644 +index 9bce191fbc3b68a051f50e85674b8cfd42832a85..ddf23647e17bdb04babae1832486efb52ab9f81a 100644 --- a/net/minecraft/world/entity/animal/fish/Salmon.java +++ b/net/minecraft/world/entity/animal/fish/Salmon.java @@ -60,6 +60,13 @@ public class Salmon extends AbstractSchoolingFish { @@ -356,7 +356,7 @@ index d9276ab9af526f1714d3241bbf6f9c7906adec70..ba75ba1130c4fe5f4d7b29c624a17bec 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 fbe7b76aac06bb0dce7ae53dea85e947a53d1b64..17bc569bf97026e2c072633f1ad6e9e0102c137a 100644 +index e9692aacca5f32c4280b16b4eabecf87c2ed5aeb..dc2800dd2f4c9f71c79d9f012be17398263d033d 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 { @@ -374,10 +374,10 @@ index fbe7b76aac06bb0dce7ae53dea85e947a53d1b64..17bc569bf97026e2c072633f1ad6e9e0 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 29c09797530fa25e31177cf402ecac6a8f43bb23..c70e04d20e37b7063618805016d24a459ee65c91 100644 +index ed481b0d7c7787ef01797ef553b85b1bac6027c9..e74adaebbf28247e8bc85671ca294c9d9843ca08 100644 --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java -@@ -208,6 +208,13 @@ public class Fox extends Animal { +@@ -207,6 +207,13 @@ public class Fox extends Animal { } // Purpur end - Make entity breeding times configurable @@ -392,7 +392,7 @@ index 29c09797530fa25e31177cf402ecac6a8f43bb23..c70e04d20e37b7063618805016d24a45 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 c8b2ef70ca3f730d87c30af9f29adb2ad083d26f..24cccc6afadfc91feb6157882c1b76da0d3657d1 100644 +index 8651caf56331d78f80982b9be1fa24cb963a78a4..ea0aace589356cb2719925d5287bc5672eb45993 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java @@ -124,6 +124,13 @@ public class Goat extends Animal { @@ -410,7 +410,7 @@ index c8b2ef70ca3f730d87c30af9f29adb2ad083d26f..24cccc6afadfc91feb6157882c1b76da 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 bc66450f8d1be97f11f8380755a9973e8ef4befa..078cb2f09e9aaf05bb965a27b90f34c7c3a4147d 100644 +index 00877102ad4261ecd7191e402cf4e381dd6e40b3..ac416c47f86b2ec4c8c58a24491b81504e3a8212 100644 --- a/net/minecraft/world/entity/animal/golem/CopperGolem.java +++ b/net/minecraft/world/entity/animal/golem/CopperGolem.java @@ -144,6 +144,13 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab @@ -428,7 +428,7 @@ index bc66450f8d1be97f11f8380755a9973e8ef4befa..078cb2f09e9aaf05bb965a27b90f34c7 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 ec08c9c2ac32863807061d93ec8894bd094f7ab4..77996312597da9a2bbcf89f798c10a0be0abcd39 100644 +index cd68a06abb509dbdbcf909d3f3e142c7a1f896cf..305b6b9b5575c9351990d36f3bd2e9721a00dc2b 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 { @@ -459,10 +459,10 @@ index 7091f5bc2ecb9d4b86162fe364447df65d8e9348..2d3127f6846ff9eda1a0b89764dc837d @Override diff --git a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java -index b049adf5604555041102497d7fe0c865c56d751f..a73d8d3eb04602eac78f142c336e464de22ecc83 100644 +index cc3ecc13bfcd367f8c6aeb55380bf509e525d85b..2ab9e28e84193ea76e09008a230fbdeb5acbf4c1 100644 --- a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +++ b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java -@@ -161,6 +161,13 @@ public class HappyGhast extends Animal { +@@ -160,6 +160,13 @@ public class HappyGhast extends Animal { } // Purpur end - Make entity breeding times configurable @@ -477,10 +477,10 @@ index b049adf5604555041102497d7fe0c865c56d751f..a73d8d3eb04602eac78f142c336e464d 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 f413e018856d485f706d2b8742b92b3253fe6532..2f9f588c384d133f82bb4b2d08c8f7c7a72c0915 100644 +index 25232dc02916a0d7189d925c858d88ab71ea5677..4249aff88a1768f2f2184a09efe730752545b164 100644 --- a/net/minecraft/world/entity/animal/panda/Panda.java +++ b/net/minecraft/world/entity/animal/panda/Panda.java -@@ -153,6 +153,13 @@ public class Panda extends Animal { +@@ -152,6 +152,13 @@ public class Panda extends Animal { } // Purpur end - Make entity breeding times configurable @@ -495,7 +495,7 @@ index f413e018856d485f706d2b8742b92b3253fe6532..2f9f588c384d133f82bb4b2d08c8f7c7 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 af3d3b90f2e4d433b3b842dbc37d8c507a73dc1f..d756d6931dbf560fef5cb9641ace6f091fbcfff9 100644 +index 346cc1fa117229b95eef86b1bf2e9fe3a84970cf..0f5da739a7bed82a1ccef173d379a78981f37939 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 { @@ -513,7 +513,7 @@ index af3d3b90f2e4d433b3b842dbc37d8c507a73dc1f..d756d6931dbf560fef5cb9641ace6f09 public @Nullable SpawnGroupData finalizeSpawn( 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 514f13a6965b5f53890ddd2e47ea89e0c1a515c1..05141bc41dc5181a8f0526528147e7a6c015a707 100644 +index 14696e16da919a78d0098ad07a911b82ed6b60da..5413851446237e7984c8da4172c31b0dd9affc60 100644 --- a/net/minecraft/world/entity/animal/pig/Pig.java +++ b/net/minecraft/world/entity/animal/pig/Pig.java @@ -100,6 +100,13 @@ public class Pig extends Animal implements ItemSteerable { @@ -531,10 +531,10 @@ index 514f13a6965b5f53890ddd2e47ea89e0c1a515c1..05141bc41dc5181a8f0526528147e7a6 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 6d4713663c94e91da7d809e65fa205aff2782f38..2a28c9ef361909aa0c3946ed6857f7d340c8cfc0 100644 +index 38d4e31ddd9bd169dd30b6dee456f0d3f10f106d..a9e64a4053755050099cdcaef870a0099a867575 100644 --- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java +++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java -@@ -134,6 +134,13 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -133,6 +133,13 @@ public class PolarBear extends Animal implements NeutralMob { } // Purpur end - Make entity breeding times configurable @@ -549,7 +549,7 @@ index 6d4713663c94e91da7d809e65fa205aff2782f38..2a28c9ef361909aa0c3946ed6857f7d3 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 4d79ce89c21ba0b973bbda01bf53665e3b7a1902..7dade80db9430e4db587ed23df992d70c6b7ee04 100644 +index 07db369d748df1e870339eb06032146d6fba8d35..9116e659fff5daf09257739f6c04e32d1dfc70ca 100644 --- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java +++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java @@ -177,6 +177,13 @@ public class Rabbit extends Animal { @@ -603,7 +603,7 @@ index cb3d0bd838473af87af74c7d1bab38593a6c8f6d..1fa3d614dd1c45ec42caffbe92e3f8db 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 49ef7f4004a2f82df2d8cbf0d0473a5d84588fac..8b26b08956e63d3ccb9a7006cfa57ac3771339ad 100644 +index da8e8d817f959ffcbc0a84a40af854ecfc939ef2..2b2272122a7ebaed6a995d09dab7a3db3ee0c594 100644 --- a/net/minecraft/world/entity/animal/squid/Squid.java +++ b/net/minecraft/world/entity/animal/squid/Squid.java @@ -104,6 +104,13 @@ public class Squid extends AgeableWaterCreature { @@ -639,10 +639,10 @@ index 62d9fce83cc44165c5356049a12bf6081c925857..6d09c0de38f2c91d2a0ab6dd0b694ab4 this.homePos = pos; } diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index 0ac4e30fd4f3158b5f53e9ba8bc70964907c63a2..cd7981c9c040e1b745e08680bf3685903cbda8ff 100644 +index f84b35919e49c1a86cbc4bdec1f9f81f2dac633d..1587bcafa4b338a98e60743faab0b2ce9b923444 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -220,6 +220,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -219,6 +219,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Make entity breeding times configurable @@ -657,7 +657,7 @@ index 0ac4e30fd4f3158b5f53e9ba8bc70964907c63a2..cd7981c9c040e1b745e08680bf368590 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 89acbf42f9ce83c41bb2167e332e1b20e6e8fa56..26a525dc6458e9ebcc37dafa0d73518e65d54f42 100644 +index 9cdbb284c190f2130824c881000880958994013f..994939ffe86f9986b6879c5cf9f982f8e9535e37 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 89acbf42f9ce83c41bb2167e332e1b20e6e8fa56..26a525dc6458e9ebcc37dafa0d73518e 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 30d9d12d67e2adb7d37c2a38ea1a5b528ba4ab06..5e206030d9ccabbefe9c64332125526030d65750 100644 +index 06f09cf81d1ad42beda79dbd5087c2d7264a9612..2a88f051740bba72bb48e7f23cbd12d216a2eb86 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -222,6 +222,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -221,6 +221,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Configurable entity base attributes @@ -715,7 +715,7 @@ index b553c6dd60bd23fba7ee3df9886561fc7640f104..7f0e76437798f1bab7956722382e1517 @Override diff --git a/net/minecraft/world/entity/monster/Creeper.java b/net/minecraft/world/entity/monster/Creeper.java -index 73b0efd692205f56862c7287d7222efebe3faf73..80327a6ba1da0145f087a7946c7a4dfb6d947ce7 100644 +index 01c722932aaed2221badaa6231d8a20d005b087b..2d60c5e6426097302464e04bcfdd60abd08b96b9 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 { @@ -751,7 +751,7 @@ index ffcfe02c51f6df1bd238c821a8d6535f4ccf019c..a98967c7a76d8e25da9e31eaa8f2ae0b 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 46a60e17837411e46a543d6f0254d7280d30a94c..8862ad857a4c99defe7621c59d8f3ef77ab7aff4 100644 +index 3f233ad5cf2514813ec8d3d36a59f716615a8b18..2b02becb39f89ca02e42cf9e3df6cbfa8eba800f 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 { @@ -773,7 +773,7 @@ index 46a60e17837411e46a543d6f0254d7280d30a94c..8862ad857a4c99defe7621c59d8f3ef7 @Override diff --git a/net/minecraft/world/entity/monster/Endermite.java b/net/minecraft/world/entity/monster/Endermite.java -index 040f0b59d93b1b94495253f3286bdba123c22ef4..859d490dd3be2843dde3a811bcc0d51e3eae76f0 100644 +index c10982945974171e478690d2db5080551cb29cdb..099476663f734f00b4979de7c2d0f13da5bf4909 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 040f0b59d93b1b94495253f3286bdba123c22ef4..859d490dd3be2843dde3a811bcc0d51e 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 4a786f17a7a8e6175775c4705445e9dff1b2aa7c..64800fe5cfb3488b63126ed09f1f678d6ebd1d3b 100644 +index 5ebb6dc59ee8a845a983de207e763e1df103a4f7..14c5c70853bc8bef677c12f7e1884f472c293609 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 { @@ -827,7 +827,7 @@ index c39031e8fdfb0dff7867d9525dbddde110242647..43ebfe06ce2a8c15787d72a8ef54cd6c 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 d5880eebf3c64dab03234ac55110645541413c4a..ea7e6a1b4dad1b702ddc5b6004c5ebdfd541334d 100644 +index 2616aab01c6c43fcc259c42c9d5c43fc73794caf..3acf963c26ef5f269a95cdf8fe0da248adf22c83 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 { @@ -863,10 +863,10 @@ index d40a4daeec1500f2d9865022ee6e3c386ad7533e..fba41f261e57a050d4e24d2611cc27ed 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 b3a79a6387fbf00c97da4452cb48e4808e5391be..646ec1cfc192e16939c9e3dac04b77d1429f82e3 100644 +index 03db90080675c879688c37e568dc25603b4972b1..b95449d4de57c42e604428e4f5a74fb1eb44746f 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -129,6 +129,13 @@ public class Phantom extends Mob implements Enemy { +@@ -128,6 +128,13 @@ public class Phantom extends Mob implements Enemy { } // Purpur end - Phantoms attracted to crystals and crystals shoot phantoms @@ -899,10 +899,10 @@ index 01e09b39ac5385e7cbfa8a38df94884c17f8f8c0..3e0403635cb9ce3d0894705db6727d9a protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index 2ba213e85002f7c76e3dbd8b386ebbb0b11fa86b..67aa12ee4a58e7cd31efb47cd1d71eaa2cc6af7d 100644 +index b07dd45cf3ee07d8e51aa9473ee22fab577809c6..8e33c702bf4b6a2ad2af8e730f9fecef579ab2ad 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -135,6 +135,13 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -134,6 +134,13 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Configurable entity base attributes @@ -917,7 +917,7 @@ index 2ba213e85002f7c76e3dbd8b386ebbb0b11fa86b..67aa12ee4a58e7cd31efb47cd1d71eaa 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 e5a0a199685366f082904eb5e7550f0160f9c706..205c05f46d70d37e11a0e35c97128e0c20b94e23 100644 +index 34bb4c573f72b32931e47e5502a342a8d2283a6c..e6bc3451f2f5921c5f8773749962b4334328ac88 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 { @@ -953,7 +953,7 @@ index f541ccef625ab0d560f4781c28ad7ae3b67196d6..834125d0ded28a1d7a39a3e5fcf6a5bb 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 38a17c219bce1a8a8a67b136e0eaf5cf15ec94fd..1b6137674d807ed29d56e3f3120abe60254274e1 100644 +index b6c20ce23cc1c97c337c5df6e03ad79a51c08702..eacbaa4a9c9eb30a29eade20b31860f9ec6e1a69 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -87,7 +87,7 @@ public class Strider extends Animal implements ItemSteerable { @@ -975,10 +975,10 @@ index 38a17c219bce1a8a8a67b136e0eaf5cf15ec94fd..1b6137674d807ed29d56e3f3120abe60 @Override diff --git a/net/minecraft/world/entity/monster/Vex.java b/net/minecraft/world/entity/monster/Vex.java -index 29e9a0deb5aa99800dc6554ad6bba36bbe6dd80e..917f256f072ba29ae77e4976dd4d49ffcb2a0e35 100644 +index 4b5aade3de8ff29943b58741db5e310851a33561..838edcb5267268fadfc913ea71f3fb4adbe94209 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -111,6 +111,13 @@ public class Vex extends Monster implements TraceableEntity { +@@ -110,6 +110,13 @@ public class Vex extends Monster implements TraceableEntity { } // Purpur end - Configurable entity base attributes @@ -1047,10 +1047,10 @@ index d158807f22a0a08614b2d7054663ef2782a519e3..d001cf955dba66435079eb2cc30e05ae 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 b6a84372a9d1486998a92fdfa1f44f2158c03a51..a766f1139459488accd0d720be3ff522e88c3d09 100644 +index 40fb26c7b0f5975a58d218d799fa391661e1c748..fe67813da3b3be09dad8f99a68685448b33fa5a9 100644 --- a/net/minecraft/world/entity/monster/illager/Evoker.java +++ b/net/minecraft/world/entity/monster/illager/Evoker.java -@@ -75,6 +75,13 @@ public class Evoker extends SpellcasterIllager { +@@ -74,6 +74,13 @@ public class Evoker extends SpellcasterIllager { } // Purpur end - Configurable entity base attributes @@ -1065,10 +1065,10 @@ index b6a84372a9d1486998a92fdfa1f44f2158c03a51..a766f1139459488accd0d720be3ff522 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 bc19b4c293a4101abd559c61c59021e076420b32..32b8f638ea26494cae648f4bb48a664ce2a5021e 100644 +index 0150ebdcbb681bcf8128eec34fd6e3fbfb85a79f..bfd1a61d43fcc1293592a6199d7bab0346f40c7f 100644 --- a/net/minecraft/world/entity/monster/illager/Illusioner.java +++ b/net/minecraft/world/entity/monster/illager/Illusioner.java -@@ -87,6 +87,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -86,6 +86,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } // Purpur end - Configurable entity base attributes @@ -1119,7 +1119,7 @@ index 865395b9ceddfaac4fc88701878a1cf349556fe1..aab0bd86da31ca73efc4988fa34c9068 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 356fc7507b58cc38cdf5ee11618ad3551fb3c6a2..de86e23b377ca0727d5f5234f2bc63180ddbbad2 100644 +index d00490669c66343e37d2a54a051f02995e686c84..21674f5ee9bd89bfbcf36f43ba728a692934a886 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -133,6 +133,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -1191,7 +1191,7 @@ index ce9364040d6e856fd1fa42baa75b403098e6813f..64dc2a04bb2ae4dc63083a24c48f671b 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 024b6d01eaf36ec6c9a85da669cc6bd0a4a6fc90..f1cf1d01a497fc46d201ad403b459f9886059d0f 100644 +index 0d370f992e5ef601d8032230c927164d760a95e1..2f3ff6eeae3103248512afb8cfd745f3e08c3eaf 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 { @@ -1245,7 +1245,7 @@ index 8834ecb96e3a6ec28f8700b23971d00136f26a4d..467ea1fd09b94747a03aaadd28a107d9 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 0f64fe7e15655c63f996106d504ab4d18dac4a1c..e4769eeacc3ac97f90acb5ed0127990466c8d886 100644 +index 8102352e1b59608b19a68f4e5080180c9a3999b5..3828001bed19114c23e5099c3716837f4d2c2314 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 { @@ -1281,10 +1281,10 @@ index c3f2d9ab49eb501f26939387624f326227908b81..8d6262e99fb3ad98d3142ee069f07d23 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 bf94d8e9512eeb294914c748be091f6565cca676..6693ae88aa5780189faba8649346579f5b95b77e 100644 +index 4b7a00ae57526db73dda9f92a31a95c97b0bc41c..9b34ac54b4b23c826766f2d8b1098487090aac1e 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -152,6 +152,13 @@ public class Zombie extends Monster { +@@ -151,6 +151,13 @@ public class Zombie extends Monster { } // Purpur end - Configurable jockey options @@ -1335,7 +1335,7 @@ index d1edf1f44de1fc6d23bcd8044f8bf4165821790e..6cc4d4729520c60b98d45d5e7dd674e5 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 27b2675059795b54b7d217442065bd50618ac7ae..033c9322234378c46e9a6e549d04f32135243ed9 100644 +index 744a7251f0ab9d7cb09ccdc7d1f0bbcd62483da1..fd0b329f56fa78d05be5348b42f3542fff7ebbe4 100644 --- a/net/minecraft/world/entity/npc/villager/Villager.java +++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -284,6 +284,13 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re @@ -1353,10 +1353,10 @@ index 27b2675059795b54b7d217442065bd50618ac7ae..033c9322234378c46e9a6e549d04f321 public Brain 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 ea74d8ac0b5de890124361e65aeb9a08ad09fa1b..cbbfa09d53ada7c39e9504d28770867989eaa5c1 100644 +index 292980e7445d969475332d18b158a0092ad847fe..b6e16bcfff9a74fdd2109d4a442344c07692c3d1 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 +@@ -98,6 +98,13 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over } // Purpur end - Villagers follow emerald blocks diff --git a/purpur-server/minecraft-patches/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 index a696d7128..96928af07 100644 --- a/purpur-server/minecraft-patches/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,7 +6,7 @@ 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 49c5c8ab8f3333d4d6a96643e7018905a533b645..a593c6408b007f67c2c8e534f0b40f6c17545d8d 100644 +index 241ff14c2c27204fc8615b19700f946afdcfa2d1..6807b1310c70cd50bf8a0c8828a1bb627bfe4fce 100644 --- a/net/minecraft/world/entity/Entity.java +++ b/net/minecraft/world/entity/Entity.java @@ -558,6 +558,21 @@ public abstract class Entity @@ -32,7 +32,7 @@ index 49c5c8ab8f3333d4d6a96643e7018905a533b645..a593c6408b007f67c2c8e534f0b40f6c this.type = type; this.level = level; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 123cb2d5edfbfaec8ba3a2a2683bfb42ea79c36a..c7a0c22c93d4d025c64e9102d53e89da33d181b7 100644 +index af7a1eebe6f3d9876a1a730f4ca9b0814ed57332..76c520f115ab52b661828813cc15b698aa250021 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -291,6 +291,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin @@ -51,7 +51,7 @@ index 123cb2d5edfbfaec8ba3a2a2683bfb42ea79c36a..c7a0c22c93d4d025c64e9102d53e89da if (this.lastHurtByPlayer != null) { this.lastHurtByPlayer.store(output, "last_hurt_by_player"); output.putInt("last_hurt_by_player_memory_time", this.lastHurtByPlayerMemoryTime); -@@ -912,6 +914,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -914,6 +916,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", Brain.Packed.CODEC).ifPresent(packedBrain -> this.brain = this.makeBrain(packedBrain)); @@ -59,7 +59,7 @@ index 123cb2d5edfbfaec8ba3a2a2683bfb42ea79c36a..c7a0c22c93d4d025c64e9102d53e89da 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"); -@@ -3907,6 +3910,37 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin +@@ -3913,6 +3916,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); } @@ -98,7 +98,7 @@ index 123cb2d5edfbfaec8ba3a2a2683bfb42ea79c36a..c7a0c22c93d4d025c64e9102d53e89da protected void applyInput() { diff --git a/net/minecraft/world/entity/Mob.java b/net/minecraft/world/entity/Mob.java -index 6847463312a41f30cbca4116bfe5c9f2b56a451d..e367b708fb22f82aa315d38f4fb0a90c9f5f5ac7 100644 +index d5c50e5f5a850995d4636e155e5d51e190b7095c..9867e2ea9af7cf5d6d711742514e222fad55ce41 100644 --- a/net/minecraft/world/entity/Mob.java +++ b/net/minecraft/world/entity/Mob.java @@ -556,9 +556,9 @@ public abstract class Mob extends LivingEntity implements Targeting, EquipmentUs @@ -157,10 +157,10 @@ index 18bfb321e3728d3fa0596da0b86e4b76ced2178a..ab97449bfa5e8b5615e0f2b6b16be2fe // 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 646ec1cfc192e16939c9e3dac04b77d1429f82e3..0f1081b448ce03498b471f7d3c2ff63deee13268 100644 +index b95449d4de57c42e604428e4f5a74fb1eb44746f..356f5c6e5534b1b36bcb5c44021e0e48194fb645 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -53,7 +53,7 @@ public class Phantom extends Mob implements Enemy { +@@ -52,7 +52,7 @@ public class Phantom extends Mob implements Enemy { Vec3 crystalPosition; // Purpur - Phantoms attracted to crystals and crystals shoot phantoms // Paper start public java.util.@Nullable UUID spawningEntity; @@ -169,7 +169,7 @@ index 646ec1cfc192e16939c9e3dac04b77d1429f82e3..0f1081b448ce03498b471f7d3c2ff63d // 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 -@@ -62,6 +62,7 @@ public class Phantom extends Mob implements Enemy { +@@ -61,6 +61,7 @@ public class Phantom extends Mob implements Enemy { this.xpReward = 5; this.moveControl = new Phantom.PhantomMoveControl(this); this.lookControl = new Phantom.PhantomLookControl(this); @@ -177,7 +177,7 @@ index 646ec1cfc192e16939c9e3dac04b77d1429f82e3..0f1081b448ce03498b471f7d3c2ff63d } // Purpur start - Ridables -@@ -298,7 +299,7 @@ public class Phantom extends Mob implements Enemy { +@@ -297,7 +298,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); @@ -186,7 +186,7 @@ index 646ec1cfc192e16939c9e3dac04b77d1429f82e3..0f1081b448ce03498b471f7d3c2ff63d // Paper end } -@@ -309,7 +310,7 @@ public class Phantom extends Mob implements Enemy { +@@ -308,7 +309,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); @@ -196,10 +196,10 @@ index 646ec1cfc192e16939c9e3dac04b77d1429f82e3..0f1081b448ce03498b471f7d3c2ff63d } diff --git a/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java b/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java -index 32da5212c85c829eeedc9d0f7904bbcaa3ce5ed3..062c7f20e73b882ef0550d90e3da47ac39a1b3a7 100644 +index 695dca87fc3ef633290f9abe1089e7a6a0e7feb9..d02869b5c17378abf18b4ba3514e8916c62b904c 100644 --- a/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java +++ b/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java -@@ -71,11 +71,12 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo +@@ -66,11 +66,12 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo AbstractSkeleton.this.setAggressive(true); } }; @@ -213,7 +213,7 @@ index 32da5212c85c829eeedc9d0f7904bbcaa3ce5ed3..062c7f20e73b882ef0550d90e3da47ac } @Override -@@ -228,7 +229,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo +@@ -223,7 +224,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo protected void readAdditionalSaveData(final ValueInput input) { super.readAdditionalSaveData(input); this.reassessWeaponGoal(); @@ -222,7 +222,7 @@ index 32da5212c85c829eeedc9d0f7904bbcaa3ce5ed3..062c7f20e73b882ef0550d90e3da47ac } // Paper start - silent equipping -@@ -254,7 +255,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo +@@ -249,7 +250,7 @@ public abstract class AbstractSkeleton extends Monster implements RangedAttackMo @Override protected void addAdditionalSaveData(final net.minecraft.world.level.storage.ValueOutput output) { super.addAdditionalSaveData(output); @@ -265,10 +265,10 @@ index 8d6262e99fb3ad98d3142ee069f07d2370ca0778..02e935edd7a6cabbf2e6fcc6c96a9601 @Override diff --git a/net/minecraft/world/entity/monster/zombie/Zombie.java b/net/minecraft/world/entity/monster/zombie/Zombie.java -index 6693ae88aa5780189faba8649346579f5b95b77e..f8eccfab70e7d99dd74965a506837e620515b6d1 100644 +index 9b34ac54b4b23c826766f2d8b1098487090aac1e..92be49434eb76fa0774864af73b0a460f49b6a32 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -102,11 +102,12 @@ public class Zombie extends Monster { +@@ -101,11 +101,12 @@ public class Zombie extends Monster { private boolean canBreakDoors = false; private int inWaterTime = 0; public int conversionTime; @@ -282,7 +282,7 @@ index 6693ae88aa5780189faba8649346579f5b95b77e..f8eccfab70e7d99dd74965a506837e62 } public Zombie(final Level level) { -@@ -364,6 +365,7 @@ public class Zombie extends Monster { +@@ -363,6 +364,7 @@ public class Zombie extends Monster { // CraftBukkit end } @@ -290,7 +290,7 @@ index 6693ae88aa5780189faba8649346579f5b95b77e..f8eccfab70e7d99dd74965a506837e62 public boolean isSunSensitive() { return this.shouldBurnInDay; // Paper - Add more Zombie API } -@@ -505,7 +507,7 @@ public class Zombie extends Monster { +@@ -502,7 +504,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); @@ -299,7 +299,7 @@ index 6693ae88aa5780189faba8649346579f5b95b77e..f8eccfab70e7d99dd74965a506837e62 } @Override -@@ -520,7 +522,7 @@ public class Zombie extends Monster { +@@ -517,7 +519,7 @@ public class Zombie extends Monster { } else { this.getEntityData().set(DATA_DROWNED_CONVERSION_ID, false); } diff --git a/purpur-server/minecraft-patches/features/0019-Mobs-always-drop-experience.patch b/purpur-server/minecraft-patches/features/0019-Mobs-always-drop-experience.patch index a62f75b55..c3b2e4fcc 100644 --- a/purpur-server/minecraft-patches/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 15bb425ed1569cbf445e81aa296039df8abc4746..1dfc4f04169b60c917d9df58b4217adcb80470f8 100644 +index 626463a20f49c807eae86b30fe38c514311abd88..237408b7dc923b04addba1d671ad07fb3e18cdda 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 15bb425ed1569cbf445e81aa296039df8abc4746..1dfc4f04169b60c917d9df58b4217adc 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 a3a98df8ffeb33d86330b5561252eda596642da8..85986d2dc0c12a34f990e4262f79f813c9ff4cdf 100644 +index 72583935d49eb513e1e3211863865f154e742aeb..374c980e28f250e67fc045e9e1080aabe952710d 100644 --- a/net/minecraft/world/entity/animal/axolotl/Axolotl.java +++ b/net/minecraft/world/entity/animal/axolotl/Axolotl.java -@@ -157,6 +157,13 @@ public class Axolotl extends Animal implements Bucketable { +@@ -156,6 +156,13 @@ public class Axolotl extends Animal implements Bucketable { } // Purpur end - Toggle for water sensitive mob damage @@ -41,10 +41,10 @@ index a3a98df8ffeb33d86330b5561252eda596642da8..85986d2dc0c12a34f990e4262f79f813 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 e85c33e4d0d19d4e7f8ef837ec0a611e19bc19e4..15b48d4b8de0eb2e59667aee9e62c254995e5600 100644 +index df53953b532ebb4cdc78ea1e1cab0b0ed48ce960..d344b4bb8515fb66d1ed33a0e6870c96927e6c72 100644 --- a/net/minecraft/world/entity/animal/bee/Bee.java +++ b/net/minecraft/world/entity/animal/bee/Bee.java -@@ -502,6 +502,13 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { +@@ -501,6 +501,13 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob { } // Purpur end - Toggle for water sensitive mob damage @@ -95,7 +95,7 @@ index cdd404f64e196629dd61035675aac984619f1e1c..8e90f9163bcd93691bb40d1db02e0638 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 d3e5e12c4e3c168a3a15d611f8ae5845ee365080..07a1df530fcd5d684cbba4414ea0fa2010cbdb5b 100644 +index 9bdc0bb89e554957c70d97e6ca60f1c4aa1ef91b..39595cc7d2a74e067beb9c9f9c07c941d34b10ed 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 { @@ -113,7 +113,7 @@ index d3e5e12c4e3c168a3a15d611f8ae5845ee365080..07a1df530fcd5d684cbba4414ea0fa20 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 0cab39846b6ad5d0e0ce627d6a84f73340fcd328..5e966f61ab5a48c6fc7168af3680ab3133d89365 100644 +index 58ce1ab82ab9883853eeffd103a1b72053c59798..048deece8e45f51d3bad36ef0afd39847086aa9f 100644 --- a/net/minecraft/world/entity/animal/dolphin/Dolphin.java +++ b/net/minecraft/world/entity/animal/dolphin/Dolphin.java @@ -169,6 +169,13 @@ public class Dolphin extends AgeableWaterCreature { @@ -167,7 +167,7 @@ index 64603ad973bdb697ca75642e8e42e7052efd4191..5d643be94db358e4093cbb00659a4e90 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 c56d6f3a8a0c5a95da49ab34c72659872259a723..6a59ee64c539c36633ad23c1bcc53cec9426bce5 100644 +index 4b7a9c76df89cb0494db9375940bc219093f04c1..36cc05946f0760eb7b5f3523e12a58a836161e87 100644 --- a/net/minecraft/world/entity/animal/equine/Llama.java +++ b/net/minecraft/world/entity/animal/equine/Llama.java @@ -165,6 +165,13 @@ public class Llama extends AbstractChestedHorse implements RangedAttackMob { @@ -203,7 +203,7 @@ index 291176b409097d15c2afff7fe8deb17ba07dbc12..8425956ded89a1ffe5a56f410f155092 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 9365609fad67377ffe18e11c7959e0d92367852a..16b26b4c19681b48fef9110e050145c736097adb 100644 +index 02aa9a838e0cbd62bc0a2e0f30e0cfc9a3995a41..ed25701549c7453be446b29b9f08d2093388e679 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 { @@ -257,7 +257,7 @@ index 426b468ee821a7441d15dae3634032535cb60725..54cbd5136997bdec34df0f822e21ffe5 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 966b2cbc5b4f71d2cfa8759c2263407ee73c3d8e..d28e2ed6e08b708a8eb17645c8406b5d04110500 100644 +index 609cf964f5020728321da2e08ccd94dc925cc4c7..007e1ed1eae0d04a086bd7682351638d3d65a90d 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 { @@ -329,7 +329,7 @@ index a0f1ea76011dc3aa6e8a702528062f5fafe07e01..a6ac30e39b15493cdee194a79d744d85 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 ba75ba1130c4fe5f4d7b29c624a17becd2a71c99..ca5cc7569205b450e53d6e8feb87ecaa2169a67f 100644 +index ddf23647e17bdb04babae1832486efb52ab9f81a..97d8471bd04a6098653dbfbd07dbea97aeafc821 100644 --- a/net/minecraft/world/entity/animal/fish/Salmon.java +++ b/net/minecraft/world/entity/animal/fish/Salmon.java @@ -67,6 +67,13 @@ public class Salmon extends AbstractSchoolingFish { @@ -347,7 +347,7 @@ index ba75ba1130c4fe5f4d7b29c624a17becd2a71c99..ca5cc7569205b450e53d6e8feb87ecaa 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 17bc569bf97026e2c072633f1ad6e9e0102c137a..fc500f1ca1d4280519f418cac21688c3632d251b 100644 +index dc2800dd2f4c9f71c79d9f012be17398263d033d..adb530b59ce6080e281aad21e2165fd1cea5b561 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 { @@ -365,10 +365,10 @@ index 17bc569bf97026e2c072633f1ad6e9e0102c137a..fc500f1ca1d4280519f418cac21688c3 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 c70e04d20e37b7063618805016d24a459ee65c91..66001fb6a7264e70f3172ea50c97d0a26214a5fd 100644 +index e74adaebbf28247e8bc85671ca294c9d9843ca08..ea23a64654ebaaf97fe9e5c0eab0f31f54d94d22 100644 --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java -@@ -215,6 +215,13 @@ public class Fox extends Animal { +@@ -214,6 +214,13 @@ public class Fox extends Animal { } // Purpur end - Toggle for water sensitive mob damage @@ -383,7 +383,7 @@ index c70e04d20e37b7063618805016d24a459ee65c91..66001fb6a7264e70f3172ea50c97d0a2 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 24cccc6afadfc91feb6157882c1b76da0d3657d1..ae262e0956a7f468d01a669f827f0c08142804fa 100644 +index ea0aace589356cb2719925d5287bc5672eb45993..88e672d51a8b7b74e7760529ed3fdb8835be795e 100644 --- a/net/minecraft/world/entity/animal/goat/Goat.java +++ b/net/minecraft/world/entity/animal/goat/Goat.java @@ -131,6 +131,13 @@ public class Goat extends Animal { @@ -401,7 +401,7 @@ index 24cccc6afadfc91feb6157882c1b76da0d3657d1..ae262e0956a7f468d01a669f827f0c08 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 078cb2f09e9aaf05bb965a27b90f34c7c3a4147d..019aec1465be095edff6952a1f36041f030f7cb0 100644 +index ac416c47f86b2ec4c8c58a24491b81504e3a8212..eb93463395c8a580faa7c5d0aaa8bf11cdd05f2d 100644 --- a/net/minecraft/world/entity/animal/golem/CopperGolem.java +++ b/net/minecraft/world/entity/animal/golem/CopperGolem.java @@ -151,6 +151,13 @@ public class CopperGolem extends AbstractGolem implements ContainerUser, Shearab @@ -419,7 +419,7 @@ index 078cb2f09e9aaf05bb965a27b90f34c7c3a4147d..019aec1465be095edff6952a1f36041f 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 77996312597da9a2bbcf89f798c10a0be0abcd39..880a53a2f023f5bd4a112a964aceee6dcac109b1 100644 +index 305b6b9b5575c9351990d36f3bd2e9721a00dc2b..fa1fb6251e1a50517a2282a933a67cc192570edb 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 { @@ -455,10 +455,10 @@ index 2d3127f6846ff9eda1a0b89764dc837da6e7e0c7..ffb0e9cc4f8604fd03cb3a2412001182 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 a73d8d3eb04602eac78f142c336e464de22ecc83..aed715317114374213bfb60b18a5bf57632459f8 100644 +index 2ab9e28e84193ea76e09008a230fbdeb5acbf4c1..790b061344b9e3c500a388bddd158bc4221fb41d 100644 --- a/net/minecraft/world/entity/animal/happyghast/HappyGhast.java +++ b/net/minecraft/world/entity/animal/happyghast/HappyGhast.java -@@ -168,6 +168,13 @@ public class HappyGhast extends Animal { +@@ -167,6 +167,13 @@ public class HappyGhast extends Animal { } // Purpur end - Toggle for water sensitive mob damage @@ -509,10 +509,10 @@ index ab97449bfa5e8b5615e0f2b6b16be2fe7e4233fd..869cec108d33626362400e9aa4890a92 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 2f9f588c384d133f82bb4b2d08c8f7c7a72c0915..0480c5851ff94e095bc54106051d0ca4d2db82e0 100644 +index 4249aff88a1768f2f2184a09efe730752545b164..f509b3a3a8f1021d5292ec6ed0a6a91e09787754 100644 --- a/net/minecraft/world/entity/animal/panda/Panda.java +++ b/net/minecraft/world/entity/animal/panda/Panda.java -@@ -160,6 +160,13 @@ public class Panda extends Animal { +@@ -159,6 +159,13 @@ public class Panda extends Animal { } // Purpur end - Toggle for water sensitive mob damage @@ -527,7 +527,7 @@ index 2f9f588c384d133f82bb4b2d08c8f7c7a72c0915..0480c5851ff94e095bc54106051d0ca4 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 d756d6931dbf560fef5cb9641ace6f091fbcfff9..5abbc7ef864dde0ae05ae0520518997520e8bcf6 100644 +index 0f5da739a7bed82a1ccef173d379a78981f37939..6df09c069c56fdcea4d44423d2c8cdba088ea305 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 { @@ -545,7 +545,7 @@ index d756d6931dbf560fef5cb9641ace6f091fbcfff9..5abbc7ef864dde0ae05ae05205189975 public @Nullable SpawnGroupData finalizeSpawn( 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 05141bc41dc5181a8f0526528147e7a6c015a707..d699b79ffc603555213434fecc389b1882c1eef0 100644 +index 5413851446237e7984c8da4172c31b0dd9affc60..93ebe564d7ee8220c624058e4ae1d5ae6aa59e5d 100644 --- a/net/minecraft/world/entity/animal/pig/Pig.java +++ b/net/minecraft/world/entity/animal/pig/Pig.java @@ -107,6 +107,13 @@ public class Pig extends Animal implements ItemSteerable { @@ -563,10 +563,10 @@ index 05141bc41dc5181a8f0526528147e7a6c015a707..d699b79ffc603555213434fecc389b18 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 2a28c9ef361909aa0c3946ed6857f7d340c8cfc0..5e218adce80f2d8d64cca54894abffaf6eb0baa0 100644 +index a9e64a4053755050099cdcaef870a0099a867575..ee3bc947ef81ea27b02135c0f0ea6d6168ca9fbd 100644 --- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java +++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java -@@ -141,6 +141,13 @@ public class PolarBear extends Animal implements NeutralMob { +@@ -140,6 +140,13 @@ public class PolarBear extends Animal implements NeutralMob { } // Purpur end - Toggle for water sensitive mob damage @@ -581,7 +581,7 @@ index 2a28c9ef361909aa0c3946ed6857f7d340c8cfc0..5e218adce80f2d8d64cca54894abffaf 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 7dade80db9430e4db587ed23df992d70c6b7ee04..937ce47e45698392fad3fdc6eeb85e7869b679de 100644 +index 9116e659fff5daf09257739f6c04e32d1dfc70ca..a6ccaafe6c025bda6b82be87ff4689117cc7fbf3 100644 --- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java +++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java @@ -184,6 +184,13 @@ public class Rabbit extends Animal { @@ -635,7 +635,7 @@ index 1fa3d614dd1c45ec42caffbe92e3f8db02b399b1..0f4587df333a68627d6db18c0583ae1e 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 8b26b08956e63d3ccb9a7006cfa57ac3771339ad..3f197daef44cafb00390d0e429eceae8505d9c1d 100644 +index 2b2272122a7ebaed6a995d09dab7a3db3ee0c594..d3809367a849ac56a0e57b5b2af01695d5a30193 100644 --- a/net/minecraft/world/entity/animal/squid/Squid.java +++ b/net/minecraft/world/entity/animal/squid/Squid.java @@ -111,6 +111,13 @@ public class Squid extends AgeableWaterCreature { @@ -671,10 +671,10 @@ index 6d09c0de38f2c91d2a0ab6dd0b694ab42b48a981..37345edf599a43ac48274e30f5d7aa34 this.homePos = pos; } diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java -index cd7981c9c040e1b745e08680bf3685903cbda8ff..12f7874e28ae964c7d68bee4a4c3ac0a47b369ba 100644 +index 1587bcafa4b338a98e60743faab0b2ce9b923444..cf7e5a02b83dcf7d5d2b6121ebee0940600ebbba 100644 --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -227,6 +227,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { +@@ -226,6 +226,13 @@ public class Wolf extends TamableAnimal implements NeutralMob { } // Purpur end - Toggle for water sensitive mob damage @@ -689,10 +689,10 @@ index cd7981c9c040e1b745e08680bf3685903cbda8ff..12f7874e28ae964c7d68bee4a4c3ac0a 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 5e206030d9ccabbefe9c64332125526030d65750..a94d2d9bc5a5795a0c88348a61dff936d31d12b5 100644 +index 2a88f051740bba72bb48e7f23cbd12d216a2eb86..a043a320afc2d6e4780bb7382e0c4d0bd1d12ea8 100644 --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -229,6 +229,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { +@@ -228,6 +228,13 @@ public class WitherBoss extends Monster implements RangedAttackMob { } // Purpur end - Toggle for water sensitive mob damage @@ -725,7 +725,7 @@ index 7f0e76437798f1bab7956722382e1517f8f71121..257563b578762837cbea855fa42831f3 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 80327a6ba1da0145f087a7946c7a4dfb6d947ce7..46a769f2960fd4a35305231b84c56ff36d622d8f 100644 +index 2d60c5e6426097302464e04bcfdd60abd08b96b9..56cfc2b7cf9bd7edc966f59de091d2793c6adfb3 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 { @@ -761,7 +761,7 @@ index a98967c7a76d8e25da9e31eaa8f2ae0bf0704c9d..54d3ab3cb7521f4f75bdd05b7fcf35e7 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 8862ad857a4c99defe7621c59d8f3ef77ab7aff4..8979340756abaec961b2263146c1e1e79d144117 100644 +index 2b02becb39f89ca02e42cf9e3df6cbfa8eba800f..d1903b7804880c4b3b2ccf6a6dbc85a62975deb1 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 8862ad857a4c99defe7621c59d8f3ef77ab7aff4..8979340756abaec961b2263146c1e1e7 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 859d490dd3be2843dde3a811bcc0d51e3eae76f0..b93a5d46ccf7b2dad6afbd15884f8d8ae60cdb5a 100644 +index 099476663f734f00b4979de7c2d0f13da5bf4909..3729137f6fa1bc2c8b886a02e8604918bd961e72 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 859d490dd3be2843dde3a811bcc0d51e3eae76f0..b93a5d46ccf7b2dad6afbd15884f8d8a 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 64800fe5cfb3488b63126ed09f1f678d6ebd1d3b..b87ee7a7b92f49b72151019bf05995a6843ec7fa 100644 +index 14c5c70853bc8bef677c12f7e1884f472c293609..2a7960e4b431c4c1d4c10daea092e52f51cf3623 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 { @@ -833,7 +833,7 @@ index 43ebfe06ce2a8c15787d72a8ef54cd6c7cac2bfc..07dfe0e6fd431b8417fc7f823962e4d4 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 ea7e6a1b4dad1b702ddc5b6004c5ebdfd541334d..520e9e7e99c03f07087bd51d19db730aa98cd6b9 100644 +index 3acf963c26ef5f269a95cdf8fe0da248adf22c83..61a5a7c77a53c29de8a9e61f6cbc68eb50142b3a 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 { @@ -869,10 +869,10 @@ index fba41f261e57a050d4e24d2611cc27edcbb84ddf..4e757fc7d49c22f79eceafc02ff05da5 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 0f1081b448ce03498b471f7d3c2ff63deee13268..05ae5d0a41cf0f3c4bb2da1395e64b31f45418ae 100644 +index 356f5c6e5534b1b36bcb5c44021e0e48194fb645..31f668c097db2986c29dadc042de2e90ff684780 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -137,6 +137,13 @@ public class Phantom extends Mob implements Enemy { +@@ -136,6 +136,13 @@ public class Phantom extends Mob implements Enemy { } // Purpur end - Toggle for water sensitive mob damage @@ -905,10 +905,10 @@ index 3e0403635cb9ce3d0894705db6727d9a7cc4d628..700799d2cedea989ac60d7c5dfc563c9 protected void registerGoals() { super.registerGoals(); diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java -index 67aa12ee4a58e7cd31efb47cd1d71eaa2cc6af7d..0224a0dca4432fa33262ffa7152eb228a88c20d5 100644 +index 8e33c702bf4b6a2ad2af8e730f9fecef579ab2ad..44a2809ca8603228e19a0e0cde50c6a64ebc412e 100644 --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -142,6 +142,13 @@ public class Shulker extends AbstractGolem implements Enemy { +@@ -141,6 +141,13 @@ public class Shulker extends AbstractGolem implements Enemy { } // Purpur end - Toggle for water sensitive mob damage @@ -923,7 +923,7 @@ index 67aa12ee4a58e7cd31efb47cd1d71eaa2cc6af7d..0224a0dca4432fa33262ffa7152eb228 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 205c05f46d70d37e11a0e35c97128e0c20b94e23..b45f8eb2bd1d9b3c91716bf329febe92620e315f 100644 +index e6bc3451f2f5921c5f8773749962b4334328ac88..8fe686109b7b4fb900c0f61db5de282496470f68 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 { @@ -959,7 +959,7 @@ index 834125d0ded28a1d7a39a3e5fcf6a5bb967c7f91..0636fdf31330da5523b9ad11869776a2 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 1b6137674d807ed29d56e3f3120abe60254274e1..7c05c394138699c199e2044325d294826796217c 100644 +index eacbaa4a9c9eb30a29eade20b31860f9ec6e1a69..5528ef9fab00cc65f7c36f8f87b458c33515ae04 100644 --- a/net/minecraft/world/entity/monster/Strider.java +++ b/net/minecraft/world/entity/monster/Strider.java @@ -125,6 +125,13 @@ public class Strider extends Animal implements ItemSteerable { @@ -977,10 +977,10 @@ index 1b6137674d807ed29d56e3f3120abe60254274e1..7c05c394138699c199e2044325d29482 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 917f256f072ba29ae77e4976dd4d49ffcb2a0e35..d280201dfdd5c6114a00d5d245d839d271177854 100644 +index 838edcb5267268fadfc913ea71f3fb4adbe94209..6ddd7d1d0ad8fa49a9e687137a06e9069db7889d 100644 --- a/net/minecraft/world/entity/monster/Vex.java +++ b/net/minecraft/world/entity/monster/Vex.java -@@ -118,6 +118,13 @@ public class Vex extends Monster implements TraceableEntity { +@@ -117,6 +117,13 @@ public class Vex extends Monster implements TraceableEntity { } // Purpur end - Toggle for water sensitive mob damage @@ -1049,10 +1049,10 @@ index d001cf955dba66435079eb2cc30e05aec963d2c6..b8c764cc274f43073a460a4c8643e0cb 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 a766f1139459488accd0d720be3ff522e88c3d09..c5d56a3c2dff087453d56821ef6c4d75c1274613 100644 +index fe67813da3b3be09dad8f99a68685448b33fa5a9..16792e45655df1ec96732f4d097f3803d4dafde8 100644 --- a/net/minecraft/world/entity/monster/illager/Evoker.java +++ b/net/minecraft/world/entity/monster/illager/Evoker.java -@@ -82,6 +82,13 @@ public class Evoker extends SpellcasterIllager { +@@ -81,6 +81,13 @@ public class Evoker extends SpellcasterIllager { } // Purpur end - Toggle for water sensitive mob damage @@ -1067,10 +1067,10 @@ index a766f1139459488accd0d720be3ff522e88c3d09..c5d56a3c2dff087453d56821ef6c4d75 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 32b8f638ea26494cae648f4bb48a664ce2a5021e..fefb7927cb9b906e00b68f43e947504dec97f52e 100644 +index bfd1a61d43fcc1293592a6199d7bab0346f40c7f..05c0a84a2eb41ab9c19fd95e6745037d36aefc70 100644 --- a/net/minecraft/world/entity/monster/illager/Illusioner.java +++ b/net/minecraft/world/entity/monster/illager/Illusioner.java -@@ -94,6 +94,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { +@@ -93,6 +93,13 @@ public class Illusioner extends SpellcasterIllager implements RangedAttackMob { } // Purpur end - Toggle for water sensitive mob damage @@ -1121,7 +1121,7 @@ index aab0bd86da31ca73efc4988fa34c906886139ec3..c29a1aea5c09ade40e36f4cb00a677b3 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 de86e23b377ca0727d5f5234f2bc63180ddbbad2..47bcb895bf4c6f438bb0bb82f84331487fd28c0c 100644 +index 21674f5ee9bd89bfbcf36f43ba728a692934a886..bbdf01c5ab0b0eee4773d4ca690dc3c4fa3ec202 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -140,6 +140,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -1193,7 +1193,7 @@ index 64dc2a04bb2ae4dc63083a24c48f671bfc8ff8ea..76f28568aecf019ce7432ff89593b2ed 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 f1cf1d01a497fc46d201ad403b459f9886059d0f..3c3c53de82856033aab31c6b03e90ba647223fa7 100644 +index 2f3ff6eeae3103248512afb8cfd745f3e08c3eaf..c3f09863893933580caa07b8b9cdfd08ad5a0978 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 { @@ -1247,7 +1247,7 @@ index 467ea1fd09b94747a03aaadd28a107d983afeb01..8396b9d6b41e381e040ee71e7fe04ad2 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 e4769eeacc3ac97f90acb5ed0127990466c8d886..07242b2e6ab055122360035f058c39d54dbb8dc7 100644 +index 3828001bed19114c23e5099c3716837f4d2c2314..d7652cc26a9e3db010a7d05f0931d78b9a53b20c 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 { @@ -1283,10 +1283,10 @@ index 02e935edd7a6cabbf2e6fcc6c96a9601bee71acc..5d60b230eeaec9d37e286019b8d4276c 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 f8eccfab70e7d99dd74965a506837e620515b6d1..cb1a685b136f06ab5884c269678cc9384af1dfed 100644 +index 92be49434eb76fa0774864af73b0a460f49b6a32..09fda2f96f2c4024e35ef23c482097b7c055b936 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -160,6 +160,13 @@ public class Zombie extends Monster { +@@ -159,6 +159,13 @@ public class Zombie extends Monster { } // Purpur end - Toggle for water sensitive mob damage @@ -1337,7 +1337,7 @@ index 6cc4d4729520c60b98d45d5e7dd674e599616505..9e893c0c033dcc2273275b92048d9b1a 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 033c9322234378c46e9a6e549d04f32135243ed9..f439a0b0830e74be8c123a5b2e55933671715f74 100644 +index fd0b329f56fa78d05be5348b42f3542fff7ebbe4..c841d627254da95b786469108adb2b7f89355954 100644 --- a/net/minecraft/world/entity/npc/villager/Villager.java +++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -291,6 +291,13 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re @@ -1355,10 +1355,10 @@ index 033c9322234378c46e9a6e549d04f32135243ed9..f439a0b0830e74be8c123a5b2e559336 public Brain 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 cbbfa09d53ada7c39e9504d28770867989eaa5c1..47ee1521e25c987fce6da0bd981371a7e835d565 100644 +index b6e16bcfff9a74fdd2109d4a442344c07692c3d1..35a2e2018f987d2fb63380d7a6b1e5bcad3a09d1 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 +@@ -105,6 +105,13 @@ public class WanderingTrader extends AbstractVillager implements Consumable.Over } // Purpur end - Toggle for water sensitive mob damage diff --git a/purpur-server/minecraft-patches/features/0020-Setting-to-reintroduce-end-void-rings.patch b/purpur-server/minecraft-patches/features/0020-Setting-to-reintroduce-end-void-rings.patch index 83c124d6d..0dd343809 100644 --- a/purpur-server/minecraft-patches/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 07d3c51b80c251da74aba87bdbf9ac74650b83e5..761acf1c9cae98fc8d7699685824f561352a8f66 100644 +index 838898572cc30207a1b915dcea11f612254ac453..d2a5a1293f276aab3136c4563d778d0d79c7ff29 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1361,6 +1361,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 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 66001fb6a7264e70f3172ea50c97d0a26214a5fd..af9f37fe2ed01487ed796afb163aa624ca2f1e0a 100644 +index ea23a64654ebaaf97fe9e5c0eab0f31f54d94d22..f286089eca3b6e9c72f1b954b872c8673a717b7a 100644 --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java -@@ -815,6 +815,13 @@ public class Fox extends Animal { +@@ -814,6 +814,13 @@ public class Fox extends Animal { } // Purpur end - Tulips change fox type @@ -103,7 +103,7 @@ index c29a1aea5c09ade40e36f4cb00a677b31ad91069..d4e298ecf79ff7ebdea71b710e6df7ba 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 47bcb895bf4c6f438bb0bb82f84331487fd28c0c..93c5fa7b63548c6b1d24847f1f363c7c9e0ea0ec 100644 +index bbdf01c5ab0b0eee4773d4ca690dc3c4fa3ec202..b14fd101ba647ca99211a42b142d2d80975a9e38 100644 --- a/net/minecraft/world/entity/monster/piglin/Piglin.java +++ b/net/minecraft/world/entity/monster/piglin/Piglin.java @@ -147,6 +147,13 @@ public class Piglin extends AbstractPiglin implements CrossbowAttackMob, Invento @@ -202,7 +202,7 @@ index 76f28568aecf019ce7432ff89593b2ed4eaff8a2..e761c97212e380b6978e5fbd1d808f4d 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 3c3c53de82856033aab31c6b03e90ba647223fa7..afc6272905cf6ab464cca03b37b5e6c868094796 100644 +index c3f09863893933580caa07b8b9cdfd08ad5a0978..ddb189a3fb144bf84097aee9c3e45dafc88c593d 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,7 +220,7 @@ index 3c3c53de82856033aab31c6b03e90ba647223fa7..afc6272905cf6ab464cca03b37b5e6c8 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 07242b2e6ab055122360035f058c39d54dbb8dc7..3a1152e07b2cc0ee4cf84651ada3c987dc704e91 100644 +index d7652cc26a9e3db010a7d05f0931d78b9a53b20c..4801c6987740f846a3049bfa0fcac547183e3f13 100644 --- a/net/minecraft/world/entity/monster/zombie/Drowned.java +++ b/net/minecraft/world/entity/monster/zombie/Drowned.java @@ -147,6 +147,13 @@ public class Drowned extends Zombie implements RangedAttackMob { @@ -256,10 +256,10 @@ index 5d60b230eeaec9d37e286019b8d4276cfa85a9ea..55b2bd676f2e9633fc8250bcd984424e 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 cb1a685b136f06ab5884c269678cc9384af1dfed..a0b1399d8ea3aeb583dd0c0f1b5ec6300eacf28d 100644 +index 09fda2f96f2c4024e35ef23c482097b7c055b936..04ba29b8864804899e19b08b1952df781c96a23e 100644 --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -167,6 +167,13 @@ public class Zombie extends Monster { +@@ -166,6 +166,13 @@ public class Zombie extends Monster { } // Purpur end - Mobs always drop experience @@ -310,7 +310,7 @@ index 9e893c0c033dcc2273275b92048d9b1a941d93f2..54ba4d2e8305e2d9ba0c9e71bae67bfd 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 639941474d8219273a318ebad22423ae7176c67a..b8817f5791560e8b1f8297eed7f932bb5c3d0974 100644 +index c841d627254da95b786469108adb2b7f89355954..0503f9aa01099ebb807c3b6ccfe88f9610cc36b5 100644 --- a/net/minecraft/world/entity/npc/villager/Villager.java +++ b/net/minecraft/world/entity/npc/villager/Villager.java @@ -298,6 +298,13 @@ public class Villager extends AbstractVillager implements VillagerDataHolder, Re @@ -328,10 +328,10 @@ index 639941474d8219273a318ebad22423ae7176c67a..b8817f5791560e8b1f8297eed7f932bb public Brain getBrain() { return (Brain) super.getBrain(); diff --git a/net/minecraft/world/entity/raid/Raider.java b/net/minecraft/world/entity/raid/Raider.java -index f37216b7f2d094ba98ea5eb004b599ad6dd8697d..0942992a5036458e98233450f465fe3bab523663 100644 +index 869af8dffe56a52ea1406a6598df733f724ee654..7eeb25f068d77095dbd35e5f9c079a78f24538fe 100644 --- a/net/minecraft/world/entity/raid/Raider.java +++ b/net/minecraft/world/entity/raid/Raider.java -@@ -400,7 +400,7 @@ public abstract class Raider extends PatrollingMonster { +@@ -397,7 +397,7 @@ public abstract class Raider extends PatrollingMonster { } private boolean cannotPickUpBanner() { @@ -339,4 +339,4 @@ index f37216b7f2d094ba98ea5eb004b599ad6dd8697d..0942992a5036458e98233450f465fe3b + if (!getServerLevel(this.mob).getGameRules().get(net.minecraft.world.level.gamerules.GameRules.MOB_GRIEFING, this.mob.level().purpurConfig.pillagerCanPickUpLoot)) return true; // Paper - respect game and entity rules for picking up items // Purpur - Check mobGriefing Overrides if (!this.mob.hasActiveRaid()) { return true; - } else if (this.mob.getCurrentRaid().isOver()) { + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/CrashReport.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/CrashReport.java.patch index 935faf03f..e5d6ab21a 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/CrashReport.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/CrashReport.java.patch @@ -8,7 +8,7 @@ public CrashReport(final String title, final Throwable t) { this.title = title; -@@ -129,7 +_,7 @@ +@@ -126,7 +_,7 @@ } public String getFriendlyReport(final ReportType reportType) { @@ -17,7 +17,7 @@ } public @Nullable Path getSaveFile() { -@@ -159,7 +_,7 @@ +@@ -156,7 +_,7 @@ } public boolean saveToFile(final Path file, final ReportType reportType) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/commands/Commands.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/commands/Commands.java.patch index ae21764c0..7944d15e3 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/commands/Commands.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/commands/Commands.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/commands/Commands.java +++ b/net/minecraft/commands/Commands.java -@@ -268,11 +_,11 @@ +@@ -267,11 +_,11 @@ JfrCommand.register(this.dispatcher); } @@ -14,7 +14,7 @@ RaidCommand.register(this.dispatcher, context); DebugPathCommand.register(this.dispatcher); DebugMobSpawningCommand.register(this.dispatcher); -@@ -300,6 +_,14 @@ +@@ -299,6 +_,14 @@ StopCommand.register(this.dispatcher); TransferCommand.register(this.dispatcher); WhitelistCommand.register(this.dispatcher); @@ -29,7 +29,7 @@ } if (commandSelection.includeIntegrated) { -@@ -522,6 +_,7 @@ +@@ -521,6 +_,7 @@ private void runSync(ServerPlayer player, java.util.Collection bukkit, RootCommandNode root) { // Paper end - Perf: Async command map building new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent(player.getBukkitEntity(), (RootCommandNode) root, true).callEvent(); // Paper - Brigadier API @@ -37,7 +37,7 @@ org.bukkit.event.player.PlayerCommandSendEvent event = new org.bukkit.event.player.PlayerCommandSendEvent(player.getBukkitEntity(), new java.util.LinkedHashSet<>(bukkit)); event.getPlayer().getServer().getPluginManager().callEvent(event); -@@ -532,6 +_,8 @@ +@@ -531,6 +_,8 @@ } } // CraftBukkit end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/commands/arguments/selector/EntitySelector.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/commands/arguments/selector/EntitySelector.java.patch index 7e2801498..ab6dfc19b 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/commands/arguments/selector/EntitySelector.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/commands/arguments/selector/EntitySelector.java.patch @@ -1,38 +1,42 @@ --- a/net/minecraft/commands/arguments/selector/EntitySelector.java +++ b/net/minecraft/commands/arguments/selector/EntitySelector.java -@@ -206,26 +_,27 @@ +@@ -210,30 +_,31 @@ this.checkPermissions(sender); if (this.playerName != null) { ServerPlayer result = sender.getServer().getPlayerList().getPlayerByName(this.playerName); - return result == null ? List.of() : List.of(result); + return result == null || !canSee(sender, result) ? List.of() : List.of(result); // Purpur - Hide hidden players from entity selector - } else if (this.entityUUID != null) { + } + + if (this.entityUUID != null) { ServerPlayer result = sender.getServer().getPlayerList().getPlayer(this.entityUUID); - return result == null ? List.of() : List.of(result); + return result == null || !canSee(sender, result) ? List.of() : List.of(result); // Purpur - Hide hidden players from entity selector - } else { - Vec3 pos = this.position.apply(sender.getPosition()); - AABB absoluteAabb = this.getAbsoluteAabb(pos); - Predicate predicate = this.getPredicate(pos, absoluteAabb, null); - if (this.currentEntity) { -- return sender.getEntity() instanceof ServerPlayer player && predicate.test(player) ? List.of(player) : List.of(); -+ return sender.getEntity() instanceof ServerPlayer player && predicate.test(player) && canSee(sender, player) ? List.of(player) : List.of(); // Purpur - Hide hidden players from entity selector - } else { - int limit = this.getResultLimit(); - List result; - if (this.isWorldLimited()) { - result = sender.getLevel().getPlayers(predicate, limit); -+ result.removeIf(entityplayer3 -> !canSee(sender, entityplayer3)); // Purpur - Hide hidden players from entity selector - } else { - result = new ObjectArrayList<>(); + } - for (ServerPlayer player : sender.getServer().getPlayerList().getPlayers()) { -- if (predicate.test(player)) { -+ if (predicate.test(player) && canSee(sender, player)) { // Purpur - Hide hidden players from entity selector - result.add(player); - if (result.size() >= limit) { - return result; -@@ -283,4 +_,10 @@ + Vec3 pos = this.position.apply(sender.getPosition()); + AABB absoluteAabb = this.getAbsoluteAabb(pos); + Predicate predicate = this.getPredicate(pos, absoluteAabb, null); + if (this.currentEntity) { +- return sender.getEntity() instanceof ServerPlayer player && predicate.test(player) ? List.of(player) : List.of(); ++ return sender.getEntity() instanceof ServerPlayer player && predicate.test(player) && canSee(sender, player) ? List.of(player) : List.of(); // Purpur - Hide hidden players from entity selector + } + + int limit = this.getResultLimit(); + List result; + if (this.isWorldLimited()) { + result = sender.getLevel().getPlayers(predicate, limit); ++ result.removeIf(entityplayer3 -> !canSee(sender, entityplayer3)); // Purpur - Hide hidden players from entity selector + } else { + result = new ObjectArrayList<>(); + + for (ServerPlayer player : sender.getServer().getPlayerList().getPlayers()) { +- if (predicate.test(player)) { ++ if (predicate.test(player) && canSee(sender, player)) { // Purpur - Hide hidden players from entity selector + result.add(player); + if (result.size() >= limit) { + return result; +@@ -289,4 +_,10 @@ public static Component joinNames(final List entities) { return ComponentUtils.formatList(entities, Entity::getDisplayName); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/DispenseItemBehavior.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/DispenseItemBehavior.java.patch index 57d2a55eb..5e753adf2 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/DispenseItemBehavior.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/DispenseItemBehavior.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/core/dispenser/DispenseItemBehavior.java +++ b/net/minecraft/core/dispenser/DispenseItemBehavior.java -@@ -691,5 +_,22 @@ +@@ -683,5 +_,22 @@ DispenserBlock.registerBehavior(Items.TNT_MINECART, new MinecartDispenseItemBehavior(EntityType.TNT_MINECART)); DispenserBlock.registerBehavior(Items.HOPPER_MINECART, new MinecartDispenseItemBehavior(EntityType.HOPPER_MINECART)); DispenserBlock.registerBehavior(Items.COMMAND_BLOCK_MINECART, new MinecartDispenseItemBehavior(EntityType.COMMAND_BLOCK_MINECART)); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/EquipmentDispenseItemBehavior.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/EquipmentDispenseItemBehavior.java.patch index bfc31c584..93d2f36d9 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/EquipmentDispenseItemBehavior.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/core/dispenser/EquipmentDispenseItemBehavior.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/core/dispenser/EquipmentDispenseItemBehavior.java +++ b/net/minecraft/core/dispenser/EquipmentDispenseItemBehavior.java -@@ -31,7 +_,7 @@ - return false; - } else { - LivingEntity target = entities.getFirst(); -- EquipmentSlot slot = target.getEquipmentSlotForItem(dispensed); -+ EquipmentSlot slot = source.level().purpurConfig.dispenserApplyCursedArmor ? target.getEquipmentSlotForItem(dispensed) : target.getEquipmentSlotForDispenserItem(dispensed); if (slot == null) return false; // Purpur - Dispenser curse of binding protection - ItemStack equip = dispensed.copyWithCount(1); // Paper - shrink below and single item in event - // CraftBukkit start - net.minecraft.world.level.Level world = source.level(); +@@ -32,7 +_,7 @@ + } + + LivingEntity target = entities.getFirst(); +- EquipmentSlot slot = target.getEquipmentSlotForItem(dispensed); ++ EquipmentSlot slot = source.level().purpurConfig.dispenserApplyCursedArmor ? target.getEquipmentSlotForItem(dispensed) : target.getEquipmentSlotForDispenserItem(dispensed); if (slot == null) return false; // Purpur - Dispenser curse of binding protection + ItemStack equip = dispensed.copyWithCount(1); // Paper - shrink below and single item in event + // CraftBukkit start + net.minecraft.world.level.Level world = source.level(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/gametest/framework/GameTestHelper.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/gametest/framework/GameTestHelper.java.patch index 9a00c1a08..9387ccf12 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/gametest/framework/GameTestHelper.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/gametest/framework/GameTestHelper.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/gametest/framework/GameTestHelper.java +++ b/net/minecraft/gametest/framework/GameTestHelper.java -@@ -354,6 +_,8 @@ +@@ -352,6 +_,8 @@ return gameType; } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/network/Connection.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/network/Connection.java.patch index 2d95e190f..fbf7cd3ae 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/network/Connection.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/network/Connection.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/network/Connection.java +++ b/net/minecraft/network/Connection.java -@@ -554,11 +_,20 @@ +@@ -552,11 +_,20 @@ private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - Buffer joins to world private static int joinAttemptsThisTick; // Paper - Buffer joins to world private static int currTick; // Paper - Buffer joins to world diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/network/chat/SignedMessageChain.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/network/chat/SignedMessageChain.java.patch index 924aea872..fa51e80e6 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/network/chat/SignedMessageChain.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/network/chat/SignedMessageChain.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/network/chat/SignedMessageChain.java +++ b/net/minecraft/network/chat/SignedMessageChain.java @@ -49,7 +_,7 @@ - SignedMessageLink link = SignedMessageChain.this.nextLink; - if (link == null) { - throw new SignedMessageChain.DecodeException(SignedMessageChain.DecodeException.CHAIN_BROKEN); -- } else if (body.timeStamp().isBefore(SignedMessageChain.this.lastTimeStamp)) { -+ } else if (org.purpurmc.purpur.PurpurConfig.kickForOutOfOrderChat && body.timeStamp().isBefore(SignedMessageChain.this.lastTimeStamp)) { // Purpur - Option to disable kick for out of order chat - this.setChainBroken(); - throw new SignedMessageChain.DecodeException(SignedMessageChain.DecodeException.OUT_OF_ORDER_CHAT, org.bukkit.event.player.PlayerKickEvent.Cause.OUT_OF_ORDER_CHAT); // Paper - kick event causes - } else { + throw new SignedMessageChain.DecodeException(SignedMessageChain.DecodeException.CHAIN_BROKEN); + } + +- if (body.timeStamp().isBefore(SignedMessageChain.this.lastTimeStamp)) { ++ if (org.purpurmc.purpur.PurpurConfig.kickForOutOfOrderChat && body.timeStamp().isBefore(SignedMessageChain.this.lastTimeStamp)) { // Purpur - Option to disable kick for out of order chat + this.setChainBroken(); + throw new SignedMessageChain.DecodeException(SignedMessageChain.DecodeException.OUT_OF_ORDER_CHAT, org.bukkit.event.player.PlayerKickEvent.Cause.OUT_OF_ORDER_CHAT); // Paper - kick event causes + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch index d9480b1e4..a84ddd504 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/MinecraftServer.java.patch @@ -25,7 +25,7 @@ getTPS(this.tickTimes1m, interval), getTPS(this.tickTimes5m, interval), getTPS(this.tickTimes15m, interval) -@@ -1057,6 +_,15 @@ +@@ -1047,6 +_,15 @@ LOGGER.info("Stopping server"); Commands.COMMAND_SENDING_POOL.shutdownNow(); // Paper - Perf: Async command map building; Shutdown and don't bother finishing @@ -41,7 +41,7 @@ // CraftBukkit start if (this.server != null) { this.server.spark.disable(); // Paper - spark -@@ -1151,6 +_,8 @@ +@@ -1141,6 +_,8 @@ this.safeShutdown(wait, false); } public void safeShutdown(final boolean wait, final boolean isRestarting) { @@ -50,7 +50,7 @@ this.isRestarting = isRestarting; this.hasLoggedStop = true; // Paper - Debugging if (this.isDebugging()) io.papermc.paper.util.TraceUtil.dumpTraceForThread("Server stopped"); // Paper - Debugging -@@ -1332,11 +_,21 @@ +@@ -1322,11 +_,21 @@ } // Paper end - Add onboarding message for initial server start // Paper start - Improve outdated version checking @@ -73,7 +73,7 @@ while (this.running) { final long tickStart = System.nanoTime(); // Paper - improve tick loop long thisTickNanos; // Paper - improve tick loop - diff on change, expect this to be tick interval -@@ -1350,9 +_,11 @@ +@@ -1340,9 +_,11 @@ final long ticksBehind = Math.max(1L, this.tickSchedule.getPeriodsAhead(thisTickNanos, tickStart)); final long catchup = (long)Math.max( 1, @@ -86,7 +86,7 @@ // adjust ticksBehind so that it is not greater-than catchup if (ticksBehind - catchup > 0L) { final long difference = ticksBehind - catchup; -@@ -1983,7 +_,7 @@ +@@ -1973,7 +_,7 @@ } public String getServerModName() { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/commands/EnchantCommand.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/commands/EnchantCommand.java.patch index 30fb26fcf..c596793f4 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/commands/EnchantCommand.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/commands/EnchantCommand.java.patch @@ -7,14 +7,14 @@ - if (level > enchantment.getMaxLevel()) { + if (!org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && level > enchantment.getMaxLevel()) { // Purpur - Config to allow unsafe enchants throw ERROR_LEVEL_TOO_HIGH.create(level, enchantment.getMaxLevel()); - } else { - int success = 0; -@@ -77,7 +_,7 @@ - ItemStack item = target.getMainHandItem(); - if (!item.isEmpty()) { - if (enchantment.canEnchant(item) -- && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantmentsForCrafting(item).keySet(), enchantmentHolder)) { -+ && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantmentsForCrafting(item).keySet(), enchantmentHolder) || (org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && !item.hasEnchantment(enchantmentHolder))) { // Purpur - Config to allow unsafe enchants - item.enchant(enchantmentHolder, level); - success++; - } else if (targets.size() == 1) { + } + +@@ -78,7 +_,7 @@ + ItemStack item = target.getMainHandItem(); + if (!item.isEmpty()) { + if (enchantment.canEnchant(item) +- && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantmentsForCrafting(item).keySet(), enchantmentHolder)) { ++ && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantmentsForCrafting(item).keySet(), enchantmentHolder) || (org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && !item.hasEnchantment(enchantmentHolder))) { // Purpur - Config to allow unsafe enchants + item.enchant(enchantmentHolder, level); + success++; + } else if (targets.size() == 1) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/commands/GiveCommand.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/commands/GiveCommand.java.patch index 7b54e64f5..dfe49b9fd 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/commands/GiveCommand.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/commands/GiveCommand.java.patch @@ -1,10 +1,10 @@ --- a/net/minecraft/server/commands/GiveCommand.java +++ b/net/minecraft/server/commands/GiveCommand.java -@@ -61,6 +_,7 @@ - remaining -= size; - ItemStack copyToDrop = prototypeItemStack.copyWithCount(size); - boolean added = player.getInventory().add(copyToDrop); -+ if (org.purpurmc.purpur.PurpurConfig.disableGiveCommandDrops) continue; // Purpur - add config option for toggling give command dropping - if (added && copyToDrop.isEmpty()) { - ItemEntity drop = player.drop(prototypeItemStack.copy(), false, false, false, null); // Paper - do not fire PlayerDropItemEvent for /give command - if (drop != null) { +@@ -62,6 +_,7 @@ + remaining -= size; + ItemStack copyToDrop = prototypeItemStack.copyWithCount(size); + boolean added = player.getInventory().add(copyToDrop); ++ if (org.purpurmc.purpur.PurpurConfig.disableGiveCommandDrops) continue; // Purpur - add config option for toggling give command dropping + if (added && copyToDrop.isEmpty()) { + ItemEntity drop = player.drop(prototypeItemStack.copy(), false, false, false, null); // Paper - do not fire PlayerDropItemEvent for /give command + if (drop != null) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch index 6f848e4c5..b24488c45 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/dedicated/DedicatedServer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/dedicated/DedicatedServer.java +++ b/net/minecraft/server/dedicated/DedicatedServer.java -@@ -216,6 +_,7 @@ +@@ -211,6 +_,7 @@ public void run() { if (!org.bukkit.craftbukkit.Main.useConsole) return; // CraftBukkit // Paper start - Use TerminalConsoleAppender @@ -8,7 +8,7 @@ new com.destroystokyo.paper.console.PaperConsole(DedicatedServer.this).start(); /* BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8)); -@@ -294,6 +_,15 @@ +@@ -289,6 +_,15 @@ io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command this.server.spark.registerCommandBeforePlugins(this.server); // Paper - spark com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics @@ -24,8 +24,8 @@ com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now // this.worldData.setGameType(properties.gameMode.get()); // CraftBukkit - moved to world loading -@@ -336,6 +_,30 @@ - if (true) throw new IllegalStateException("Failed to bind to port", var11); // Paper - Propagate failed to bind to port error +@@ -331,6 +_,30 @@ + if (true) throw new IllegalStateException("Failed to bind to port", e); // Paper - Propagate failed to bind to port error return false; } + // Purpur start - UPnP Port Forwarding @@ -55,13 +55,13 @@ // CraftBukkit start this.server.loadPlugins(); -@@ -410,6 +_,9 @@ - MinecraftServerStatistics.registerJmxMonitoring(this); - LOGGER.info("JMX monitoring enabled"); - } +@@ -406,6 +_,9 @@ + MinecraftServerStatistics.registerJmxMonitoring(this); + LOGGER.info("JMX monitoring enabled"); + } + -+ org.purpurmc.purpur.task.BossBarTask.startAll(); // Purpur - Implement TPSBar -+ if (org.purpurmc.purpur.PurpurConfig.beeCountPayload) org.purpurmc.purpur.task.BeehiveTask.instance().register(); // Purpur - Give bee counts in beehives to Purpur clients ++ org.purpurmc.purpur.task.BossBarTask.startAll(); // Purpur - Implement TPSBar ++ if (org.purpurmc.purpur.PurpurConfig.beeCountPayload) org.purpurmc.purpur.task.BeehiveTask.instance().register(); // Purpur - Give bee counts in beehives to Purpur clients - this.saveEverything(false, true, true); - this.notificationManager().serverStarted(); + this.saveEverything(false, true, true); + this.notificationManager().serverStarted(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/MinecraftServerGui.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/MinecraftServerGui.java.patch index 8b532b8ac..018bbf945 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/MinecraftServerGui.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/gui/MinecraftServerGui.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/gui/MinecraftServerGui.java +++ b/net/minecraft/server/gui/MinecraftServerGui.java -@@ -40,6 +_,11 @@ +@@ -39,6 +_,11 @@ private Thread logAppenderThread; private final Collection finalizers = Lists.newArrayList(); private final AtomicBoolean isClosing = new AtomicBoolean(); @@ -12,7 +12,7 @@ public static MinecraftServerGui showFrameFor(final DedicatedServer server) { try { -@@ -47,7 +_,7 @@ +@@ -46,7 +_,7 @@ } catch (Exception var3) { } @@ -21,7 +21,7 @@ final MinecraftServerGui gui = new MinecraftServerGui(server); frame.setDefaultCloseOperation(2); frame.add(gui); -@@ -55,7 +_,7 @@ +@@ -54,7 +_,7 @@ frame.setLocationRelativeTo(null); frame.setVisible(true); // Paper start - Improve ServerGUI @@ -30,7 +30,7 @@ try { frame.setIconImage(javax.imageio.ImageIO.read(java.util.Objects.requireNonNull(MinecraftServerGui.class.getClassLoader().getResourceAsStream("logo.png")))); } catch (java.io.IOException ignore) { -@@ -65,7 +_,7 @@ +@@ -64,7 +_,7 @@ @Override public void windowClosing(final WindowEvent event) { if (!gui.isClosing.getAndSet(true)) { @@ -39,7 +39,7 @@ server.halt(true); gui.runFinalizers(); } -@@ -113,7 +_,7 @@ +@@ -112,7 +_,7 @@ private JComponent buildChatPanel() { JPanel panel = new JPanel(new BorderLayout()); @@ -48,7 +48,7 @@ JScrollPane scrollPane = new JScrollPane(chatArea, 22, 30); chatArea.setEditable(false); chatArea.setFont(MONOSPACED); -@@ -122,10 +_,43 @@ +@@ -121,10 +_,43 @@ String text = chatField.getText().trim(); if (!text.isEmpty()) { this.server.handleConsoleInput(text, this.server.createCommandSourceStack()); @@ -90,9 +90,9 @@ + }); + // Purpur end - GUI Improvements chatArea.addFocusListener(new FocusAdapter() { - { - Objects.requireNonNull(MinecraftServerGui.this); -@@ -164,7 +_,7 @@ + @Override + public void focusGained(final FocusEvent arg0) { +@@ -159,7 +_,7 @@ } private static final java.util.regex.Pattern ANSI = java.util.regex.Pattern.compile("\\e\\[[\\d;]*[^\\d;]"); // CraftBukkit // Paper @@ -101,7 +101,7 @@ if (!SwingUtilities.isEventDispatchThread()) { SwingUtilities.invokeLater(() -> this.print(console, scrollPane, line)); } else { -@@ -175,16 +_,29 @@ +@@ -170,16 +_,29 @@ shouldScroll = scrollBar.getValue() + scrollBar.getSize().getHeight() + MONOSPACED.getSize() * 4 > scrollBar.getMaximum(); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch index 936d898d7..2921271c7 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerLevel.java.patch @@ -170,7 +170,7 @@ ? this.getDestroyType(GameRules.MOB_EXPLOSION_DROP_DECAY) : Explosion.BlockInteraction.KEEP; case TNT -> this.getDestroyType(GameRules.TNT_EXPLOSION_DROP_DECAY); -@@ -2919,7 +_,7 @@ +@@ -2914,7 +_,7 @@ // Spigot start if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message // Paper start - Fix merchant inventory not closing on entity removal diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch index 3db0cdbe8..74c5d8203 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java -@@ -454,6 +_,9 @@ +@@ -435,6 +_,9 @@ public boolean isRealPlayer; // Paper public com.destroystokyo.paper.event.entity.@Nullable PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent public org.bukkit.event.player.PlayerQuitEvent.@Nullable QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event @@ -10,7 +10,7 @@ // Paper start - rewrite chunk system private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; -@@ -527,6 +_,9 @@ +@@ -508,6 +_,9 @@ this.respawnConfig = input.read("respawn", ServerPlayer.RespawnConfig.CODEC).orElse(null); this.spawnExtraParticlesOnFall = input.getBooleanOr("spawn_extra_particles_on_fall", false); this.raidOmenPosition = input.read("raid_omen_position", BlockPos.CODEC).orElse(null); @@ -20,7 +20,7 @@ // Paper start - Expand PlayerGameModeChangeEvent this.loadGameTypes(input); } -@@ -568,6 +_,9 @@ +@@ -549,6 +_,9 @@ output.store("ShoulderEntityRight", CompoundTag.CODEC, this.getShoulderEntityRight()); } this.getBukkitEntity().setExtraData(output); // CraftBukkit @@ -30,7 +30,7 @@ } private void saveParentVehicle(final ValueOutput playerOutput) { -@@ -1203,6 +_,7 @@ +@@ -1179,6 +_,7 @@ // Paper - moved up to sendClientboundPlayerCombatKillPacket() sendClientboundPlayerCombatKillPacket(event.getShowDeathMessages(), deathScreenMessage); // Paper - Expand PlayerDeathEvent Team team = this.getTeam(); @@ -38,59 +38,66 @@ if (team == null || team.getDeathMessageVisibility() == Team.Visibility.ALWAYS) { this.server.getPlayerList().broadcastSystemMessage(deathMessage, false); } else if (team.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) { -@@ -1311,6 +_,13 @@ - if (this.isInvulnerableTo(level, source)) { +@@ -1288,6 +_,13 @@ return false; - } else { -+ // Purpur start - Add boat fall damage config -+ if (source.is(net.minecraft.tags.DamageTypeTags.IS_FALL)) { -+ if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.boat.Boat && !level().purpurConfig.boatsDoFallDamage) { -+ return false; -+ } + } + ++ // Purpur start - Add boat fall damage config ++ if (source.is(net.minecraft.tags.DamageTypeTags.IS_FALL)) { ++ if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.boat.Boat && !level().purpurConfig.boatsDoFallDamage) { ++ return false; + } -+ // Purpur end - Add boat fall damage config - Entity entity = source.getEntity(); - if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false. - !(entity instanceof Player playerx && !this.canHarmPlayer(playerx)) -@@ -1570,6 +_,7 @@ ++ } ++ // Purpur end - Add boat fall damage config + Entity entity = source.getEntity(); + if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false. + !(entity instanceof Player player && !this.canHarmPlayer(player)) +@@ -1529,7 +_,7 @@ + } - profiler.pop(); - profiler.push("placing"); -+ this.portalPos = org.bukkit.craftbukkit.util.CraftLocation.toBlockPos(exit); // Purpur - Fix stuck in portals - this.setServerLevel(newLevel); - this.connection.internalTeleport(PositionMoveRotation.of(transition), transition.relatives()); // CraftBukkit - use internal teleport without event - this.connection.resetPosition(); -@@ -1686,7 +_,7 @@ - ), - monster -> monster.isPreventingPlayerRest(this.level(), this) - ); -- if (!monsters.isEmpty()) { -+ if (!this.level().purpurConfig.playerSleepNearMonsters && !monsters.isEmpty()) { // Purpur - Config to ignore nearby mobs when sleeping - return Either.left(Player.BedSleepingProblem.NOT_SAFE); - } - } -@@ -1726,8 +_,19 @@ - CriteriaTriggers.SLEPT_IN_BED.trigger(this); - }); - if (!this.level().canSleepThroughNights()) { -- this.sendOverlayMessage(Component.translatable("sleep.not_possible")); -+ // Purpur start - Customizable sleeping actionbar messages -+ Component clientMessage; -+ if (org.purpurmc.purpur.PurpurConfig.sleepNotPossible.isBlank()) { -+ clientMessage = null; -+ } else if (!org.purpurmc.purpur.PurpurConfig.sleepNotPossible.equalsIgnoreCase("default")) { -+ clientMessage = io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(org.purpurmc.purpur.PurpurConfig.sleepNotPossible)); -+ } else { -+ clientMessage = Component.translatable("sleep.not_possible"); - } -+ if (clientMessage != null) { -+ this.sendOverlayMessage(clientMessage); -+ }// Purpur end - Customizable sleeping actionbar messages -+ } + if (newLevel.dimension() == lastDimension) { +- this.connection.internalTeleport(PositionMoveRotation.of(transition), transition.relatives()); // CraftBukkit ++ this.connection.internalTeleport(PositionMoveRotation.of(transition), transition.relatives()); // CraftBukkit + this.connection.resetPosition(); + transition.postTeleportTransition().onTransition(this); + return this; +@@ -1552,6 +_,7 @@ - this.level().updateSleepingPlayerList(); - return result; -@@ -1821,6 +_,7 @@ + profiler.pop(); + profiler.push("placing"); ++ this.portalPos = org.bukkit.craftbukkit.util.CraftLocation.toBlockPos(exit); // Purpur - Fix stuck in portals + this.setServerLevel(newLevel); + this.connection.internalTeleport(PositionMoveRotation.of(transition), transition.relatives()); // CraftBukkit - use internal teleport without event + this.connection.resetPosition(); +@@ -1664,7 +_,7 @@ + new AABB(bedCenter.x() - 8.0, bedCenter.y() - 5.0, bedCenter.z() - 8.0, bedCenter.x() + 8.0, bedCenter.y() + 5.0, bedCenter.z() + 8.0), + monster -> monster.isPreventingPlayerRest(this.level(), this) + ); +- if (!monsters.isEmpty()) { ++ if (!this.level().purpurConfig.playerSleepNearMonsters && !monsters.isEmpty()) { // Purpur - Config to ignore nearby mobs when sleeping + return Either.left(Player.BedSleepingProblem.NOT_SAFE); + } + } +@@ -1700,7 +_,17 @@ + CriteriaTriggers.SLEPT_IN_BED.trigger(this); + }); + if (!this.level().canSleepThroughNights()) { +- this.sendOverlayMessage(Component.translatable("sleep.not_possible")); ++ // Purpur start - Customizable sleeping actionbar messages ++ Component clientMessage; ++ if (org.purpurmc.purpur.PurpurConfig.sleepNotPossible.isBlank()) { ++ clientMessage = null; ++ } else if (!org.purpurmc.purpur.PurpurConfig.sleepNotPossible.equalsIgnoreCase("default")) { ++ clientMessage = io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(org.purpurmc.purpur.PurpurConfig.sleepNotPossible)); ++ } else { ++ clientMessage = Component.translatable("sleep.not_possible"); ++ } if (clientMessage != null) { ++ this.sendOverlayMessage(clientMessage); ++ }// Purpur end - Customizable sleeping actionbar messages + } + + this.level().updateSleepingPlayerList(); +@@ -1794,6 +_,7 @@ @Override public void openTextEdit(final SignBlockEntity sign, final boolean isFrontText) { @@ -98,7 +105,7 @@ this.connection.send(new ClientboundBlockUpdatePacket(this.level(), sign.getBlockPos())); this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos(), isFrontText)); } -@@ -2164,6 +_,26 @@ +@@ -2138,6 +_,26 @@ this.lastSentExp = -1; // CraftBukkit - Added to reset } @@ -125,7 +132,7 @@ @Override public void completeUsingItem() { if (!this.useItem.isEmpty() && this.isUsingItem()) { -@@ -2403,6 +_,20 @@ +@@ -2373,6 +_,20 @@ ); } @@ -146,7 +153,7 @@ @Override public void sendSystemMessage(final Component message) { this.sendSystemMessage(message, false); -@@ -2554,7 +_,67 @@ +@@ -2524,7 +_,67 @@ public void resetLastActionTime() { this.lastActionTime = Util.getMillis(); @@ -215,7 +222,7 @@ public ServerStatsCounter getStats() { return this.stats; -@@ -3179,4 +_,65 @@ +@@ -3149,4 +_,65 @@ return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch index 3ae2dc18e..ed9817452 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayerGameMode.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java -@@ -371,6 +_,7 @@ +@@ -370,6 +_,7 @@ } return false; } @@ -16,7 +16,7 @@ BlockPos pos = hitResult.getBlockPos(); BlockState state = level.getBlockState(pos); boolean cancelledBlock = false; -@@ -549,7 +_,7 @@ +@@ -551,7 +_,7 @@ boolean haveSomethingInOurHands = !player.getMainHandItem().isEmpty() || !player.getOffhandItem().isEmpty(); boolean suppressUsingBlock = player.isSecondaryUseActive() && haveSomethingInOurHands; ItemStack usedItemStack = itemStack.copy(); @@ -25,7 +25,7 @@ InteractionResult itemUse = state.useItemOn(player.getItemInHand(hand), level, player, hand, hitResult); if (itemUse.consumesAction()) { CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(player, pos, usedItemStack); -@@ -595,4 +_,18 @@ +@@ -597,4 +_,18 @@ public void setLevel(final ServerLevel newLevel) { this.level = newLevel; } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch index fdce417b3..45ac70785 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerGamePacketListenerImpl.java.patch @@ -206,7 +206,7 @@ private boolean shouldCheckPlayerMovement(final boolean isFallFlying) { if (this.isSingleplayerOwner()) { return false; -@@ -2227,6 +_,7 @@ +@@ -2229,6 +_,7 @@ boolean cancelled; if (hitResult == null || hitResult.getType() != HitResult.Type.BLOCK) { @@ -214,7 +214,7 @@ org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemStack, hand); cancelled = event.useItemInHand() == Event.Result.DENY; } else { -@@ -2861,6 +_,7 @@ +@@ -2863,6 +_,7 @@ ItemStack mainHandItem = this.player.getMainHandItem(); if (this.player.isWithinAttackRange(mainHandItem, targetBounds, io.papermc.paper.configuration.GlobalConfiguration.get().misc.clientInteractionLeniencyDistance.or(3.0))) { // Paper - configurable lenience if (!mainHandItem.has(DataComponents.PIERCING_WEAPON)) { @@ -222,7 +222,7 @@ if (target instanceof ItemEntity || target instanceof ExperienceOrb || target == this.player -@@ -3642,7 +_,7 @@ +@@ -3644,7 +_,7 @@ @Override public void handleChangeGameMode(final ServerboundChangeGameModePacket packet) { PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level()); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerLoginPacketListenerImpl.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerLoginPacketListenerImpl.java.patch index 44bc23506..06cd8e9a6 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerLoginPacketListenerImpl.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/network/ServerLoginPacketListenerImpl.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java +++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java -@@ -288,7 +_,7 @@ +@@ -284,7 +_,7 @@ ServerLoginPacketListenerImpl.LOGGER.warn("Failed to verify username but will let them in anyway!"); ServerLoginPacketListenerImpl.this.startClientVerification(ServerLoginPacketListenerImpl.this.createOfflineProfile(name)); // Spigot } else { @@ -8,4 +8,4 @@ + ServerLoginPacketListenerImpl.this.disconnect(org.purpurmc.purpur.PurpurConfig.unverifiedUsername.equals("default") ? Component.translatable("multiplayer.disconnect.unverified_username") : io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(org.purpurmc.purpur.PurpurConfig.unverifiedUsername))); // Purpur - Config for unverified username message ServerLoginPacketListenerImpl.LOGGER.error("Username '{}' tried to join with an invalid session", name); } - } catch (AuthenticationUnavailableException var4) { + } catch (AuthenticationUnavailableException ignored) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch index c8d3b39b1..1ca7cfcfd 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/server/players/PlayerList.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/server/players/PlayerList.java +++ b/net/minecraft/server/players/PlayerList.java -@@ -313,6 +_,7 @@ +@@ -312,6 +_,7 @@ scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam); } // Paper end - Configurable player collision @@ -8,7 +8,7 @@ // CraftBukkit start - moved down LOGGER.info( "{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", // Paper - add world identifier -@@ -437,6 +_,7 @@ +@@ -432,6 +_,7 @@ } public net.kyori.adventure.text.@Nullable Component remove(final ServerPlayer player, final net.kyori.adventure.text.Component leaveMessage) { // Paper end - Fix kick event leave message not being sent @@ -16,7 +16,7 @@ ServerLevel level = player.level(); player.awardStat(Stats.LEAVE_GAME); // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it -@@ -771,6 +_,20 @@ +@@ -768,6 +_,20 @@ } } @@ -37,7 +37,7 @@ public void broadcastAll(final Packet packet, final ResourceKey dimension) { for (ServerPlayer player : this.players) { if (player.level().dimension() == dimension) { -@@ -864,6 +_,7 @@ +@@ -861,6 +_,7 @@ case ADMINS -> EntityEvent.PERMISSION_LEVEL_ADMINS; case OWNERS -> EntityEvent.PERMISSION_LEVEL_OWNERS; }; @@ -45,7 +45,7 @@ player.connection.send(new ClientboundEntityEventPacket(player, eventId)); } -@@ -875,7 +_,7 @@ +@@ -872,7 +_,7 @@ // Paper start - whitelist verify event / login event public LoginResult canBypassFullServerLogin(final NameAndId nameAndId, final LoginResult currentResult) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch index af00a8519..402f14bb1 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Entity.java.patch @@ -15,7 +15,7 @@ + public float maxUpStep; // Purpur - Add option to set armorstand step height public boolean noPhysics; - public final RandomSource random = SHARED_RANDOM; // Paper - Share random for entities to make them more random -+ public final RandomSource random; // Paper - Share random for entities to make them more random // Add toggle for RNG manipulation ++ public final RandomSource random; // Paper - Share random for entities to make them more random // Purpur - Add toggle for RNG manipulation public int tickCount; private int remainingFireTicks; private final EntityFluidInteraction fluidInteraction = new EntityFluidInteraction(Set.of(FluidTags.WATER, FluidTags.LAVA)); @@ -69,7 +69,7 @@ this.onBelowWorld(); } } -@@ -2005,7 +_,7 @@ +@@ -2007,7 +_,7 @@ } public boolean fireImmune() { @@ -78,7 +78,7 @@ } public boolean causeFallDamage(final double fallDistance, final float damageModifier, final DamageSource damageSource) { -@@ -2591,7 +_,7 @@ +@@ -2593,7 +_,7 @@ output.putBoolean("Bukkit.invisible", this.persistentInvisibility); } // SPIGOT-6907: re-implement LivingEntity#setMaximumAir() @@ -87,7 +87,7 @@ output.putInt("Bukkit.MaxAirSupply", this.getMaxAirSupply()); } output.putInt("Spigot.ticksLived", this.totalEntityAge); // Paper -@@ -2678,6 +_,11 @@ +@@ -2679,6 +_,11 @@ output.putBoolean("Paper.FreezeLock", true); } // Paper end @@ -96,28 +96,28 @@ + output.putBoolean("Purpur.FireImmune", immuneToFire); + } + // Purpur end - Fire immune API - } catch (Throwable var7) { - CrashReport report = CrashReport.forThrowable(var7, "Saving entity NBT"); + } catch (Throwable t) { + CrashReport report = CrashReport.forThrowable(t, "Saving entity NBT"); CrashReportCategory category = report.addCategory("Entity being saved"); -@@ -2800,6 +_,9 @@ +@@ -2802,6 +_,9 @@ } freezeLocked = input.getBooleanOr("Paper.FreezeLock", false); // Paper end + + immuneToFire = input.read("Purpur.FireImmune", com.mojang.serialization.Codec.BOOL).orElse(null); // Purpur - Fire immune API + - } catch (Throwable var7) { - CrashReport report = CrashReport.forThrowable(var7, "Loading entity NBT"); + } catch (Throwable t) { + CrashReport report = CrashReport.forThrowable(t, "Loading entity NBT"); CrashReportCategory category = report.addCategory("Entity being loaded"); -@@ -3068,6 +_,7 @@ - if (this.isAlive() && this instanceof Leashable leashablex) { - if (leashablex.getLeashHolder() == player) { +@@ -3067,6 +_,7 @@ + if (this.isAlive() && this instanceof Leashable leashable) { + if (leashable.getLeashHolder() == player) { if (!this.level().isClientSide()) { + if (hand == InteractionHand.OFF_HAND && (level().purpurConfig.villagerCanBeLeashed || level().purpurConfig.wanderingTraderCanBeLeashed) && this instanceof net.minecraft.world.entity.npc.villager.AbstractVillager) return InteractionResult.CONSUME; // Purpur - Allow leashing villagers // Paper start - EntityUnleashEvent if (!org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerUnleashEntityEvent( - leashablex, player, hand, !player.hasInfiniteMaterials(), true -@@ -3498,15 +_,18 @@ + leashable, player, hand, !player.hasInfiniteMaterials(), true +@@ -3500,15 +_,18 @@ return Vec3.directionFromRotation(this.getRotationVector()); } @@ -137,7 +137,7 @@ } } } -@@ -4236,7 +_,7 @@ +@@ -4238,7 +_,7 @@ } public boolean canUsePortal(final boolean ignorePassenger) { @@ -146,7 +146,7 @@ } public boolean canTeleport(final Level from, final Level to) { -@@ -4786,6 +_,12 @@ +@@ -4788,6 +_,12 @@ return Mth.lerp(partial, this.yRotO, this.yRot); } @@ -159,7 +159,7 @@ public boolean touchingUnloadedChunk() { AABB box = this.getBoundingBox().inflate(1.0); int x0 = Mth.floor(box.minX); -@@ -5089,7 +_,7 @@ +@@ -5091,7 +_,7 @@ } public float maxUpStep() { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch index a3ced31f6..dc0fa5ed3 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/LivingEntity.java.patch @@ -31,7 +31,7 @@ } @Override -@@ -1046,15 +_,33 @@ +@@ -1048,15 +_,33 @@ } if (targetingEntity != null) { @@ -74,40 +74,40 @@ return visibilityPercent; } -@@ -1101,6 +_,7 @@ - Iterator iterator = this.activeEffects.values().iterator(); - while (iterator.hasNext()) { - MobEffectInstance effect = iterator.next(); -+ if (cause == EntityPotionEffectEvent.Cause.MILK && !this.level().purpurConfig.milkClearsBeneficialEffects && effect.getEffect().value().isBeneficial()) continue; // Purpur - Milk Keeps Beneficial Effects - EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED); - if (event.isCancelled()) { - continue; -@@ -1432,6 +_,24 @@ - this.stopSleeping(); - } +@@ -1106,6 +_,7 @@ + Iterator iterator = this.activeEffects.values().iterator(); + while (iterator.hasNext()) { + MobEffectInstance effect = iterator.next(); ++ if (cause == EntityPotionEffectEvent.Cause.MILK && !this.level().purpurConfig.milkClearsBeneficialEffects && effect.getEffect().value().isBeneficial()) continue; // Purpur - Milk Keeps Beneficial Effects + EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED); + if (event.isCancelled()) { + continue; +@@ -1438,7 +_,23 @@ + this.stopSleeping(); + } -+ // Purpur start - One Punch Man! -+ if (source.getEntity() instanceof net.minecraft.world.entity.player.Player player && source.getEntity().level().purpurConfig.creativeOnePunch && !source.is(DamageTypeTags.IS_PROJECTILE)) { -+ if (player.isCreative()) { -+ org.apache.commons.lang3.mutable.MutableDouble attackDamage = new org.apache.commons.lang3.mutable.MutableDouble(); -+ player.getMainHandItem().forEachModifier(EquipmentSlot.MAINHAND, (attributeHolder, attributeModifier) -> { -+ if (attributeModifier.operation() == AttributeModifier.Operation.ADD_VALUE) { -+ attackDamage.addAndGet(attributeModifier.amount()); -+ } -+ }); -+ -+ if (attackDamage.doubleValue() == 0.0D) { -+ // One punch! -+ damage = this.getHealth(); +- this.noActionTime = 0; ++ // Purpur start - One Punch Man! ++ if (source.getEntity() instanceof net.minecraft.world.entity.player.Player player && source.getEntity().level().purpurConfig.creativeOnePunch && !source.is(DamageTypeTags.IS_PROJECTILE)) { ++ if (player.isCreative()) { ++ org.apache.commons.lang3.mutable.MutableDouble attackDamage = new org.apache.commons.lang3.mutable.MutableDouble(); ++ player.getMainHandItem().forEachModifier(EquipmentSlot.MAINHAND, (attributeHolder, attributeModifier) -> { ++ if (attributeModifier.operation() == AttributeModifier.Operation.ADD_VALUE) { ++ attackDamage.addAndGet(attributeModifier.amount()); + } ++ }); ++ ++ if (attackDamage.doubleValue() == 0.0D) { ++ // One punch! ++ damage = this.getHealth(); + } + } -+ // Purpur end - One Punch Man! -+ - this.noActionTime = 0; - if (damage < 0.0F) { - damage = 0.0F; -@@ -1693,10 +_,10 @@ ++ } ++ // Purpur end - One Punch Man!this.noActionTime = 0; + if (damage < 0.0F) { + damage = 0.0F; + } +@@ -1699,10 +_,10 @@ protected @Nullable Player resolvePlayerResponsibleForDamage(final DamageSource source) { Entity sourceEntity = source.getEntity(); if (sourceEntity instanceof Player playerSource) { @@ -120,26 +120,25 @@ } else { this.lastHurtByPlayer = null; this.lastHurtByPlayerMemoryTime = 0; -@@ -1747,6 +_,18 @@ - } +@@ -1754,6 +_,17 @@ } + } -+ // Purpur start - Totems work in inventory -+ if (level().purpurConfig.totemOfUndyingWorksInInventory && this instanceof ServerPlayer player && (itemStack == null || itemStack.getItem() != Items.TOTEM_OF_UNDYING) && player.getBukkitEntity().hasPermission("purpur.inventory_totem")) { -+ for (ItemStack item : player.getInventory().getNonEquipmentItems()) { -+ if (item.getItem() == Items.TOTEM_OF_UNDYING) { -+ itemStack = item; -+ protectionItem = item.copy(); -+ break; -+ } ++ // Purpur start - Totems work in inventory ++ if (level().purpurConfig.totemOfUndyingWorksInInventory && this instanceof ServerPlayer player && (itemStack == null || itemStack.getItem() != Items.TOTEM_OF_UNDYING) && player.getBukkitEntity().hasPermission("purpur.inventory_totem")) { ++ for (ItemStack item : player.getInventory().getNonEquipmentItems()) { ++ if (item.getItem() == Items.TOTEM_OF_UNDYING) { ++ itemStack = item; ++ protectionItem = item.copy(); ++ break; + } + } -+ // Purpur end - Totems work in inventory -+ - final org.bukkit.inventory.EquipmentSlot handSlot = (usedHand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(usedHand) : null; - final EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot); - event.setCancelled(protectionItem == null); -@@ -1921,6 +_,7 @@ ++ } ++ // Purpur end - Totems work in inventory + final org.bukkit.inventory.EquipmentSlot handSlot = (usedHand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(usedHand) : null; + final EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot); + event.setCancelled(protectionItem == null); +@@ -1927,6 +_,7 @@ boolean playerKilled = this.lastHurtByPlayerMemoryTime > 0; this.dropEquipment(level); // CraftBukkit - from below if (this.shouldDropLoot(level)) { @@ -147,7 +146,7 @@ this.dropFromLootTable(level, source, playerKilled); // Paper start final boolean prev = this.clearEquipmentSlots; -@@ -1929,6 +_,7 @@ +@@ -1935,6 +_,7 @@ // Paper end this.dropCustomDeathLoot(level, source, playerKilled); this.clearEquipmentSlots = prev; // Paper @@ -155,7 +154,7 @@ } // CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment -@@ -3256,6 +_,7 @@ +@@ -3264,6 +_,7 @@ float dmg = (float)(diff * 10.0 - 3.0); if (dmg > 0.0F) { this.playSound(this.getFallDamageSound((int)dmg), 1.0F, 1.0F); @@ -163,7 +162,7 @@ this.hurt(this.damageSources().flyIntoWall(), dmg); } } -@@ -4740,6 +_,12 @@ +@@ -4749,6 +_,12 @@ ? slot == EquipmentSlot.MAINHAND && this.canUseSlot(EquipmentSlot.MAINHAND) : slot == equippable.slot() && this.canUseSlot(equippable.slot()) && equippable.canBeEquippedBy(this.typeHolder()); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Mob.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Mob.java.patch index 19c485a33..d25856f89 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Mob.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/Mob.java.patch @@ -61,7 +61,7 @@ // Paper start - allow changing despawnInPeaceful this.despawnInPeacefulOverride = readDespawnInPeacefulOverride(input); } -@@ -1256,7 +_,7 @@ +@@ -1251,7 +_,7 @@ ); } @@ -70,7 +70,7 @@ return groupData; } -@@ -1613,6 +_,7 @@ +@@ -1608,6 +_,7 @@ } this.postPiercingAttack(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/attributes/RangedAttribute.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/attributes/RangedAttribute.java.patch index 905af06f3..d201ce404 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/attributes/RangedAttribute.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/attributes/RangedAttribute.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/ai/attributes/RangedAttribute.java +++ b/net/minecraft/world/entity/ai/attributes/RangedAttribute.java -@@ -29,6 +_,7 @@ +@@ -33,6 +_,7 @@ @Override public double sanitizeValue(final double value) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/AcquirePoi.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/AcquirePoi.java.patch index e2304b77d..113c6980d 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/AcquirePoi.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/behavior/AcquirePoi.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java +++ b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java -@@ -90,7 +_,7 @@ - }; - // Paper start - optimise POI searches - java.util.List, BlockPos>> poiPositionsRaw = new java.util.ArrayList<>(); -- ca.spottedleaf.moonrise.patches.poi_lookup.PoiAccess.findNearestPoiPositions(poiManager, poiType, cacheTest, body.blockPosition(), SCAN_RANGE, Double.MAX_VALUE, PoiManager.Occupancy.HAS_SPACE, ca.spottedleaf.moonrise.patches.poi_lookup.PoiAccess.LOAD_FOR_SEARCHING, 5, poiPositionsRaw); -+ ca.spottedleaf.moonrise.patches.poi_lookup.PoiAccess.findNearestPoiPositions(poiManager, poiType, cacheTest, body.blockPosition(), level.purpurConfig.villagerAcquirePoiSearchRadius, Double.MAX_VALUE, PoiManager.Occupancy.HAS_SPACE, ca.spottedleaf.moonrise.patches.poi_lookup.PoiAccess.LOAD_FOR_SEARCHING, 5, poiPositionsRaw); // Purpur - Configurable villager search radius - Set, BlockPos>> poiPositions = new java.util.HashSet<>(poiPositionsRaw.size()); - for (Pair, BlockPos> pair : poiPositionsRaw) { - if (validPoi.test(level, pair.getSecond())) { +@@ -96,7 +_,7 @@ + }; + // Paper start - optimise POI searches + java.util.List, BlockPos>> poiPositionsRaw = new java.util.ArrayList<>(); +- ca.spottedleaf.moonrise.patches.poi_lookup.PoiAccess.findNearestPoiPositions(poiManager, poiType, cacheTest, body.blockPosition(), SCAN_RANGE, Double.MAX_VALUE, PoiManager.Occupancy.HAS_SPACE, ca.spottedleaf.moonrise.patches.poi_lookup.PoiAccess.LOAD_FOR_SEARCHING, 5, poiPositionsRaw); ++ ca.spottedleaf.moonrise.patches.poi_lookup.PoiAccess.findNearestPoiPositions(poiManager, poiType, cacheTest, body.blockPosition(), level.purpurConfig.villagerAcquirePoiSearchRadius, Double.MAX_VALUE, PoiManager.Occupancy.HAS_SPACE, ca.spottedleaf.moonrise.patches.poi_lookup.PoiAccess.LOAD_FOR_SEARCHING, 5, poiPositionsRaw); // Purpur - Configurable villager search radius + Set, BlockPos>> poiPositions = new java.util.HashSet<>(poiPositionsRaw.size()); + for (Pair, BlockPos> pair : poiPositionsRaw) { + if (validPoi.test(level, pair.getSecond())) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java.patch index ce04e2591..e7641a22f 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/goal/LlamaFollowCaravanGoal.java.patch @@ -8,7 +8,7 @@ if (!this.llama.isLeashed() && !this.llama.inCaravan()) { List llamas = this.llama .level() -@@ -70,6 +_,7 @@ +@@ -74,6 +_,7 @@ @Override public boolean canContinueToUse() { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java.patch index 3566ae778..0f743efca 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java +++ b/net/minecraft/world/entity/ai/sensing/NearestBedSensor.java -@@ -54,7 +_,7 @@ - } +@@ -56,7 +_,7 @@ + return true; }; Set, BlockPos>> pois = poiManager.findAllWithType( - e -> e.is(PoiTypes.HOME), cacheTest, body.blockPosition(), AcquirePoi.SCAN_RANGE, PoiManager.Occupancy.ANY diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/targeting/TargetingConditions.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/targeting/TargetingConditions.java.patch index fa9a7b5ba..1d40e2447 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/targeting/TargetingConditions.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/ai/targeting/TargetingConditions.java.patch @@ -1,13 +1,13 @@ --- a/net/minecraft/world/entity/ai/targeting/TargetingConditions.java +++ b/net/minecraft/world/entity/ai/targeting/TargetingConditions.java -@@ -63,6 +_,10 @@ - return false; - } else if (this.selector != null && !this.selector.test(target, level)) { +@@ -67,6 +_,10 @@ + + if (this.selector != null && !this.selector.test(target, level)) { return false; + // Purpur start - AFK API + } else if (!level.purpurConfig.idleTimeoutTargetPlayer && target instanceof net.minecraft.server.level.ServerPlayer player && player.isAfk()) { + return false; + // Purpur end - AFK API - } else { - if (targeter == null) { - if (this.isCombat && (!target.canBeSeenAsEnemy() || level.getDifficulty() == Difficulty.PEACEFUL)) { + } + + if (targeter == null) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/bee/Bee.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/bee/Bee.java.patch index 3ff4d75be..69afd3270 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/bee/Bee.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/bee/Bee.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/bee/Bee.java +++ b/net/minecraft/world/entity/animal/bee/Bee.java -@@ -172,7 +_,7 @@ +@@ -171,7 +_,7 @@ // Paper end - Fix MC-167279 this.lookControl = new Bee.BeeLookControl(this); this.setPathfindingMalus(PathType.FIRE_IN_NEIGHBOR, -1.0F); @@ -9,7 +9,7 @@ this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F); this.setPathfindingMalus(PathType.COCOA, -1.0F); this.setPathfindingMalus(PathType.FENCE, -1.0F); -@@ -363,13 +_,19 @@ +@@ -362,13 +_,19 @@ if (this.stayOutOfHiveCountdown <= 0 && !this.beePollinateGoal.isPollinating() && !this.hasStung() && this.getTarget() == null) { boolean wantsToEnterHive = this.hasNectar() || this.isTiredOfLookingForNectar() @@ -30,7 +30,7 @@ public void setStayOutOfHiveCountdown(final int ticks) { this.stayOutOfHiveCountdown = ticks; } -@@ -390,7 +_,7 @@ +@@ -389,7 +_,7 @@ @Override protected void customServerAiStep(final ServerLevel level) { boolean hasStung = this.hasStung(); @@ -39,7 +39,7 @@ this.underWaterTicks++; } else { this.underWaterTicks = 0; -@@ -400,6 +_,7 @@ +@@ -399,6 +_,7 @@ this.hurtServer(level, this.damageSources().drown(), 1.0F); } @@ -47,7 +47,7 @@ if (hasStung) { this.timeSinceSting++; if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, 1, 1200)) == 0) { -@@ -1168,6 +_,7 @@ +@@ -1132,6 +_,7 @@ Bee.this.savedFlowerPos = nearbyPos.get(); Bee.this.navigation .moveTo(Bee.this.savedFlowerPos.getX() + 0.5, Bee.this.savedFlowerPos.getY() + 0.5, Bee.this.savedFlowerPos.getZ() + 0.5, 1.2F); @@ -55,7 +55,7 @@ return true; } else { Bee.this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(Bee.this.random, 20, 60); -@@ -1214,6 +_,7 @@ +@@ -1178,6 +_,7 @@ this.pollinating = false; Bee.this.navigation.stop(); Bee.this.remainingCooldownBeforeLocatingNewFlower = 200; @@ -63,7 +63,7 @@ } @Override -@@ -1260,6 +_,7 @@ +@@ -1224,6 +_,7 @@ this.setWantedPos(); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/fox/Fox.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/fox/Fox.java.patch index 4e81f1d86..ec370fb45 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/fox/Fox.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/fox/Fox.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/fox/Fox.java +++ b/net/minecraft/world/entity/animal/fox/Fox.java -@@ -364,6 +_,11 @@ +@@ -363,6 +_,11 @@ } private void setTargetGoals() { @@ -12,7 +12,7 @@ if (this.getVariant() == Fox.Variant.RED) { this.targetSelector.addGoal(4, this.landTargetGoal); this.targetSelector.addGoal(4, this.turtleEggTargetGoal); -@@ -391,6 +_,7 @@ +@@ -390,6 +_,7 @@ public void setVariant(final Fox.Variant variant) { this.entityData.set(DATA_TYPE_ID, variant.getId()); @@ -20,7 +20,7 @@ } @Override -@@ -716,6 +_,29 @@ +@@ -715,6 +_,29 @@ return slot == EquipmentSlot.MAINHAND; } // Paper end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/golem/IronGolem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/golem/IronGolem.java.patch index a2fa06c68..5acd74a74 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/golem/IronGolem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/golem/IronGolem.java.patch @@ -42,11 +42,11 @@ this.readPersistentAngerSaveData(this.level(), input); } -@@ -267,6 +_,7 @@ - float pitch = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; - this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, pitch); - itemStack.consume(1, player); -+ if (this.level().purpurConfig.ironGolemHealCalm && isAngry() && getHealth() == getMaxHealth()) stopBeingAngry(); // Purpur - Iron golem calm anger options - return InteractionResult.SUCCESS; - } - } +@@ -269,6 +_,7 @@ + float pitch = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F; + this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, pitch); + itemStack.consume(1, player); ++ if (this.level().purpurConfig.ironGolemHealCalm && isAngry() && getHealth() == getMaxHealth()) stopBeingAngry(); // Purpur - Iron golem calm anger options + return InteractionResult.SUCCESS; + } + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/polarbear/PolarBear.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/polarbear/PolarBear.java.patch index 6b704cb1f..54842b6ad 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/polarbear/PolarBear.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/polarbear/PolarBear.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java +++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java -@@ -67,6 +_,29 @@ +@@ -66,6 +_,29 @@ super(type, level); } @@ -30,7 +30,7 @@ @Override public @Nullable AgeableMob getBreedOffspring(final ServerLevel level, final AgeableMob partner) { return EntityType.POLAR_BEAR.create(level, EntitySpawnReason.BREEDING); -@@ -74,7 +_,7 @@ +@@ -73,7 +_,7 @@ @Override public boolean isFood(final ItemStack itemStack) { @@ -39,7 +39,7 @@ } @Override -@@ -83,6 +_,12 @@ +@@ -82,6 +_,12 @@ this.goalSelector.addGoal(0, new FloatGoal(this)); this.goalSelector.addGoal(1, new PolarBear.PolarBearMeleeAttackGoal()); this.goalSelector.addGoal(1, new PanicGoal(this, 2.0, bear -> bear.isBaby() ? DamageTypeTags.PANIC_CAUSES : DamageTypeTags.PANIC_ENVIRONMENTAL_CAUSES)); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/squid/Squid.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/squid/Squid.java.patch index 2473c82cc..84ca8fad1 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/squid/Squid.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/squid/Squid.java.patch @@ -39,7 +39,7 @@ if (this.tentacleMovement < Mth.PI) { float tentacleScale = this.tentacleMovement / Mth.PI; this.tentacleAngle = Mth.sin(tentacleScale * tentacleScale * Mth.PI) * Mth.PI * 0.25F; -@@ -321,7 +_,7 @@ +@@ -316,7 +_,7 @@ int noActionTime = this.squid.getNoActionTime(); if (noActionTime > 100) { this.squid.movementVector = Vec3.ZERO; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/wolf/Wolf.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/wolf/Wolf.java.patch index 46c93673d..1b77fb1bd 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/wolf/Wolf.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/animal/wolf/Wolf.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/animal/wolf/Wolf.java +++ b/net/minecraft/world/entity/animal/wolf/Wolf.java -@@ -97,6 +_,37 @@ +@@ -96,6 +_,37 @@ public static final TargetingConditions.Selector PREY_SELECTOR = (target, level) -> target.is(EntityType.SHEEP) || target.is(EntityType.RABBIT) || target.is(EntityType.FOX); @@ -38,7 +38,7 @@ private static final float START_HEALTH = 8.0F; private static final float TAME_HEALTH = 40.0F; private static final float ARMOR_REPAIR_UNIT = 0.125F; -@@ -118,12 +_,47 @@ +@@ -117,12 +_,47 @@ this.setPathfindingMalus(PathType.ON_TOP_OF_POWDER_SNOW, -1.0F); } @@ -86,7 +86,7 @@ this.goalSelector.addGoal(4, new LeapAtTargetGoal(this, 0.4F)); this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1.0, true)); this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0, 10.0F, 2.0F)); -@@ -136,7 +_,7 @@ +@@ -135,7 +_,7 @@ this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this)); this.targetSelector.addGoal(3, new HurtByTargetGoal(this).setAlertOthers()); this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt)); @@ -95,7 +95,7 @@ this.targetSelector.addGoal(6, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR)); this.targetSelector.addGoal(7, new NearestAttackableTargetGoal<>(this, AbstractSkeleton.class, false)); this.targetSelector.addGoal(8, new ResetUniversalAngerTargetGoal<>(this, true)); -@@ -231,6 +_,7 @@ +@@ -230,6 +_,7 @@ protected void addAdditionalSaveData(final ValueOutput output) { super.addAdditionalSaveData(output); output.store("CollarColor", DyeColor.LEGACY_ID_CODEC, this.getCollarColor()); @@ -103,7 +103,7 @@ VariantUtils.writeVariant(output, this.getVariant()); this.addPersistentAngerSaveData(output); this.getSoundVariant() -@@ -245,6 +_,10 @@ +@@ -244,6 +_,10 @@ super.readAdditionalSaveData(input); VariantUtils.readVariant(input, Registries.WOLF_VARIANT).ifPresent(this::setVariant); this.setCollarColor(input.read("CollarColor", DyeColor.LEGACY_ID_CODEC).orElse(DEFAULT_COLLAR_COLOR)); @@ -114,7 +114,7 @@ this.readPersistentAngerSaveData(this.level(), input); input.read("sound_variant", ResourceKey.codec(Registries.WOLF_SOUND_VARIANT)) .flatMap(soundVariant -> this.registryAccess().lookupOrThrow(Registries.WOLF_SOUND_VARIANT).get((ResourceKey)soundVariant)) -@@ -268,6 +_,10 @@ +@@ -267,6 +_,10 @@ } this.setSoundVariant(WolfSoundVariants.pickRandomSoundVariant(this.registryAccess(), level.getRandom())); @@ -125,7 +125,7 @@ return super.finalizeSpawn(level, difficulty, spawnReason, groupData); } -@@ -316,6 +_,11 @@ +@@ -315,6 +_,11 @@ public void tick() { super.tick(); if (this.isAlive()) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch index 2094309f6..9d05de133 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java.patch @@ -34,23 +34,23 @@ } @Override -@@ -115,15 +_,17 @@ +@@ -118,15 +_,17 @@ + } + // CraftBukkit end + if (!source.is(DamageTypeTags.IS_EXPLOSION)) { ++ if (shouldExplode()) {// Purpur - End crystal explosion options + DamageSource damageSource = source.getEntity() != null ? this.damageSources().explosion(this, source.getEntity()) : null; + // CraftBukkit start +- org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, 6.0F, false); ++ org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, getExplosionPower(), hasExplosionFire()); // Purpur - End crystal explosion options + if (event.isCancelled()) { + return false; } - // CraftBukkit end - if (!source.is(DamageTypeTags.IS_EXPLOSION)) { -+ if (shouldExplode()) {// Purpur - End crystal explosion options - DamageSource damageSource = source.getEntity() != null ? this.damageSources().explosion(this, source.getEntity()) : null; - // CraftBukkit start -- org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, 6.0F, false); -+ org.bukkit.event.entity.ExplosionPrimeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExplosionPrimeEvent(this, getExplosionPower(), hasExplosionFire()); // Purpur - End crystal explosion options - if (event.isCancelled()) { - return false; - } - this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.EXPLODE); // Paper - add Bukkit remove cause -- level.explode(this, damageSource, null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.BLOCK); -+ level.explode(this, damageSource, null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), getExplosionEffect()); // Purpur - End crystal explosion options -+ } else this.unsetRemoved(); // Purpur - End crystal explosion options - } else { - this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // Paper - add Bukkit remove cause - // CraftBukkit end + this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.EXPLODE); // Paper - add Bukkit remove cause +- level.explode(this, damageSource, null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.BLOCK); ++ level.explode(this, damageSource, null, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), getExplosionEffect()); // Purpur - End crystal explosion options ++ } else this.unsetRemoved(); // Purpur - End crystal explosion options + } else { + this.remove(Entity.RemovalReason.KILLED, org.bukkit.event.entity.EntityRemoveEvent.Cause.DEATH); // Paper - add Bukkit remove cause + // CraftBukkit end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch index 05f4a05b6..8672e1a24 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java +++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java -@@ -959,6 +_,7 @@ +@@ -960,6 +_,7 @@ @Override protected boolean canRide(final Entity vehicle) { @@ -8,7 +8,7 @@ return false; } -@@ -994,7 +_,7 @@ +@@ -995,7 +_,7 @@ boolean shouldDrop = level.getGameRules().get(GameRules.MOB_DROPS); int xpCount = 500; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch index 625f86b7d..2bb81f841 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/boss/wither/WitherBoss.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/boss/wither/WitherBoss.java +++ b/net/minecraft/world/entity/boss/wither/WitherBoss.java -@@ -82,6 +_,7 @@ +@@ -81,6 +_,7 @@ private static final TargetingConditions.Selector LIVING_ENTITY_SELECTOR = (target, level) -> !target.is(EntityTypeTags.WITHER_FRIENDS) && target.attackable(); private static final TargetingConditions TARGETING_CONDITIONS = TargetingConditions.forCombat().range(20.0).selector(LIVING_ENTITY_SELECTOR); @@ -8,7 +8,7 @@ public WitherBoss(final EntityType type, final Level level) { super(type, level); -@@ -90,6 +_,16 @@ +@@ -89,6 +_,16 @@ this.xpReward = 50; } @@ -25,7 +25,7 @@ @Override protected PathNavigation createNavigation(final Level level) { FlyingPathNavigation flyingPathNavigation = new FlyingPathNavigation(this, level); -@@ -122,6 +_,7 @@ +@@ -121,6 +_,7 @@ protected void addAdditionalSaveData(final ValueOutput output) { super.addAdditionalSaveData(output); output.putInt("Invul", this.getInvulnerableTicks()); @@ -33,7 +33,7 @@ } @Override -@@ -131,6 +_,7 @@ +@@ -130,6 +_,7 @@ if (this.hasCustomName()) { this.bossEvent.setName(this.getDisplayName()); } @@ -41,7 +41,7 @@ } @Override -@@ -274,7 +_,7 @@ +@@ -273,7 +_,7 @@ level.explode(this, this.getX(), this.getEyeY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB); } // CraftBukkit end @@ -50,7 +50,7 @@ // CraftBukkit start - Use relative location for far away sounds // level.globalLevelEvent(LevelEvent.SOUND_WITHER_BOSS_SPAWN, this.blockPosition(), 0); int viewDistance = level.getCraftServer().getViewDistance() * 16; -@@ -378,8 +_,10 @@ +@@ -377,8 +_,10 @@ } } @@ -63,7 +63,7 @@ } this.bossEvent.setProgress(this.getHealth() / this.getMaxHealth()); -@@ -576,6 +_,7 @@ +@@ -579,6 +_,7 @@ @Override protected boolean canRide(final Entity vehicle) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/decoration/ArmorStand.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/decoration/ArmorStand.java.patch index b524ebfbe..f643d58da 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/decoration/ArmorStand.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/decoration/ArmorStand.java.patch @@ -14,7 +14,7 @@ } public ArmorStand(final Level level, final double x, final double y, final double z) { -@@ -523,6 +_,7 @@ +@@ -546,6 +_,7 @@ // Paper start - Allow ArmorStands not to tick @Override public void tick() { @@ -22,7 +22,7 @@ if (!this.canTick) { if (this.noTickEquipmentDirty) { this.noTickEquipmentDirty = false; -@@ -809,4 +_,19 @@ +@@ -832,4 +_,19 @@ } } // Paper end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch index 38716c682..bc0f6cc28 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/item/ItemEntity.java.patch @@ -29,9 +29,9 @@ + } else if (this.isInvulnerableToBase(source)) { + // Purpur end - Item entity immunities return false; - } else if (!level.getGameRules().get(GameRules.MOB_GRIEFING) && source.getEntity() instanceof Mob) { - return false; -@@ -517,6 +_,12 @@ + } + +@@ -521,6 +_,12 @@ public void setItem(final ItemStack itemStack) { this.getEntityData().set(DATA_ITEM, itemStack); this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(itemStack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper - Alternative item-despawn-rate diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/EnderMan.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/EnderMan.java.patch index 961eb21d2..172a9f1e1 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/EnderMan.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/EnderMan.java.patch @@ -18,22 +18,23 @@ final com.destroystokyo.paper.event.entity.EndermanAttackPlayerEvent event = new com.destroystokyo.paper.event.entity.EndermanAttackPlayerEvent((org.bukkit.entity.Enderman) getBukkitEntity(), (org.bukkit.entity.Player) player.getBukkitEntity()); event.setCancelled(!shouldAttack); return event.callEvent(); -@@ -373,6 +_,7 @@ +@@ -373,7 +_,7 @@ public boolean hurtServer(final ServerLevel level, final DamageSource source, final float damage) { if (this.isInvulnerableTo(level, source)) { return false; -+ } 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 thrownPotion = source.getDirectEntity() instanceof AbstractThrownPotion potion ? potion : null; - if (!source.is(DamageTypeTags.IS_PROJECTILE) && thrownPotion == null) { // Paper - EndermanEscapeEvent - diff on change - below logic relies on this path covering non-projectile damage. -@@ -387,6 +_,7 @@ - } else { - boolean hurtWithCleanWater = thrownPotion != null && this.hurtWithCleanWater(level, source, thrownPotion, 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 -+ if (!hurtWithCleanWater && level.purpurConfig.endermanIgnoreProjectiles) return super.hurtServer(level, source, damage); // Purpur - Config to disable Enderman teleport on projectile hit - if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper - EndermanEscapeEvent - for (int i = 0; i < 64; i++) { - if (this.teleport()) { + AbstractThrownPotion thrownPotion = source.getDirectEntity() instanceof AbstractThrownPotion potion ? potion : null; + if (!source.is(DamageTypeTags.IS_PROJECTILE) && thrownPotion == null) { // Paper - EndermanEscapeEvent - diff on change - below logic relies on this path covering non-projectile damage. +@@ -388,6 +_,7 @@ + } else { + boolean hurtWithCleanWater = thrownPotion != null && this.hurtWithCleanWater(level, source, thrownPotion, damage); + ++ if (!hurtWithCleanWater && level.purpurConfig.endermanIgnoreProjectiles) return super.hurtServer(level, source, damage); // Purpur - Config to disable Enderman teleport on projectile hit + if (this.tryEscape(com.destroystokyo.paper.event.entity.EndermanEscapeEvent.Reason.INDIRECT)) { // Paper - EndermanEscapeEvent + for (int i = 0; i < 64; i++) { + if (this.teleport()) { @@ -430,7 +_,7 @@ @Override diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Guardian.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Guardian.java.patch index 68f4646c6..9283c41f1 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Guardian.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Guardian.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Guardian.java +++ b/net/minecraft/world/entity/monster/Guardian.java -@@ -308,6 +_,11 @@ +@@ -310,6 +_,11 @@ final BlockPos pos, final RandomSource random ) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Monster.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Monster.java.patch index 9ac988100..aa209bf31 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Monster.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Monster.java.patch @@ -11,7 +11,7 @@ + // Purpur end - Config to disable hostile mob spawn on ice if (level.getBrightness(LightLayer.SKY, pos) > random.nextInt(32)) { return false; - } else { + } @@ -113,6 +_,11 @@ public static boolean checkAnyLightMonsterSpawnRules( final EntityType type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Phantom.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Phantom.java.patch index 15607559a..7d654cffe 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Phantom.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Phantom.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java -@@ -167,7 +_,11 @@ +@@ -166,7 +_,11 @@ final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, final @Nullable SpawnGroupData groupData ) { this.anchorPoint = this.blockPosition().above(5); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Shulker.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Shulker.java.patch index d019b68d1..ee9c486db 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Shulker.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/Shulker.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/Shulker.java +++ b/net/minecraft/world/entity/monster/Shulker.java -@@ -94,6 +_,22 @@ +@@ -93,6 +_,22 @@ this.lookControl = new Shulker.ShulkerLookControl(this); } @@ -23,7 +23,7 @@ @Override protected void registerGoals() { this.goalSelector.addGoal(1, new LookAtPlayerGoal(this, Player.class, 8.0F, 0.02F, true)); -@@ -455,11 +_,21 @@ +@@ -454,11 +_,21 @@ private void hitByShulkerBullet() { Vec3 oldPosition = this.position(); AABB oldAabb = this.getBoundingBox(); @@ -49,7 +49,7 @@ if (baby != null) { baby.setVariant(this.getVariant()); baby.snapTo(oldPosition); -@@ -566,7 +_,7 @@ +@@ -565,7 +_,7 @@ } public Optional getVariant() { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/piglin/PiglinAi.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/piglin/PiglinAi.java.patch index a49366916..c0a4a032f 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/piglin/PiglinAi.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/piglin/PiglinAi.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/piglin/PiglinAi.java +++ b/net/minecraft/world/entity/monster/piglin/PiglinAi.java -@@ -669,14 +_,24 @@ +@@ -666,14 +_,24 @@ } public static boolean isWearingSafeArmor(final LivingEntity livingEntity) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java.patch index ded5d1741..1eace4414 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java +++ b/net/minecraft/world/entity/monster/skeleton/AbstractSkeleton.java -@@ -142,7 +_,7 @@ +@@ -137,7 +_,7 @@ this.populateDefaultEquipmentEnchantments(level, random, difficulty); this.reassessWeaponGoal(); this.setCanPickUpLoot(level.getLevel().paperConfig().entities.behavior.mobsCanAlwaysPickUpLoot.skeletons || random.nextFloat() < 0.55F * difficulty.getSpecialMultiplier()); // Paper - Add world settings for mobs picking up loot @@ -9,7 +9,7 @@ this.setItemSlot(EquipmentSlot.HEAD, new ItemStack(random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.CARVED_PUMPKIN)); this.setDropChance(EquipmentSlot.HEAD, 0.0F); } -@@ -189,7 +_,7 @@ +@@ -184,7 +_,7 @@ double distanceToTarget = Math.sqrt(xd * xd + zd * zd); if (this.level() instanceof ServerLevel serverLevel) { Projectile.Delayed delayedEntity = Projectile.spawnProjectileUsingShootDelayed( // Paper - delayed diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/zombie/Zombie.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/zombie/Zombie.java.patch index bdef1eb4c..48ef1be87 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/zombie/Zombie.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/monster/zombie/Zombie.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/monster/zombie/Zombie.java +++ b/net/minecraft/world/entity/monster/zombie/Zombie.java -@@ -128,7 +_,19 @@ +@@ -127,7 +_,19 @@ this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0)); this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers(ZombifiedPiglin.class)); this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true)); @@ -21,7 +21,7 @@ this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true)); this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR)); } -@@ -543,7 +_,7 @@ +@@ -540,7 +_,7 @@ } } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/villager/Villager.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/villager/Villager.java.patch index 4527f1e78..8606700d4 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/villager/Villager.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/villager/Villager.java.patch @@ -92,15 +92,15 @@ profiler.pop(); if (this.assignProfessionWhenSpawned) { this.assignProfessionWhenSpawned = false; -@@ -344,6 +_,7 @@ - return InteractionResult.CONSUME; - } - -+ if (this.level().purpurConfig.villagerAllowTrading) // Purpur - Add config for villager trading - this.startTrading(player); +@@ -347,6 +_,7 @@ + return InteractionResult.CONSUME; } -@@ -485,7 +_,7 @@ ++ if (this.level().purpurConfig.villagerAllowTrading) // Purpur - Add config for villager trading + this.startTrading(player); + } + +@@ -487,7 +_,7 @@ public void updateDemand() { for (MerchantOffer offer : this.getOffers()) { @@ -109,7 +109,7 @@ } } -@@ -685,7 +_,7 @@ +@@ -687,7 +_,7 @@ @Override public boolean canBreed() { @@ -118,7 +118,7 @@ } private boolean hungry() { -@@ -891,6 +_,7 @@ +@@ -893,6 +_,7 @@ } public void spawnGolemIfNeeded(final ServerLevel level, final long timestamp, final int villagersNeededToAgree) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java.patch index ef4a56413..13726114d 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java +++ b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTrader.java -@@ -61,6 +_,13 @@ +@@ -60,6 +_,13 @@ super(type, level); } @@ -14,7 +14,7 @@ @Override protected void registerGoals() { this.goalSelector.addGoal(0, new FloatGoal(this)); -@@ -78,7 +_,7 @@ +@@ -77,7 +_,7 @@ .addGoal( 0, new UseItemGoal<>( @@ -23,7 +23,7 @@ ) ); this.goalSelector.addGoal(1, new TradeWithPlayerGoal(this)); -@@ -121,8 +_,10 @@ +@@ -120,8 +_,10 @@ return InteractionResult.CONSUME; } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java.patch index ab4cfc3a4..c41868a16 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java +++ b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java -@@ -133,7 +_,17 @@ +@@ -135,7 +_,17 @@ int xPosition = referencePosition.getX() + this.random.nextInt(radius * 2) - radius; int zPosition = referencePosition.getZ() + this.random.nextInt(radius * 2) - radius; int yPosition = level.getHeight(SpawnPlacements.getHeightmapType(EntityType.WANDERING_TRADER), xPosition, zPosition); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch index 19a6dd22b..eed5fb8e3 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/player/Player.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java -@@ -174,11 +_,20 @@ +@@ -173,11 +_,20 @@ public float hurtDir; public boolean affectsSpawning = true; // Paper - Affects Spawning API public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage @@ -21,7 +21,7 @@ @Override public org.bukkit.craftbukkit.entity.CraftHumanEntity getBukkitEntity() { return (org.bukkit.craftbukkit.entity.CraftHumanEntity) super.getBukkitEntity(); -@@ -239,6 +_,12 @@ +@@ -242,6 +_,12 @@ @Override public void tick() { @@ -34,7 +34,7 @@ this.noPhysics = this.isSpectator(); if (this.isSpectator() || this.isPassenger()) { this.setOnGround(false); -@@ -296,6 +_,17 @@ +@@ -299,6 +_,17 @@ this.turtleHelmetTick(); } @@ -52,7 +52,7 @@ this.cooldowns.tick(); this.updatePlayerPose(); } -@@ -501,7 +_,7 @@ +@@ -504,7 +_,7 @@ List orbs = Lists.newArrayList(); for (Entity entity : entities) { @@ -61,7 +61,7 @@ orbs.add(entity); } else if (!entity.isRemoved()) { this.touch(entity); -@@ -1044,7 +_,7 @@ +@@ -1052,7 +_,7 @@ criticalAttack = criticalAttack && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits if (criticalAttack) { damageSource = damageSource.critical(); // Paper - critical damage API @@ -70,7 +70,7 @@ } float totalDamage = baseDamage + magicBoost; -@@ -1740,7 +_,23 @@ +@@ -1748,7 +_,23 @@ @Override protected int getBaseExperienceReward(final ServerLevel level) { @@ -95,7 +95,7 @@ } @Override -@@ -1783,6 +_,13 @@ +@@ -1791,6 +_,13 @@ public boolean addItem(final ItemStack itemStack) { return this.inventory.add(itemStack); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java.patch index fc07f8cde..cd762b68b 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java +++ b/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java -@@ -56,9 +_,39 @@ +@@ -54,9 +_,39 @@ protected void onHitEntity(final EntityHitResult hitResult) { super.onHitEntity(hitResult); Entity entity = hitResult.getEntity(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/raid/Raids.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/raid/Raids.java.patch index 13bc05c21..7ee9e5c9a 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/raid/Raids.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/raid/Raids.java.patch @@ -26,17 +26,17 @@ Iterator raidIterator = this.raidMap.values().iterator(); while (raidIterator.hasNext()) { -@@ -137,11 +_,11 @@ - // } +@@ -139,11 +_,12 @@ + // } - if (!raid.isStarted() || (raid.isInProgress() && raid.getRaidOmenLevel() < raid.getMaxRaidOmenLevel())) { // CraftBukkit - fixed a bug with raid: players could add up Bad Omen level even when the raid had finished -- // CraftBukkit start -+ if (level.purpurConfig.raidCooldownSeconds != 0 && playerCooldowns.containsKey(player.getUUID())) return null; // Purpur - Raid cooldown setting// CraftBukkit start - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callRaidTriggerEvent(level, raid, player)) { - player.removeEffect(net.minecraft.world.effect.MobEffects.RAID_OMEN); - return null; -- } -+ }if (level.purpurConfig.raidCooldownSeconds != 0) playerCooldowns.put(player.getUUID(), level.purpurConfig.raidCooldownSeconds); // Purpur - Raid cooldown setting + if (!raid.isStarted() || (raid.isInProgress() && raid.getRaidOmenLevel() < raid.getMaxRaidOmenLevel())) { // CraftBukkit - fixed a bug with raid: players could add up Bad Omen level even when the raid had finished ++ if (level.purpurConfig.raidCooldownSeconds != 0 && playerCooldowns.containsKey(player.getUUID())) return null; // Purpur - Raid cooldown setting + // CraftBukkit start + if (!org.bukkit.craftbukkit.event.CraftEventFactory.callRaidTriggerEvent(level, raid, player)) { + player.removeEffect(net.minecraft.world.effect.MobEffects.RAID_OMEN); + return null; +- } ++ }if (level.purpurConfig.raidCooldownSeconds != 0) playerCooldowns.put(player.getUUID(), level.purpurConfig.raidCooldownSeconds); // Purpur - Raid cooldown setting - if (!raid.isStarted() && !this.raidMap.containsValue(raid)) { - this.raidMap.put(this.getUniqueId(), raid); + if (!raid.isStarted() && !this.raidMap.containsValue(raid)) { + this.raidMap.put(this.getUniqueId(), raid); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/vehicle/minecart/NewMinecartBehavior.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/vehicle/minecart/NewMinecartBehavior.java.patch index 348f58ff5..0b55a70f5 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/vehicle/minecart/NewMinecartBehavior.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/vehicle/minecart/NewMinecartBehavior.java.patch @@ -6,6 +6,6 @@ if (deltaMovement.length() > 0.01) { - return deltaMovement.normalize().scale(deltaMovement.length() + 0.06); + return deltaMovement.normalize().scale(deltaMovement.length() + this.level().purpurConfig.poweredRailBoostModifier); // Purpur - Configurable powered rail boost modifier - } else { - Vec3 powerDirection = this.minecart.getRedstoneDirection(pos); - return powerDirection.lengthSqr() <= 0.0 ? deltaMovement : powerDirection.scale(deltaMovement.length() + 0.2); + } + + Vec3 powerDirection = this.minecart.getRedstoneDirection(pos); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AbstractContainerMenu.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AbstractContainerMenu.java.patch index bc3751e78..0183c15fa 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AbstractContainerMenu.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AbstractContainerMenu.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/AbstractContainerMenu.java +++ b/net/minecraft/world/inventory/AbstractContainerMenu.java -@@ -65,6 +_,7 @@ +@@ -64,6 +_,7 @@ private final List containerListeners = Lists.newArrayList(); private @Nullable ContainerSynchronizer synchronizer; private boolean suppressRemoteUpdates; diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AbstractFurnaceMenu.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AbstractFurnaceMenu.java.patch index faf6e78a6..ad08a7d2a 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AbstractFurnaceMenu.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/AbstractFurnaceMenu.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/AbstractFurnaceMenu.java +++ b/net/minecraft/world/inventory/AbstractFurnaceMenu.java -@@ -122,7 +_,13 @@ +@@ -121,7 +_,13 @@ } else if (slotIndex != 1 && slotIndex != 0) { if (this.canSmelt(stack)) { if (!this.moveItemStackTo(stack, 0, 1, false)) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/EnchantmentMenu.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/EnchantmentMenu.java.patch index 2e0248273..fd98074e2 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/EnchantmentMenu.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/EnchantmentMenu.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/EnchantmentMenu.java +++ b/net/minecraft/world/inventory/EnchantmentMenu.java -@@ -64,6 +_,22 @@ +@@ -63,6 +_,22 @@ return access.getLocation(); } // CraftBukkit end @@ -23,7 +23,7 @@ }; // Paper end - Add missing InventoryHolders this.access = access; -@@ -92,6 +_,16 @@ +@@ -83,6 +_,16 @@ return EnchantmentMenu.EMPTY_SLOT_LAPIS_LAZULI; } }); @@ -40,7 +40,7 @@ this.addStandardInventorySlots(inventory, 8, 84); this.addDataSlot(DataSlot.shared(this.costs, 0)); this.addDataSlot(DataSlot.shared(this.costs, 1)); -@@ -308,7 +_,7 @@ +@@ -301,7 +_,7 @@ @Override public void removed(final Player player) { super.removed(player); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/GrindstoneMenu.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/GrindstoneMenu.java.patch index a8d282a30..991143398 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/GrindstoneMenu.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/GrindstoneMenu.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/GrindstoneMenu.java +++ b/net/minecraft/world/inventory/GrindstoneMenu.java -@@ -105,11 +_,13 @@ +@@ -92,11 +_,13 @@ @Override public void onTake(final Player player, final ItemStack carried) { access.execute((level, pos) -> { @@ -15,7 +15,7 @@ // Paper end - Fire BlockExpEvent on grindstone use } -@@ -138,7 +_,7 @@ +@@ -125,7 +_,7 @@ for (Entry> entry : enchantments.entrySet()) { Holder enchant = entry.getKey(); int lvl = entry.getIntValue(); @@ -24,7 +24,7 @@ amount += enchant.value().getMinCost(lvl); } } -@@ -216,16 +_,76 @@ +@@ -205,16 +_,76 @@ for (Entry> entry : enchantments.entrySet()) { Holder enchant = entry.getKey(); @@ -103,7 +103,7 @@ ); if (item.is(Items.ENCHANTED_BOOK) && newEnchantments.isEmpty()) { item = item.transmuteCopy(Items.BOOK); -@@ -238,6 +_,22 @@ +@@ -227,6 +_,22 @@ } item.set(DataComponents.REPAIR_COST, repairCost); @@ -126,7 +126,7 @@ return item; } -@@ -294,7 +_,9 @@ +@@ -283,7 +_,9 @@ return ItemStack.EMPTY; } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/ItemCombinerMenu.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/ItemCombinerMenu.java.patch index 1676339c1..d469ec332 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/ItemCombinerMenu.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/inventory/ItemCombinerMenu.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/inventory/ItemCombinerMenu.java +++ b/net/minecraft/world/inventory/ItemCombinerMenu.java -@@ -177,7 +_,9 @@ +@@ -160,7 +_,9 @@ return ItemStack.EMPTY; } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/AxeItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/AxeItem.java.patch index e6715e6c5..995ce8a8a 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/AxeItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/AxeItem.java.patch @@ -1,41 +1,42 @@ --- a/net/minecraft/world/item/AxeItem.java +++ b/net/minecraft/world/item/AxeItem.java -@@ -65,13 +_,15 @@ - if (playerHasBlockingItemUseIntent(context)) { +@@ -66,14 +_,16 @@ return InteractionResult.PASS; - } else { -- Optional newBlock = this.evaluateNewBlockState(level, pos, player, level.getBlockState(pos)); -+ Optional newBlock = this.evaluateActionable(level, pos, player, level.getBlockState(pos)); // Purpur - Tool actionable options - if (newBlock.isEmpty()) { - return InteractionResult.PASS; - } else { -+ org.purpurmc.purpur.tool.Actionable actionable = newBlock.get(); // Purpur - Tool actionable options -+ BlockState state = actionable.into().withPropertiesOf(level.getBlockState(pos)); // Purpur - Tool actionable options - ItemStack itemInHand = context.getItemInHand(); - // Paper start - EntityChangeBlockEvent -- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, pos, newBlock.get())) { -+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, pos, state)) { // Purpur - Tool actionable options - return InteractionResult.PASS; - } - // Paper end -@@ -79,8 +_,15 @@ - CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger((ServerPlayer)player, pos, itemInHand); - } + } -- level.setBlock(pos, newBlock.get(), Block.UPDATE_ALL_IMMEDIATE); -- level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(player, newBlock.get())); -+ // Purpur start - Tool actionable options -+ level.setBlock(pos, state, Block.UPDATE_ALL_IMMEDIATE); -+ actionable.drops().forEach((drop, chance) -> { -+ if (level.getRandom().nextDouble() < chance) { -+ Block.popResourceFromFace(level, pos, context.getClickedFace(), new ItemStack(drop)); -+ } -+ }); -+ level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(player, state)); -+ // Purpur end - Tool actionable options - if (player != null) { - itemInHand.hurtAndBreak(1, player, context.getHand().asEquipmentSlot()); - } +- Optional newBlock = this.evaluateNewBlockState(level, pos, player, level.getBlockState(pos)); ++ Optional newBlock = this.evaluateActionable(level, pos, player, level.getBlockState(pos)); // Purpur - Tool actionable options + if (newBlock.isEmpty()) { + return InteractionResult.PASS; + } + ++ org.purpurmc.purpur.tool.Actionable actionable = newBlock.get(); // Purpur - Tool actionable options ++ BlockState state = actionable.into().withPropertiesOf(level.getBlockState(pos)); // Purpur - Tool actionable options + ItemStack itemInHand = context.getItemInHand(); + // Paper start - EntityChangeBlockEvent +- if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, pos, newBlock.get())) { ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(player, pos, state)) { // Purpur - Tool actionable options + return InteractionResult.PASS; + } + // Paper end +@@ -81,8 +_,15 @@ + CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger((ServerPlayer)player, pos, itemInHand); + } + +- level.setBlock(pos, newBlock.get(), Block.UPDATE_ALL_IMMEDIATE); +- level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(player, newBlock.get())); ++ // Purpur start - Tool actionable options ++ level.setBlock(pos, state, Block.UPDATE_ALL_IMMEDIATE); ++ actionable.drops().forEach((drop, chance) -> { ++ if (level.getRandom().nextDouble() < chance) { ++ Block.popResourceFromFace(level, pos, context.getClickedFace(), new ItemStack(drop)); ++ } ++ }); ++ level.gameEvent(GameEvent.BLOCK_CHANGE, pos, GameEvent.Context.of(player, state)); ++ // Purpur end - Tool actionable options + if (player != null) { + itemInHand.hurtAndBreak(1, player, context.getHand().asEquipmentSlot()); + } @@ -97,21 +_,23 @@ && !player.isSecondaryUseActive(); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BlockItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BlockItem.java.patch index 6121523c8..0d959576a 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BlockItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BlockItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java -@@ -132,7 +_,16 @@ +@@ -134,7 +_,16 @@ protected boolean updateCustomBlockEntityTag( final BlockPos pos, final Level level, final @Nullable Player player, final ItemStack itemStack, final BlockState placedState ) { @@ -18,15 +18,15 @@ } protected @Nullable BlockState getPlacementState(final BlockPlaceContext context) { -@@ -194,6 +_,7 @@ - } +@@ -197,6 +_,7 @@ + } - if (!type.onlyOpCanSetNbt() || player != null && (player.canUseGameMasterBlocks() || (player.getAbilities().instabuild && player.getBukkitEntity().hasPermission("minecraft.nbt.place")))) { // Spigot - add permission -+ if (!(level.purpurConfig.silkTouchEnabled && blockEntity instanceof net.minecraft.world.level.block.entity.SpawnerBlockEntity && player.getBukkitEntity().hasPermission("purpur.drop.spawners"))) // Purpur - Silk touch spawners - return customData.loadInto(blockEntity, level.registryAccess()); - } + if (!type.onlyOpCanSetNbt() || player != null && (player.canUseGameMasterBlocks() || (player.getAbilities().instabuild && player.getBukkitEntity().hasPermission("minecraft.nbt.place")))) { // Spigot - add permission ++ if (!(level.purpurConfig.silkTouchEnabled && blockEntity instanceof net.minecraft.world.level.block.entity.SpawnerBlockEntity && player.getBukkitEntity().hasPermission("purpur.drop.spawners"))) // Purpur - Silk touch spawners + return customData.loadInto(blockEntity, level.registryAccess()); + } -@@ -234,6 +_,7 @@ +@@ -236,6 +_,7 @@ public void onDestroyed(final ItemEntity entity) { ItemContainerContents container = entity.getItem().set(DataComponents.CONTAINER, ItemContainerContents.EMPTY); if (container != null) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BowItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BowItem.java.patch index e6aaabf5c..2da33f90a 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BowItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BowItem.java.patch @@ -11,16 +11,16 @@ + // Purpur end - Infinity bow settings if (projectile.isEmpty()) { return false; - } else { -@@ -38,7 +_,7 @@ - } else { - List firedProjectiles = draw(itemStack, projectile, player); - if (level instanceof ServerLevel serverLevel && !firedProjectiles.isEmpty()) { -- this.shoot(serverLevel, player, player.getUsedItemHand(), itemStack, firedProjectiles, pow * 3.0F, 1.0F, pow == 1.0F, null, pow); // Paper - Pass draw strength -+ this.shoot(serverLevel, player, player.getUsedItemHand(), itemStack, firedProjectiles, pow * 3.0F, (float) serverLevel.purpurConfig.bowProjectileOffset, pow == 1.0F, null, pow); // Paper - Pass draw strength // Purpur - Projectile offset config - } + } +@@ -40,7 +_,7 @@ - level.playSound( + List firedProjectiles = draw(itemStack, projectile, player); + if (level instanceof ServerLevel serverLevel && !firedProjectiles.isEmpty()) { +- this.shoot(serverLevel, player, player.getUsedItemHand(), itemStack, firedProjectiles, pow * 3.0F, 1.0F, pow == 1.0F, null, pow); // Paper - Pass draw strength ++ this.shoot(serverLevel, player, player.getUsedItemHand(), itemStack, firedProjectiles, pow * 3.0F, (float) serverLevel.purpurConfig.bowProjectileOffset, pow == 1.0F, null, pow); // Paper - Pass draw strength // Purpur - Projectile offset config + } + + level.playSound( @@ -95,7 +_,7 @@ public InteractionResult use(final Level level, final Player player, final InteractionHand hand) { ItemStack itemStack = player.getItemInHand(hand); @@ -28,5 +28,5 @@ - if (!player.hasInfiniteMaterials() && !foundProjectile) { + if (!player.hasInfiniteMaterials() && !foundProjectile && !(level.purpurConfig.infinityWorksWithoutArrows && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.INFINITY, itemStack) > 0)) { // Purpur - Infinity bow settings return InteractionResult.FAIL; - } else { - player.startUsingItem(hand); + } + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BucketItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BucketItem.java.patch index e73f1140a..5f620b3e4 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BucketItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/BucketItem.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/item/BucketItem.java +++ b/net/minecraft/world/item/BucketItem.java -@@ -146,7 +_,7 @@ - // CraftBukkit end - if (!canPlaceFluidInsideBlock) { +@@ -152,7 +_,7 @@ return hitResult != null && this.emptyContents(user, level, hitResult.getBlockPos().relative(hitResult.getDirection()), null, direction, clicked, itemStack, hand); // CraftBukkit -- } else if (level.environmentAttributes().getValue(EnvironmentAttributes.WATER_EVAPORATES, pos) && this.content.is(FluidTags.WATER)) { -+ } else if ((level.environmentAttributes().getValue(EnvironmentAttributes.WATER_EVAPORATES, pos) || (level.isTheEnd() && !org.purpurmc.purpur.PurpurConfig.allowWaterPlacementInTheEnd)) && this.content.is(FluidTags.WATER)) { // Purpur - Add allow water in end world option + } + +- if (level.environmentAttributes().getValue(EnvironmentAttributes.WATER_EVAPORATES, pos) && this.content.is(FluidTags.WATER)) { ++ if ((level.environmentAttributes().getValue(EnvironmentAttributes.WATER_EVAPORATES, pos) || (level.isTheEnd() && !org.purpurmc.purpur.PurpurConfig.allowWaterPlacementInTheEnd)) && this.content.is(FluidTags.WATER)) { // Purpur - Add allow water in end world option int x = pos.getX(); int y = pos.getY(); int z = pos.getZ(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/DyeColor.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/DyeColor.java.patch index a60285f13..e5e6a6ce2 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/DyeColor.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/DyeColor.java.patch @@ -1,8 +1,8 @@ --- a/net/minecraft/world/item/DyeColor.java +++ b/net/minecraft/world/item/DyeColor.java @@ -154,4 +_,10 @@ - } - } + + return null; } + + // Purpur start - Shulker spawn from bullet options diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EndCrystalItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EndCrystalItem.java.patch index ebe8fc052..0e9ee79d9 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EndCrystalItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/EndCrystalItem.java.patch @@ -7,5 +7,5 @@ - if (!blockState.is(Blocks.OBSIDIAN) && !blockState.is(Blocks.BEDROCK)) { + if (!level.purpurConfig.endCrystalPlaceAnywhere && !blockState.is(Blocks.OBSIDIAN) && !blockState.is(Blocks.BEDROCK)) { // Purpur - place end crystal on any block return InteractionResult.FAIL; - } else { - BlockPos above = pos.above(); + } + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/HoeItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/HoeItem.java.patch index 1e7e34eab..34b5f3ccf 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/HoeItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/HoeItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/HoeItem.java +++ b/net/minecraft/world/item/HoeItem.java -@@ -44,15 +_,25 @@ +@@ -44,16 +_,26 @@ public InteractionResult useOn(final UseOnContext context) { Level level = context.getLevel(); BlockPos pos = context.getClickedPos(); @@ -11,23 +11,24 @@ + org.purpurmc.purpur.tool.Tillable tillable = level.purpurConfig.hoeTillables.get(clickedBlock); + if (tillable == null) { return InteractionResult.PASS; - } else { -- Predicate predicate = logicPair.getFirst(); -- Consumer action = logicPair.getSecond(); -+ Predicate predicate = tillable.condition().predicate(); -+ Consumer action = (ctx) -> { -+ level.setBlock(pos, tillable.into().defaultBlockState(), 11); -+ tillable.drops().forEach((drop, chance) -> { -+ if (level.getRandom().nextDouble() < chance) { -+ Block.popResourceFromFace(level, pos, ctx.getClickedFace(), new ItemStack(drop)); -+ } -+ }); -+ }; -+ // Purpur end - Tool actionable options - if (predicate.test(context)) { - Player player = context.getPlayer(); -- level.playSound(player, pos, SoundEvents.HOE_TILL, SoundSource.BLOCKS, 1.0F, 1.0F); -+ if (!TILLABLES.containsKey(clickedBlock)) level.playSound(null, pos, SoundEvents.HOE_TILL, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - Tool actionable options - force sound - if (!level.isClientSide()) { - action.accept(context); - if (player != null) { + } + +- Predicate predicate = logicPair.getFirst(); +- Consumer action = logicPair.getSecond(); ++ Predicate predicate = tillable.condition().predicate(); ++ Consumer action = (ctx) -> { ++ level.setBlock(pos, tillable.into().defaultBlockState(), 11); ++ tillable.drops().forEach((drop, chance) -> { ++ if (level.getRandom().nextDouble() < chance) { ++ Block.popResourceFromFace(level, pos, ctx.getClickedFace(), new ItemStack(drop)); ++ } ++ }); ++ }; ++ // Purpur end - Tool actionable options + if (predicate.test(context)) { + Player player = context.getPlayer(); +- level.playSound(player, pos, SoundEvents.HOE_TILL, SoundSource.BLOCKS, 1.0F, 1.0F); ++ if (!TILLABLES.containsKey(clickedBlock)) level.playSound(null, pos, SoundEvents.HOE_TILL, SoundSource.BLOCKS, 1.0F, 1.0F); // Purpur - Tool actionable options - force sound + if (!level.isClientSide()) { + action.accept(context); + if (player != null) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ItemStack.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ItemStack.java.patch index 13a5ae0f2..e28c7e6a2 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ItemStack.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ItemStack.java.patch @@ -1,21 +1,21 @@ --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java -@@ -452,6 +_,7 @@ - // revert back all captured blocks - for (org.bukkit.block.BlockState blockstate : blocks) { - ((org.bukkit.craftbukkit.block.CraftBlockState) blockstate).revertPlace(); -+ ((org.bukkit.craftbukkit.block.CraftBlock) blockstate.getBlock()).getBlockState().getBlock().forgetPlacer(); // Purpur - Store placer on Block when placed - } +@@ -453,6 +_,7 @@ + // revert back all captured blocks + for (org.bukkit.block.BlockState blockstate : blocks) { + ((org.bukkit.craftbukkit.block.CraftBlockState) blockstate).revertPlace(); ++ ((org.bukkit.craftbukkit.block.CraftBlock) blockstate.getBlock()).getBlockState().getBlock().forgetPlacer(); // Purpur - Store placer on Block when placed + } - SignItem.openSign = null; // SPIGOT-6758 - Reset on early return -@@ -475,6 +_,7 @@ - if (!(block.getBlock() instanceof net.minecraft.world.level.block.BaseEntityBlock)) { // Containers get placed automatically - block.onPlace(level, newPos, oldBlock, true, context); - } -+ block.getBlock().forgetPlacer(); // Purpur - Store placer on Block when placed - - level.notifyAndUpdatePhysics(newPos, null, oldBlock, block, level.getBlockState(newPos), updateFlags, net.minecraft.world.level.block.Block.UPDATE_LIMIT); // send null chunk as chunk.k() returns false by this point + SignItem.openSign = null; // SPIGOT-6758 - Reset on early return +@@ -476,6 +_,7 @@ + if (!(block.getBlock() instanceof net.minecraft.world.level.block.BaseEntityBlock)) { // Containers get placed automatically + block.onPlace(level, newPos, oldBlock, true, context); } ++ block.getBlock().forgetPlacer(); // Purpur - Store placer on Block when placed + + level.notifyAndUpdatePhysics(newPos, null, oldBlock, block, level.getBlockState(newPos), updateFlags, net.minecraft.world.level.block.Block.UPDATE_LIMIT); // send null chunk as chunk.k() returns false by this point + } @@ -591,6 +_,26 @@ return this.isDamageableItem() && this.getDamageValue() > 0; } @@ -43,7 +43,7 @@ public int getDamageValue() { return Mth.clamp(this.getOrDefault(DataComponents.DAMAGE, 0), 0, this.getMaxDamage()); } -@@ -1246,6 +_,12 @@ +@@ -1254,6 +_,12 @@ public boolean isEnchanted() { return !this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY).isEmpty(); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ProjectileWeaponItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ProjectileWeaponItem.java.patch index 4b5ba7adb..32e72de1a 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ProjectileWeaponItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ProjectileWeaponItem.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/item/ProjectileWeaponItem.java +++ b/net/minecraft/world/item/ProjectileWeaponItem.java @@ -114,6 +_,8 @@ - arrowx.setCritArrow(true); + arrow.setCritArrow(true); } -+ arrowx.setActualEnchantments(weapon.getEnchantments()); // Purpur - Add an option to fix MC-3304 projectile looting ++ arrow.setActualEnchantments(weapon.getEnchantments()); // Purpur - Add an option to fix MC-3304 projectile looting + - return arrowx; + return arrow; } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ShovelItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ShovelItem.java.patch index 56e3343c4..99fb2b691 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ShovelItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/ShovelItem.java.patch @@ -1,17 +1,18 @@ --- a/net/minecraft/world/item/ShovelItem.java +++ b/net/minecraft/world/item/ShovelItem.java -@@ -46,9 +_,12 @@ - BlockState newState = FLATTENABLES.get(blockState.getBlock()); - BlockState updatedState = null; - Runnable afterAction = null; // Paper -+ org.purpurmc.purpur.tool.Flattenable flattenable = level.purpurConfig.shovelFlattenables.get(blockState.getBlock()); // Purpur - Tool actionable options - if (newState != null && level.getBlockState(pos.above()).isAir()) { -- afterAction = () -> level.playSound(player, pos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); // Paper -- updatedState = newState; +@@ -47,9 +_,12 @@ + BlockState newState = FLATTENABLES.get(blockState.getBlock()); + BlockState updatedState = null; + Runnable afterAction = null; // Paper +- if (newState != null && level.getBlockState(pos.above()).isAir()) { +- afterAction = () -> level.playSound(player, pos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F); // Paper +- updatedState = newState; ++ org.purpurmc.purpur.tool.Flattenable flattenable = level.purpurConfig.shovelFlattenables.get(blockState.getBlock()); // Purpur - Tool actionable options ++ if (newState != null && level.getBlockState(pos.above()).isAir()) { + // Purpur start - Tool actionable options -+ afterAction = () -> {if (!FLATTENABLES.containsKey(blockState.getBlock())) level.playSound(player, pos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F);}; // Paper -+ updatedState = flattenable.into().defaultBlockState(); ++ afterAction = () -> {if (!FLATTENABLES.containsKey(blockState.getBlock())) level.playSound(player, pos, SoundEvents.SHOVEL_FLATTEN, SoundSource.BLOCKS, 1.0F, 1.0F);}; // Paper ++ updatedState = flattenable.into().defaultBlockState(); + // Purpur end - Tool actionable options - } else if (blockState.getBlock() instanceof CampfireBlock && blockState.getValue(CampfireBlock.LIT)) { - afterAction = () -> { // Paper - if (!level.isClientSide()) { + } else if (blockState.getBlock() instanceof CampfireBlock && blockState.getValue(CampfireBlock.LIT)) { + afterAction = () -> { // Paper + if (!level.isClientSide()) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SpawnEggItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SpawnEggItem.java.patch index b092b25fb..705575fa3 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SpawnEggItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/SpawnEggItem.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/item/SpawnEggItem.java +++ b/net/minecraft/world/item/SpawnEggItem.java -@@ -62,6 +_,23 @@ +@@ -64,6 +_,23 @@ return InteractionResult.FAIL; } else { if (level.paperConfig().entities.spawning.disableMobSpawnerSpawnEggTransformation) return InteractionResult.FAIL; // Paper - Allow disabling mob spawner spawn egg transformation diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/TridentItem.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/TridentItem.java.patch index d81323526..96f3a4b19 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/TridentItem.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/TridentItem.java.patch @@ -1,19 +1,19 @@ --- a/net/minecraft/world/item/TridentItem.java +++ b/net/minecraft/world/item/TridentItem.java -@@ -82,7 +_,7 @@ - if (riptideStrength == 0.0F) { - ItemStack thrownItemStack = itemStack.copyWithCount(1); // Paper - Projectile.Delayed tridentDelayed = Projectile.spawnProjectileFromRotationDelayed( // Paper - PlayerLaunchProjectileEvent( -- ThrownTrident::new, serverLevel, thrownItemStack, player, 0.0F, 2.5F, 1.0F -+ ThrownTrident::new, serverLevel, thrownItemStack, player, 0.0F, 2.5F, (float) serverLevel.purpurConfig.tridentProjectileOffset // Purpur - Projectile offset config - ); - // Paper start - PlayerLaunchProjectileEvent - com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) tridentDelayed.projectile().getBukkitEntity()); -@@ -92,6 +_,7 @@ - return false; - } - ThrownTrident trident = tridentDelayed.projectile(); // Paper - PlayerLaunchProjectileEvent -+ trident.setActualEnchantments(itemStack.getEnchantments()); // Purpur - Add an option to fix MC-3304 projectile looting - if (event.shouldConsume()) { - thrownItemStack.hurtWithoutBreaking(1, player); // Paper - PlayerLaunchProjectileEvent - use thrownItemStack; pickup item damage - } +@@ -84,7 +_,7 @@ + if (riptideStrength == 0.0F) { + ItemStack thrownItemStack = itemStack.copyWithCount(1); // Paper + Projectile.Delayed tridentDelayed = Projectile.spawnProjectileFromRotationDelayed( // Paper - PlayerLaunchProjectileEvent( +- ThrownTrident::new, serverLevel, thrownItemStack, player, 0.0F, 2.5F, 1.0F ++ ThrownTrident::new, serverLevel, thrownItemStack, player, 0.0F, 2.5F, (float) serverLevel.purpurConfig.tridentProjectileOffset // Purpur - Projectile offset config + ); + // Paper start - PlayerLaunchProjectileEvent + com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent event = new com.destroystokyo.paper.event.player.PlayerLaunchProjectileEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Projectile) tridentDelayed.projectile().getBukkitEntity()); +@@ -94,6 +_,7 @@ + return false; + } + ThrownTrident trident = tridentDelayed.projectile(); // Paper - PlayerLaunchProjectileEvent ++ trident.setActualEnchantments(itemStack.getEnchantments()); // Purpur - Add an option to fix MC-3304 projectile looting + if (event.shouldConsume()) { + thrownItemStack.hurtWithoutBreaking(1, player); // Paper - PlayerLaunchProjectileEvent - use thrownItemStack; pickup item damage + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/crafting/Ingredient.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/crafting/Ingredient.java.patch index 0a3dce436..82581772d 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/item/crafting/Ingredient.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/item/crafting/Ingredient.java.patch @@ -8,7 +8,7 @@ public boolean isExact() { return this.itemStacks != null; -@@ -86,6 +_,11 @@ +@@ -88,6 +_,11 @@ return this.itemStacks.contains(input); // Paper - Improve exact choice recipe ingredients (hashing FTW!) } // CraftBukkit end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch index dc2f672c0..7e083fcae 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/Level.java.patch @@ -64,7 +64,7 @@ this.generator = generator; this.world = new CraftWorld((ServerLevel) this, worldKey, biomeProvider, environment); -@@ -2194,4 +_,14 @@ +@@ -2197,4 +_,14 @@ return this.moonrise$getEntityLookup().getEntityCount(); // Paper - rewrite chunk system } // Paper end - allow patching this logic diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java.patch index 92cdbe3f9..e5eb534e3 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BaseCoralPlantTypeBlock.java.patch @@ -7,4 +7,4 @@ + if (!((net.minecraft.world.level.LevelAccessor) level).getMinecraftWorld().purpurConfig.coralDieOutsideWater) return true; // Purpur - Config to not let coral die if (state.getValue(WATERLOGGED)) { return true; - } else { + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BaseFireBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BaseFireBlock.java.patch index 380ceb5b8..7f13bf913 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BaseFireBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BaseFireBlock.java.patch @@ -1,11 +1,11 @@ --- a/net/minecraft/world/level/block/BaseFireBlock.java +++ b/net/minecraft/world/level/block/BaseFireBlock.java -@@ -215,7 +_,7 @@ - boolean hasObsidian = false; +@@ -216,7 +_,7 @@ + boolean hasObsidian = false; - for (Direction face : Direction.values()) { -- if (level.getBlockState(testPos.set(pos).move(face)).is(Blocks.OBSIDIAN)) { -+ if (PortalShape.FRAME.test(level.getBlockState(testPos.set(pos).move(face)), level, testPos)) { // Purpur - Crying obsidian valid for portal frames - hasObsidian = true; - break; - } + for (Direction face : Direction.values()) { +- if (level.getBlockState(testPos.set(pos).move(face)).is(Blocks.OBSIDIAN)) { ++ if (PortalShape.FRAME.test(level.getBlockState(testPos.set(pos).move(face)), level, testPos)) { // Purpur - Crying obsidian valid for portal frames + hasObsidian = true; + break; + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BedBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BedBlock.java.patch index 7ddb5d798..145df99a1 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BedBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/BedBlock.java.patch @@ -1,20 +1,20 @@ --- a/net/minecraft/world/level/block/BedBlock.java +++ b/net/minecraft/world/level/block/BedBlock.java -@@ -100,7 +_,7 @@ - } +@@ -101,7 +_,7 @@ + } - Vec3 boomPos = pos.getCenter(); -- level.explode(null, level.damageSources().badRespawnPointExplosion(boomPos), null, boomPos, 5.0F, true, Level.ExplosionInteraction.BLOCK); -+ if (level.purpurConfig.bedExplode) level.explode(null, level.damageSources().badRespawnPointExplosion(boomPos), null, boomPos, (float) level.purpurConfig.bedExplosionPower, level.purpurConfig.bedExplosionFire, level.purpurConfig.bedExplosionEffect); // Purpur - Implement bed explosion options - return InteractionResult.SUCCESS_SERVER; - } else if (state.getValue(OCCUPIED)) { - if (bedRule.explodes()) return this.explodeBed(state, level, pos); // Paper - check explode first + Vec3 boomPos = pos.getCenter(); +- level.explode(null, level.damageSources().badRespawnPointExplosion(boomPos), null, boomPos, 5.0F, true, Level.ExplosionInteraction.BLOCK); ++ if (level.purpurConfig.bedExplode) level.explode(null, level.damageSources().badRespawnPointExplosion(boomPos), null, boomPos, (float) level.purpurConfig.bedExplosionPower, level.purpurConfig.bedExplosionFire, level.purpurConfig.bedExplosionEffect); // Purpur - Implement bed explosion options + return InteractionResult.SUCCESS_SERVER; + } else if (state.getValue(OCCUPIED)) { + if (bedRule.explodes()) return this.explodeBed(state, level, pos); // Paper - check explode first @@ -153,7 +_,7 @@ } - Vec3 center = pos.getCenter(); -- level.explode(null, level.damageSources().badRespawnPointExplosion(center).causingBlockSnapshot(blockState), null, center, 5.0F, true, Level.ExplosionInteraction.BLOCK); // CraftBukkit - add state -+ if (level.purpurConfig.bedExplode) level.explode(null, level.damageSources().badRespawnPointExplosion(center).causingBlockSnapshot(blockState), null, center, (float) level.purpurConfig.bedExplosionPower, level.purpurConfig.bedExplosionFire, level.purpurConfig.bedExplosionEffect); // CraftBukkit - add state // Purpur - Implement bed explosion options + Vec3 boomPos = pos.getCenter(); +- level.explode(null, level.damageSources().badRespawnPointExplosion(boomPos).causingBlockSnapshot(blockState), null, boomPos, 5.0F, true, Level.ExplosionInteraction.BLOCK); // CraftBukkit - add state ++ if (level.purpurConfig.bedExplode) level.explode(null, level.damageSources().badRespawnPointExplosion(boomPos).causingBlockSnapshot(blockState), null, boomPos, (float) level.purpurConfig.bedExplosionPower, level.purpurConfig.bedExplosionFire, level.purpurConfig.bedExplosionEffect); // CraftBukkit - add state // Purpur - Implement bed explosion options return InteractionResult.SUCCESS_SERVER; } // CraftBukkit end diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/Block.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/Block.java.patch index 05fc4daf6..985f77d60 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/Block.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/Block.java.patch @@ -11,7 +11,7 @@ // Paper start - Protect Bedrock and End Portal/Frames from being destroyed public final boolean isDestroyable() { return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits || -@@ -411,7 +_,7 @@ +@@ -415,7 +_,7 @@ event.setExpToDrop(block.getExpDrop(state, serverLevel, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping event.callEvent(); for (org.bukkit.inventory.ItemStack drop : event.getDrops()) { @@ -20,7 +20,7 @@ } state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping block.popExperience(serverLevel, pos, event.getExpToDrop()); // Paper - Properly handle xp dropping -@@ -429,7 +_,7 @@ +@@ -433,7 +_,7 @@ public static void dropResources(final BlockState state, final LevelAccessor level, final BlockPos pos, final @Nullable BlockEntity blockEntity) { if (level instanceof ServerLevel serverLevel) { @@ -29,7 +29,7 @@ state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, true); } } -@@ -450,11 +_,30 @@ +@@ -454,11 +_,30 @@ , final boolean dropExperience // Paper - Properly handle xp dropping ) { if (level instanceof ServerLevel serverLevel) { @@ -61,7 +61,7 @@ public static void popResource(final Level level, final BlockPos pos, final ItemStack itemStack) { double halfHeight = EntityType.ITEM.getHeight() / 2.0; RandomSource random = level.getRandom(); -@@ -544,7 +_,15 @@ +@@ -548,7 +_,15 @@ } public void setPlacedBy(final Level level, final BlockPos pos, final BlockState state, final @Nullable LivingEntity by, final ItemStack itemStack) { @@ -78,7 +78,7 @@ public boolean isPossibleToRespawnInThis(final BlockState state) { return !state.isSolid() && !state.liquid(); -@@ -555,7 +_,7 @@ +@@ -559,7 +_,7 @@ } public void fallOn(final Level level, final BlockState state, final BlockPos pos, final Entity entity, final double fallDistance) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CakeBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CakeBlock.java.patch index 2ae18d122..686b3392f 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CakeBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/CakeBlock.java.patch @@ -1,10 +1,10 @@ --- a/net/minecraft/world/level/block/CakeBlock.java +++ b/net/minecraft/world/level/block/CakeBlock.java -@@ -118,6 +_,7 @@ - org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(player, 2 + oldFoodLevel); +@@ -119,6 +_,7 @@ + org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(player, 2 + oldFoodLevel); - if (!event.isCancelled()) { -+ if (player.level().purpurConfig.playerBurpWhenFull && event.getFoodLevel() == 20 && oldFoodLevel < 20) player.burpDelay = player.level().purpurConfig.playerBurpDelay; // Purpur - Burp after eating food fills hunger bar completely - player.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 0.1F); - } + if (!event.isCancelled()) { ++ if (player.level().purpurConfig.playerBurpWhenFull && event.getFoodLevel() == 20 && oldFoodLevel < 20) player.burpDelay = player.level().purpurConfig.playerBurpDelay; // Purpur - Burp after eating food fills hunger bar completely + player.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 0.1F); + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ChestBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ChestBlock.java.patch index f911caf3f..f98e35878 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ChestBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/ChestBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/ChestBlock.java +++ b/net/minecraft/world/level/block/ChestBlock.java -@@ -352,6 +_,7 @@ +@@ -347,6 +_,7 @@ } public static boolean isBlockedChestByBlock(final BlockGetter level, final BlockPos pos) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/DoorBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/DoorBlock.java.patch index 25e12bd27..2dfb91a08 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/DoorBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/DoorBlock.java.patch @@ -1,13 +1,14 @@ --- a/net/minecraft/world/level/block/DoorBlock.java +++ b/net/minecraft/world/level/block/DoorBlock.java -@@ -200,6 +_,7 @@ +@@ -200,7 +_,7 @@ protected InteractionResult useWithoutItem(BlockState state, final Level level, final BlockPos pos, final Player player, final BlockHitResult hitResult) { if (!this.type.canOpenByHand()) { return InteractionResult.PASS; -+ } else if (requiresRedstone(level, state, pos)) { return InteractionResult.CONSUME; // Purpur - Option to make doors require redstone - } else { - state = state.cycle(OPEN); - level.setBlock(pos, state, Block.UPDATE_CLIENTS | Block.UPDATE_IMMEDIATE); +- } ++ } else if (requiresRedstone(level, state, pos)) { return InteractionResult.CONSUME; } // Purpur - Option to make doors require redstone + + state = state.cycle(OPEN); + level.setBlock(pos, state, Block.UPDATE_CLIENTS | Block.UPDATE_IMMEDIATE); @@ -280,4 +_,18 @@ public static boolean isWoodenDoor(final BlockState state) { return state.getBlock() instanceof DoorBlock door && door.type().canOpenByHand(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/PointedDripstoneBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/PointedDripstoneBlock.java.patch index e194d2759..56c4112a3 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/PointedDripstoneBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/PointedDripstoneBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/PointedDripstoneBlock.java +++ b/net/minecraft/world/level/block/PointedDripstoneBlock.java -@@ -194,20 +_,20 @@ +@@ -196,20 +_,20 @@ @VisibleForTesting public static void maybeTransferFluid(final BlockState state, final ServerLevel level, final BlockPos pos, final float randomValue) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/PoweredRailBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/PoweredRailBlock.java.patch index 3f1ed1d51..d9ad7371b 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/PoweredRailBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/PoweredRailBlock.java.patch @@ -7,5 +7,5 @@ - if (searchDepth >= 8) { + if (searchDepth >= level.purpurConfig.railActivationRange) { // Purpur - Config for powered rail activation distance return false; - } else { - int x = pos.getX(); + } + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/RespawnAnchorBlock.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/RespawnAnchorBlock.java.patch index 6108d0a7f..e3e9ac4e4 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/RespawnAnchorBlock.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/RespawnAnchorBlock.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/RespawnAnchorBlock.java +++ b/net/minecraft/world/level/block/RespawnAnchorBlock.java -@@ -180,7 +_,7 @@ +@@ -176,7 +_,7 @@ } }; Vec3 boomPos = pos.getCenter(); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch index 33b63b877..1eac4c298 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java +++ b/net/minecraft/world/level/block/entity/AbstractFurnaceBlockEntity.java -@@ -195,6 +_,21 @@ +@@ -190,6 +_,21 @@ } ItemStack fuel = entity.items.get(1); @@ -22,7 +22,7 @@ ItemStack ingredient = entity.items.get(0); boolean hasIngredient = !ingredient.isEmpty(); boolean hasFuel = !fuel.isEmpty(); -@@ -273,6 +_,8 @@ +@@ -268,6 +_,8 @@ if (changed) { setChanged(level, pos, state); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch index 0c71cdd3f..cbf2b09ce 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeaconBlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/BeaconBlockEntity.java +++ b/net/minecraft/world/level/block/entity/BeaconBlockEntity.java -@@ -142,6 +_,16 @@ +@@ -138,6 +_,16 @@ public double getEffectRange() { if (this.effectRange < 0) { @@ -17,7 +17,7 @@ return this.levels * 10 + 10; } else { return effectRange; -@@ -170,6 +_,7 @@ +@@ -166,6 +_,7 @@ int y = pos.getY(); int z = pos.getZ(); BlockPos checkPos; @@ -25,7 +25,7 @@ if (entity.lastCheckY < y) { checkPos = pos; entity.checkingBeamSections = Lists.newArrayList(); -@@ -199,11 +_,15 @@ +@@ -195,11 +_,15 @@ } } } else { @@ -42,7 +42,7 @@ lastBeamSection.increaseHeight(); } -@@ -214,11 +_,11 @@ +@@ -210,11 +_,11 @@ int previousLevels = entity.levels; if (level.getGameTime() % 80L == 0L) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch index bfd5d59ec..959ae3309 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BeehiveBlockEntity.java.patch @@ -9,7 +9,7 @@ private static final int MIN_TICKS_BEFORE_REENTERING_HIVE = 400; private static final int MIN_OCCUPATION_TICKS_NECTAR = 2400; public static final int MIN_OCCUPATION_TICKS_NECTARLESS = 600; -@@ -157,11 +_,33 @@ +@@ -157,10 +_,32 @@ return spawned; } @@ -33,24 +33,12 @@ public int getOccupantCount() { return this.stored.size(); } - ++ + // Purpur start - Stored Bee API + public List getStored() { + return stored; + } + // Purpur end - Stored Bee API -+ + // Paper start - Add EntityBlockStorage clearEntities public void clearBees() { - this.stored.clear(); -@@ -400,8 +_,8 @@ - registration.register(DebugSubscriptions.BEE_HIVES, () -> DebugHiveInfo.pack(this)); - } - -- private static class BeeData { -- private final BeehiveBlockEntity.Occupant occupant; -+ public static class BeeData { // Purpur - make public - Stored Bee API -+ public final BeehiveBlockEntity.Occupant occupant; // Purpur - make public - Stored Bee API - private int exitTickCounter; // Paper - Fix bees aging inside hives; separate counter for checking if bee should exit to reduce exit attempts - private int ticksInHive; - diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch index 6ff5f9eee..64de71dc0 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/BlockEntity.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/block/entity/BlockEntity.java +++ b/net/minecraft/world/level/block/entity/BlockEntity.java -@@ -108,6 +_,10 @@ +@@ -107,6 +_,10 @@ input.read("PublicBukkitValues", CompoundTag.CODEC) .ifPresent(this.persistentDataContainer::putAll); // Paper end - read persistent data container @@ -11,7 +11,7 @@ } public final void loadWithComponents(final ValueInput input) { -@@ -120,6 +_,11 @@ +@@ -119,6 +_,11 @@ } protected void saveAdditional(final ValueOutput output) { @@ -23,7 +23,7 @@ } public final CompoundTag saveWithFullMetadata(final HolderLookup.Provider registries) { -@@ -414,4 +_,16 @@ +@@ -395,4 +_,16 @@ return this.blockEntity.getNameForReporting() + "@" + this.blockEntity.getBlockPos(); } } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch index 9045cab6c..885c263fc 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/ConduitBlockEntity.java.patch @@ -1,7 +1,7 @@ --- a/net/minecraft/world/level/block/entity/ConduitBlockEntity.java +++ b/net/minecraft/world/level/block/entity/ConduitBlockEntity.java -@@ -150,7 +_,7 @@ - BlockPos testPos = worldPosition.offset(ox, oy, ozx); +@@ -151,7 +_,7 @@ + BlockPos testPos = worldPosition.offset(ox, oy, oz); BlockState testBlock = level.getBlockState(testPos); - for (Block type : VALID_BLOCKS) { @@ -9,7 +9,7 @@ if (testBlock.is(type)) { effectBlocks.add(testPos); } -@@ -165,13 +_,13 @@ +@@ -166,13 +_,13 @@ private static void applyEffects(final Level level, final BlockPos worldPosition, final List effectBlocks) { // CraftBukkit start @@ -26,7 +26,7 @@ // CraftBukkit start return effectRange; } -@@ -204,7 +_,7 @@ +@@ -205,7 +_,7 @@ EntityReference newDestroyTarget = updateDestroyTarget(entity.destroyTarget, level, worldPosition, isActive); LivingEntity targetEntity = EntityReference.getLivingEntity(newDestroyTarget, level); if (damageTarget && targetEntity != null) { // CraftBukkit @@ -35,13 +35,12 @@ level.playSound( null, targetEntity.getX(), targetEntity.getY(), targetEntity.getZ(), SoundEvents.CONDUIT_ATTACK_TARGET, SoundSource.BLOCKS, 1.0F, 1.0F ); -@@ -225,19 +_,25 @@ - return selectNewTarget(level, pos); - } else { - LivingEntity targetEntity = EntityReference.getLivingEntity(target, level); -- return targetEntity != null && targetEntity.isAlive() && pos.closerThan(targetEntity.blockPosition(), 8.0) ? target : null; -+ return targetEntity != null && targetEntity.isAlive() && pos.closerThan(targetEntity.blockPosition(), level.purpurConfig.conduitDamageDistance) ? target : null; // Purpur - Conduit behavior configuration +@@ -229,18 +_,24 @@ } + + LivingEntity targetEntity = EntityReference.getLivingEntity(target, level); +- return targetEntity != null && targetEntity.isAlive() && pos.closerThan(targetEntity.blockPosition(), 8.0) ? target : null; ++ return targetEntity != null && targetEntity.isAlive() && pos.closerThan(targetEntity.blockPosition(), level.purpurConfig.conduitDamageDistance) ? target : null; // Purpur - Conduit behavior configuration } private static @Nullable EntityReference selectNewTarget(final ServerLevel level, final BlockPos pos) { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch index 6d04e685d..66b299519 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/entity/SignBlockEntity.java.patch @@ -35,7 +35,7 @@ ); } } -@@ -309,6 +_,27 @@ +@@ -310,6 +_,27 @@ commandSource, Vec3.atCenterOf(pos), Vec2.ZERO, level, LevelBasedPermissionSet.GAMEMASTER, textName, displayName, level.getServer(), player // Paper - Fix commands from signs not firing command events ); } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/piston/PistonStructureResolver.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/piston/PistonStructureResolver.java.patch index d021a25df..674aca959 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/piston/PistonStructureResolver.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/block/piston/PistonStructureResolver.java.patch @@ -1,29 +1,29 @@ --- a/net/minecraft/world/level/block/piston/PistonStructureResolver.java +++ b/net/minecraft/world/level/block/piston/PistonStructureResolver.java -@@ -81,7 +_,7 @@ - return true; - } else { - int blockCount = 1; -- if (blockCount + this.toPush.size() > 12) { -+ if (blockCount + this.toPush.size() > this.level.purpurConfig.pistonBlockPushLimit) { // Purpur - Configurable piston push limit +@@ -90,7 +_,7 @@ + } + + int blockCount = 1; +- if (blockCount + this.toPush.size() > 12) { ++ if (blockCount + this.toPush.size() > this.level.purpurConfig.pistonBlockPushLimit) { // Purpur - Configurable piston push limit + return false; + } + +@@ -105,7 +_,7 @@ + break; + } + +- if (++blockCount + this.toPush.size() > 12) { ++ if (++blockCount + this.toPush.size() > this.level.purpurConfig.pistonBlockPushLimit) { // Purpur - Configurable piston push limit return false; - } else { - while (isSticky(nextState)) { -@@ -95,7 +_,7 @@ - break; - } + } + } +@@ -149,7 +_,7 @@ + return true; + } -- if (++blockCount + this.toPush.size() > 12) { -+ if (++blockCount + this.toPush.size() > this.level.purpurConfig.pistonBlockPushLimit) { // Purpur - Configurable piston push limit - return false; - } - } -@@ -139,7 +_,7 @@ - return true; - } - -- if (this.toPush.size() >= 12) { -+ if (this.toPush.size() >= this.level.purpurConfig.pistonBlockPushLimit) { // Purpur - Configurable piston push limit - return false; - } +- if (this.toPush.size() >= 12) { ++ if (this.toPush.size() >= this.level.purpurConfig.pistonBlockPushLimit) { // Purpur - Configurable piston push limit + return false; + } diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch index a94e445ad..40fdcd525 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/EntityStorage.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/chunk/storage/EntityStorage.java +++ b/net/minecraft/world/level/chunk/storage/EntityStorage.java -@@ -108,6 +_,7 @@ +@@ -105,6 +_,7 @@ } // Paper end - Entity load/save limit per chunk TagValueOutput output = TagValueOutput.createWithContext(reporter.forChild(e.problemPath()), e.registryAccess()); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch index a49716364..0c50605e5 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/chunk/storage/RegionFileStorage.java.patch @@ -4,8 +4,8 @@ // Paper start private static void printOversizedLog(String msg, Path file, int x, int z) { -- org.apache.logging.log4j.LogManager.getLogger().fatal(msg + " (" + file.toString().replaceAll(".+[\\\\/]", "") + " - " + x + "," + z + ") Go clean it up to remove this message. /minecraft:tp " + (x<<4)+" 128 "+(z<<4) + " - DO NOT REPORT THIS TO PAPER - You may ask for help on Discord, but do not file an issue. These error messages can not be removed."); -+ org.apache.logging.log4j.LogManager.getLogger().fatal(msg + " (" + file.toString().replaceAll(".+[\\\\/]", "") + " - " + x + "," + z + ") Go clean it up to remove this message. /minecraft:tp " + (x<<4)+" 128 "+(z<<4) + " - DO NOT REPORT THIS TO PURPUR - You may ask for help on Discord, but do not file an issue. These error messages can not be removed."); // Purpur - Rebrand +- LOGGER.error("{} ({} - {},{}) Go clean it up to remove this message. /minecraft:tp {} 128 {} - DO NOT REPORT THIS TO PAPER - You may ask for help on Discord, but do not file an issue. These error messages can not be removed.", msg, file.toString().replaceAll(".+[\\\\/]", ""), x, z, x << 4, z << 4); ++ LOGGER.error("{} ({} - {},{}) Go clean it up to remove this message. /minecraft:tp {} 128 {} - DO NOT REPORT THIS TO PURPUR - You may ask for help on Discord, but do not file an issue. These error messages can not be removed.", msg, file.toString().replaceAll(".+[\\\\/]", ""), x, z, x << 4, z << 4); // Purpur - Rebrand } private static CompoundTag readOversizedChunk(RegionFile regionfile, ChunkPos chunkCoordinate) throws IOException { diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/FlowingFluid.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/FlowingFluid.java.patch index fb975a566..fb5f5f004 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/FlowingFluid.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/material/FlowingFluid.java.patch @@ -1,6 +1,6 @@ --- a/net/minecraft/world/level/material/FlowingFluid.java +++ b/net/minecraft/world/level/material/FlowingFluid.java -@@ -235,7 +_,7 @@ +@@ -234,7 +_,7 @@ } } @@ -9,7 +9,7 @@ BlockState belowState = level.getBlockState(mutablePos.setWithOffset(pos, Direction.DOWN)); FluidState belowFluid = belowState.getFluidState(); if (belowState.isSolid() || this.isSourceBlockOfThisType(belowFluid)) { -@@ -321,6 +_,12 @@ +@@ -320,6 +_,12 @@ } protected abstract boolean canConvertToSource(ServerLevel level); diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java.patch index a74beadd6..456c17f59 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java.patch @@ -1,20 +1,20 @@ --- a/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java +++ b/net/minecraft/world/level/pathfinder/WalkNodeEvaluator.java -@@ -249,7 +_,7 @@ - if ((best == null || best.costMalus < 0.0F) - && jumpSize > 0 - && (pathType != PathType.FENCE || this.canWalkOverFences()) -- && pathType != PathType.UNPASSABLE_RAIL -+ && (this.mob.level().purpurConfig.mobsIgnoreRails || pathType != PathType.UNPASSABLE_RAIL) // Purpur - Config to allow mobs to pathfind over rails - && pathType != PathType.TRAPDOOR - && pathType != PathType.POWDER_SNOW) { - best = this.tryJumpOn(x, y, z, jumpSize, nodeHeight, travelDirection, blockPathTypeCurrent, reusablePos); -@@ -517,7 +_,7 @@ - return PathType.TRAPDOOR; - } else if (blockState.is(Blocks.POWDER_SNOW)) { +@@ -252,7 +_,7 @@ + if ((best == null || best.costMalus < 0.0F) + && jumpSize > 0 + && (pathType != PathType.FENCE || this.canWalkOverFences()) +- && pathType != PathType.UNPASSABLE_RAIL ++ && (this.mob.level().purpurConfig.mobsIgnoreRails || pathType != PathType.UNPASSABLE_RAIL) // Purpur - Config to allow mobs to pathfind over rails + && pathType != PathType.TRAPDOOR + && pathType != PathType.POWDER_SNOW) { + best = this.tryJumpOn(x, y, z, jumpSize, nodeHeight, travelDirection, blockPathTypeCurrent, reusablePos); +@@ -533,7 +_,7 @@ return PathType.POWDER_SNOW; -- } else if (blockState.is(Blocks.CACTUS) || blockState.is(Blocks.SWEET_BERRY_BUSH)) { -+ } else if (blockState.is(Blocks.CACTUS) || blockState.is(Blocks.SWEET_BERRY_BUSH) || blockState.is(Blocks.STONECUTTER)) { // Purpur - Stonecutter damage + } + +- if (blockState.is(Blocks.CACTUS) || blockState.is(Blocks.SWEET_BERRY_BUSH)) { ++ if (blockState.is(Blocks.CACTUS) || blockState.is(Blocks.SWEET_BERRY_BUSH) || blockState.is(Blocks.STONECUTTER)) { // Purpur - Stonecutter damage return PathType.DAMAGING; - } else if (blockState.is(Blocks.HONEY_BLOCK)) { - return PathType.STICKY_HONEY; + } + diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/phys/AABB.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/phys/AABB.java.patch index 491e21fc6..7a613accb 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/phys/AABB.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/phys/AABB.java.patch @@ -1,12 +1,9 @@ --- a/net/minecraft/world/phys/AABB.java +++ b/net/minecraft/world/phys/AABB.java -@@ -485,5 +_,11 @@ - return new AABB(this.minX, this.minY, this.minZ, this.maxX, this.maxY, this.maxZ); +@@ -486,4 +_,9 @@ } } -- } -+ -+ } + } + // Purpur start - Stop squids floating on top of water - tuinity added method + public final AABB offsetY(double dy) { + return new AABB(this.minX, this.minY + dy, this.minZ, this.maxX, this.maxY + dy, this.maxZ); diff --git a/purpur-server/paper-patches/features/0004-API-for-any-mob-to-burn-daylight.patch b/purpur-server/paper-patches/features/0004-API-for-any-mob-to-burn-daylight.patch index 86fe58233..ecbf2fdef 100644 --- a/purpur-server/paper-patches/features/0004-API-for-any-mob-to-burn-daylight.patch +++ b/purpur-server/paper-patches/features/0004-API-for-any-mob-to-burn-daylight.patch @@ -24,7 +24,7 @@ index d6ddbcff911ce4c97a20883af10d2b4752b63f55..7db0454a8c9251faa815500c307d116b Preconditions.checkArgument(entity != null, "Unknown entity"); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index ca447f1e2840d13217559dc1028dbea63fb05041..983146dc8b685fd0ce906ee8debc2e11df9d9fdc 100644 +index f7cb449ae4884e43eda61951443aa7a15dbf4341..327900d58d2c77099a86bf05592d839ed3d14ea3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -1141,4 +1141,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity {