diff --git a/patches/api/0033-Lobotomize-stuck-villagers.patch b/patches/api/0033-Lobotomize-stuck-villagers.patch deleted file mode 100644 index 4370acca8..000000000 --- a/patches/api/0033-Lobotomize-stuck-villagers.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: BillyGalbreath -Date: Mon, 24 Jan 2022 20:42:22 -0600 -Subject: [PATCH] Lobotomize stuck villagers - - -diff --git a/src/main/java/org/bukkit/entity/Villager.java b/src/main/java/org/bukkit/entity/Villager.java -index 1db3742024e9cd1b70af2d52b4b756a544c019df..9c722a762c88a88bb5ef18c3b9eab8b371360dac 100644 ---- a/src/main/java/org/bukkit/entity/Villager.java -+++ b/src/main/java/org/bukkit/entity/Villager.java -@@ -367,4 +367,14 @@ public interface Villager extends AbstractVillager { - */ - public void clearReputations(); - // Paper end -+ -+ // Purpur start -+ -+ /** -+ * Check if villager is currently lobotomized -+ * -+ * @return True if lobotomized -+ */ -+ boolean isLobotomized(); -+ // Purpur end - } diff --git a/patches/server/0230-Lobotomize-stuck-villagers.patch b/patches/server/0230-Lobotomize-stuck-villagers.patch deleted file mode 100644 index b31b5d0da..000000000 --- a/patches/server/0230-Lobotomize-stuck-villagers.patch +++ /dev/null @@ -1,139 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Thu, 3 Dec 2020 17:56:18 -0600 -Subject: [PATCH] Lobotomize stuck villagers - - -diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index e03066a9e336fb67f729a84404ef8b37208fa77d..4170bd886f68e3c21df6f9680ad6f6aa26d74c01 100644 ---- a/net/minecraft/world/entity/npc/Villager.java -+++ b/net/minecraft/world/entity/npc/Villager.java -@@ -141,6 +141,8 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - }, MemoryModuleType.MEETING_POINT, (entityvillager, holder) -> { - return holder.is(PoiTypes.MEETING); - }); -+ private boolean isLobotomized = false; public boolean isLobotomized() { return this.isLobotomized; } // Purpur - Lobotomize stuck villagers -+ private int notLobotomizedCount = 0; // Purpur - Lobotomize stuck villagers - - public Villager(EntityType entityType, Level world) { - this(entityType, world, VillagerType.PLAINS); -@@ -205,6 +207,49 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - return this.level().purpurConfig.villagerAlwaysDropExp; - } - // Purpur end - Mobs always drop experience -+ // Purpur start - Lobotomize stuck villagers -+ private boolean checkLobotomized() { -+ int interval = this.level().purpurConfig.villagerLobotomizeCheckInterval; -+ boolean shouldCheckForTradeLocked = this.level().purpurConfig.villagerLobotomizeWaitUntilTradeLocked; -+ if (this.notLobotomizedCount > 3) { -+ // check half as often if not lobotomized for the last 3+ consecutive checks -+ interval *= 2; -+ } -+ if (this.level().getGameTime() % interval == 0) { -+ // offset Y for short blocks like dirt_path/farmland -+ this.isLobotomized = !(shouldCheckForTradeLocked && this.getVillagerXp() == 0) && !canTravelFrom(BlockPos.containing(this.position().x, this.getBoundingBox().minY + 0.0625D, this.position().z)); -+ -+ if (this.isLobotomized) { -+ this.notLobotomizedCount = 0; -+ } else { -+ this.notLobotomizedCount++; -+ } -+ } -+ return this.isLobotomized; -+ } -+ -+ private boolean canTravelFrom(BlockPos pos) { -+ return canTravelTo(pos.east()) || canTravelTo(pos.west()) || canTravelTo(pos.north()) || canTravelTo(pos.south()); -+ } -+ -+ private boolean canTravelTo(BlockPos pos) { -+ net.minecraft.world.level.block.state.BlockState state = this.level().getBlockStateIfLoaded(pos); -+ if (state == null) { -+ // chunk not loaded -+ return false; -+ } -+ net.minecraft.world.level.block.Block bottom = state.getBlock(); -+ if (bottom instanceof net.minecraft.world.level.block.FenceBlock || -+ bottom instanceof net.minecraft.world.level.block.FenceGateBlock || -+ bottom instanceof net.minecraft.world.level.block.WallBlock) { -+ // bottom block is too tall to get over -+ return false; -+ } -+ net.minecraft.world.level.block.Block top = level().getBlockState(pos.above()).getBlock(); -+ // only if both blocks have no collision -+ return !bottom.hasCollision && !top.hasCollision; -+ } -+ // Purpur end - Lobotomize stuck villagers - @Override - public Brain getBrain() { - return (Brain) super.getBrain(); // CraftBukkit - decompile error -@@ -299,11 +344,19 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - // Paper start - EAR 2 - this.customServerAiStep(world, false); - } -- protected void customServerAiStep(ServerLevel world, final boolean inactive) { -+ protected void customServerAiStep(ServerLevel world, boolean inactive) { // Purpur - not final - // Paper end - EAR 2 - ProfilerFiller gameprofilerfiller = Profiler.get(); - - gameprofilerfiller.push("villagerBrain"); -+ // Purpur start -+ if (this.level().purpurConfig.villagerLobotomizeEnabled) { -+ // treat as inactive if lobotomized -+ inactive = inactive || checkLobotomized(); -+ } else { -+ this.isLobotomized = false; -+ } -+ // Purpur end - // Pufferfish start - if (!inactive && (getRider() == null || !this.isControllable()) /*&& this.behaviorTick++ % this.activatedPriority == 0*/) { - this.getBrain().tick(world, this); // Paper // Purpur - Ridables -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java -index 8e895d6f84f7d84b219f2424909dd42e5f08dec4..e5597563a6ed620ab9c9e81be4bad56fd5308305 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java -@@ -375,4 +375,11 @@ public class CraftVillager extends CraftAbstractVillager implements Villager { - getHandle().getGossips().gossips.clear(); - } - // Paper end -+ -+ // Purpur start - Lobotomize stuck villagers -+ @Override -+ public boolean isLobotomized() { -+ return getHandle().isLobotomized(); -+ } -+ // Purpur end - Lobotomize stuck villagers - } -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index fa09bd0e91d3c71d960e316f792323b763569b6e..30d54adaae14884832387951d47872bedaf087a0 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -2915,6 +2915,9 @@ public class PurpurWorldConfig { - public boolean villagerAllowTrading = true; - public boolean villagerAlwaysDropExp = false; - public int villagerMinimumDemand = 0; -+ public boolean villagerLobotomizeEnabled = false; -+ public int villagerLobotomizeCheckInterval = 100; -+ public boolean villagerLobotomizeWaitUntilTradeLocked = false; - private void villagerSettings() { - villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); - villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); -@@ -2938,6 +2941,18 @@ public class PurpurWorldConfig { - villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); - villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); - villagerMinimumDemand = getInt("mobs.villager.minimum-demand", villagerMinimumDemand); -+ if (PurpurConfig.version < 9) { -+ boolean oldValue = getBoolean("mobs.villager.lobotomize-1x1", villagerLobotomizeEnabled); -+ set("mobs.villager.lobotomize.enabled", oldValue); -+ set("mobs.villager.lobotomize-1x1", null); -+ } -+ if (PurpurConfig.version < 27) { -+ int oldValue = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval); -+ set("mobs.villager.lobotomize.check-interval", oldValue == 60 ? 100 : oldValue); -+ } -+ villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled); -+ villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval); -+ villagerLobotomizeWaitUntilTradeLocked = getBoolean("mobs.villager.lobotomize.wait-until-trade-locked", villagerLobotomizeWaitUntilTradeLocked); - } - - public boolean vindicatorRidable = false; diff --git a/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Villager.java.patch b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Villager.java.patch new file mode 100644 index 000000000..90aac0f52 --- /dev/null +++ b/purpur-api/paper-patches/files/src/main/java/org/bukkit/entity/Villager.java.patch @@ -0,0 +1,17 @@ +--- a/src/main/java/org/bukkit/entity/Villager.java ++++ b/src/main/java/org/bukkit/entity/Villager.java +@@ -367,4 +_,14 @@ + */ + public void clearReputations(); + // Paper end ++ ++ // Purpur start ++ ++ /** ++ * Check if villager is currently lobotomized ++ * ++ * @return True if lobotomized ++ */ ++ boolean isLobotomized(); ++ // Purpur end + } diff --git a/purpur-server/minecraft-patches/features/0001-Ridables.patch b/purpur-server/minecraft-patches/features/0001-Ridables.patch index abc257e0d..7f232bd8f 100644 --- a/purpur-server/minecraft-patches/features/0001-Ridables.patch +++ b/purpur-server/minecraft-patches/features/0001-Ridables.patch @@ -18,10 +18,10 @@ index 29d402620d2e1cbed94f941f933ae8eb5d786e7f..ec0998369158286fccb38c8e10c3cfa2 public boolean isLocalPlayer() { return true; diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index f90e90368552d7e38e719bc080184ccaa64b6a0b..47b1f87e224fe963807c244e9cf03b2c8b049d9c 100644 +index baf7b92843d2536a8a6c3958ded0c84045c4a54a..1eeea8d9e44857537d4591cce4dfd944ad48e2b2 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1733,6 +1733,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop 0; // Paper - Add EntityMoveEvent serverLevel.updateLagCompensationTick(); // Paper - lag compensation net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = serverLevel.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers @@ -30,7 +30,7 @@ index f90e90368552d7e38e719bc080184ccaa64b6a0b..47b1f87e224fe963807c244e9cf03b2c /* Drop global time updates if (this.tickCount % 20 == 0) { diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java -index 704e618c1a71c5182bc927758eb3f91e5f008f7d..a55772a67bca2be0a36ce63e7b0143b825c40f01 100644 +index 6f1cb7b9c01111eca0e0e253dddc1ad84b2aac15..8ad8e9879ada5f7b96a2600cd7a6692fa661c67c 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -217,6 +217,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe @@ -177,7 +177,7 @@ index 95d78dcdb6777df73898694367ee17b1cb76d7a2..d0313fd5368baa53ec511c8c07fc78a1 protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index d10568ea92ac2e915af95d2a5f9b441bca1753b8..e86dcc0f596491fc7a5c22fa3909287ba520ca95 100644 +index 0e05efd9d795496b8f632abfc543a36ccdff8349..2de776d7570f97f763033392ceeb8ffdbc0fafcd 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -250,9 +250,9 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -210,7 +210,7 @@ index d10568ea92ac2e915af95d2a5f9b441bca1753b8..e86dcc0f596491fc7a5c22fa3909287b @Override protected void checkFallDamage(double y, boolean onGround, BlockState state, BlockPos pos) { -@@ -3527,8 +3528,10 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3534,8 +3535,10 @@ public abstract class LivingEntity extends Entity implements Attackable { this.pushEntities(); profilerFiller.pop(); // Paper start - Add EntityMoveEvent @@ -223,7 +223,7 @@ index d10568ea92ac2e915af95d2a5f9b441bca1753b8..e86dcc0f596491fc7a5c22fa3909287b 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()); -@@ -3538,6 +3541,21 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3545,6 +3548,21 @@ public abstract class LivingEntity extends Entity implements Attackable { this.absMoveTo(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ(), event.getTo().getYaw(), event.getTo().getPitch()); } } @@ -568,7 +568,7 @@ index c0997c8c0f8ee4474d3acdd5938b1879c4e589a2..28ae152125ed83d8917674b6068f227f double d = this.wantedX - this.fish.getX(); double d1 = this.wantedY - this.fish.getY(); diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index d77ae36ffc47d06767066e4ce1c1d21a52e1483c..069444e6de2b587f8df3b87391b1ffcf1ee1c388 100644 +index 31c9e0cdcd7b3f5426d62f64453aa4e63e1af8df..b9bf40c389460d65d2566786ddd6f6740243e9a4 100644 --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java @@ -145,6 +145,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -661,7 +661,7 @@ index d77ae36ffc47d06767066e4ce1c1d21a52e1483c..069444e6de2b587f8df3b87391b1ffcf this.targetSelector.addGoal(1, new Bee.BeeHurtByOtherGoal(this).setAlertOthers(new Class[0])); this.targetSelector.addGoal(2, new Bee.BeeBecomeAngryTargetGoal(this)); this.targetSelector.addGoal(3, new ResetUniversalAngerTargetGoal<>(this, true)); -@@ -1083,15 +1133,15 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -1084,15 +1134,15 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } } @@ -3792,7 +3792,7 @@ index 905ecbd8b22c785ee4ea18004ac50eb1b7005d3f..f10b204c18b88e9110cebf050b60c233 @Override diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index a91aba11ecda561d117c9d8db85c92cdcd81887e..3bff5f13ffcaaedecfab071c5ce6b28028aecd62 100644 +index 9ea3acd5ff3d7751875d61861aa5f6c717d0b5e2..75c6a43a3ab4851a47990402bee49f7e8305cd60 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java @@ -60,6 +60,64 @@ public class Phantom extends FlyingMob implements Enemy { @@ -3888,7 +3888,7 @@ index a91aba11ecda561d117c9d8db85c92cdcd81887e..3bff5f13ffcaaedecfab071c5ce6b280 this.igniteForSeconds(8.0F); } -@@ -407,25 +469,42 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -411,25 +473,42 @@ public class Phantom extends FlyingMob implements Enemy { } } @@ -4943,12 +4943,12 @@ index 9f476e587d7df797129e49738f101cccca7e10b7..f968e5c99bdb23b268bc34ea1ba5d54a && this.level() == entity.level() && EntitySelector.NO_CREATIVE_OR_SPECTATOR.test(entity) diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index b36e7c75af71f7472ccb0af3ba217ba39b05d081..742ae13084b2ab6c1ed26c0e7601ba7f9009367e 100644 +index 1ee0c9bcbca1296f83dcde4acb200caa654cae6d..52b54c59efd68a955a6e7cc49b01f614043c505d 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java -@@ -200,6 +200,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -246,6 +246,28 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } - // Purpur end - Allow leashing villagers + // Purpur end - Lobotomize stuck villagers + // Purpur start - Ridables + @Override @@ -4975,16 +4975,16 @@ index b36e7c75af71f7472ccb0af3ba217ba39b05d081..742ae13084b2ab6c1ed26c0e7601ba7f @Override public Brain getBrain() { return (Brain)super.getBrain(); -@@ -300,7 +322,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler - // Paper end - EAR 2 - ProfilerFiller profilerFiller = Profiler.get(); - profilerFiller.push("villagerBrain"); -- if (!inactive) this.getBrain().tick(level, this); // Paper - EAR 2 -+ if (!inactive && (getRider() == null || !this.isControllable()) /*&& this.behaviorTick++ % this.activatedPriority == 0*/) this.getBrain().tick(level, this); // Paper - EAR 2 // Purpur - Ridables - profilerFiller.pop(); - if (this.assignProfessionWhenSpawned) { - this.assignProfessionWhenSpawned = false; -@@ -356,7 +378,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -355,7 +377,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler + } + // Purpur end - Lobotomize stuck villagers + // Pufferfish start +- if (!inactive /*&& this.behaviorTick++ % this.activatedPriority == 0*/) { ++ if (!inactive && (getRider() == null || !this.isControllable()) /*&& this.behaviorTick++ % this.activatedPriority == 0*/) { // Purpur - Ridables + this.getBrain().tick(level, this); // Paper - EAR 2 + } + // Pufferfish end +@@ -414,7 +436,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler return super.mobInteract(player, hand); } else if (this.isBaby()) { this.setUnhappy(); @@ -4993,7 +4993,7 @@ index b36e7c75af71f7472ccb0af3ba217ba39b05d081..742ae13084b2ab6c1ed26c0e7601ba7f } else { if (!this.level().isClientSide) { boolean isEmpty = this.getOffers().isEmpty(); -@@ -369,9 +391,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -427,9 +449,11 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } if (isEmpty) { @@ -5046,7 +5046,7 @@ index 99947e9877b79c0d419e1639c2b1379fc1504c6a..7e4d14d30eb3f06c0c7426e09084355a 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 b8f85b141eb290f644555a3cc88ce3daa24d4eb4..beefd76c1b92a66e20e53973262c724ee4ddf43d 100644 +index 1b70c8b75d8bd0503e5329caa0b7c42ec7f7479f..898964b9a73950fa9e8de95f84faa74935c57ee6 100644 --- a/net/minecraft/world/entity/player/Player.java +++ b/net/minecraft/world/entity/player/Player.java @@ -220,6 +220,19 @@ public abstract class Player extends LivingEntity { 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 2c3b82f92..0e68624d5 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 @@ -23,7 +23,7 @@ index d0313fd5368baa53ec511c8c07fc78a1f1ecec4e..898b1e01026ec1f44cfe60e9f18a997c protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index e86dcc0f596491fc7a5c22fa3909287ba520ca95..fef8910f31d697a77ea6f0e7aa6fd5ebb26367a1 100644 +index 2de776d7570f97f763033392ceeb8ffdbc0fafcd..b96fc67d28809f66181b1d36b475a8f85d596ea7 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -311,6 +311,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -70,10 +70,10 @@ index e7ea944e77175ee4051b8e7361c502d0cc2115d5..ecbec552e5cd1935f57872d2fb502d3e public boolean isFlapping() { return !this.isResting() && this.tickCount % 10.0F == 0.0F; diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index 069444e6de2b587f8df3b87391b1ffcf1ee1c388..24109eed60e20de9a2fde2f8c4a063b9a1be4ef9 100644 +index b9bf40c389460d65d2566786ddd6f6740243e9a4..c150ba5f706b3dd51925533300c0432ccf5e2b81 100644 --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java -@@ -471,6 +471,14 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -472,6 +472,14 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { return beehiveBlockEntity != null && beehiveBlockEntity.isFireNearby(); } @@ -1243,7 +1243,7 @@ index f10b204c18b88e9110cebf050b60c23367ea3aa0..2c6b0fd46d9ed6a8d1ca7e90ebf596dd 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 3bff5f13ffcaaedecfab071c5ce6b28028aecd62..ada1fc67934fac742d9693b90af429d0e2f507b1 100644 +index 75c6a43a3ab4851a47990402bee49f7e8305cd60..08fc2dc0fecfa370c99e877d502149a8ea147e5f 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java @@ -151,7 +151,10 @@ public class Phantom extends FlyingMob implements Enemy { @@ -1750,10 +1750,10 @@ index 97241682311797faa93927e0477a7646ce53b2c8..eb82252cd87797927e153974b9280b5e return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 742ae13084b2ab6c1ed26c0e7601ba7f9009367e..3890d315b747f2688527ff3a97ae9d9587a277ab 100644 +index 52b54c59efd68a955a6e7cc49b01f614043c505d..c71d0f8efacb60e49395567fdc0c1c1e6e6f5aa8 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java -@@ -222,6 +222,14 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -268,6 +268,14 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } // Purpur end - Ridables 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 6aa9d100f..64b658e5b 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 @@ -44,10 +44,10 @@ index a71d16d968bb90fd7aca6f01a3dd56df4f9a7ce6..b4e79cac5611942240ce85120f7bbee3 @Override public CraftMerchant getCraftMerchant() { diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 557140401074dec60cf862a29570b2f0a5de64a1..c30fc25536277b487030effafecebf43390934cf 100644 +index c71d0f8efacb60e49395567fdc0c1c1e6e6f5aa8..2f685a186b2dc27e70cddd5c4951c27e7ee3ef53 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java -@@ -219,6 +219,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -265,6 +265,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler @Override protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); @@ -55,7 +55,7 @@ index 557140401074dec60cf862a29570b2f0a5de64a1..c30fc25536277b487030effafecebf43 } // Purpur end - Ridables -@@ -227,6 +228,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -273,6 +274,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler public void initAttributes() { this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(this.level().purpurConfig.villagerMaxHealth); this.getAttribute(Attributes.SCALE).setBaseValue(this.level().purpurConfig.villagerScale); @@ -63,7 +63,7 @@ index 557140401074dec60cf862a29570b2f0a5de64a1..c30fc25536277b487030effafecebf43 } // Purpur end - Configurable entity base attributes -@@ -295,7 +297,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -341,7 +343,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } public static AttributeSupplier.Builder createAttributes() { @@ -73,7 +73,7 @@ index 557140401074dec60cf862a29570b2f0a5de64a1..c30fc25536277b487030effafecebf43 public boolean assignProfessionWhenSpawned() { diff --git a/net/minecraft/world/entity/npc/WanderingTrader.java b/net/minecraft/world/entity/npc/WanderingTrader.java -index 31449094c6395857289dd56482e8b3902bac2b63..cef51ce86dcbc5ec01bfcbcb487325b55779be52 100644 +index b5af32a431b5ffe20b32bd82ccfae9b8343d0592..f9755f36f7863b9742fe5b840a8130891ddff7c7 100644 --- a/net/minecraft/world/entity/npc/WanderingTrader.java +++ b/net/minecraft/world/entity/npc/WanderingTrader.java @@ -97,9 +97,16 @@ public class WanderingTrader extends net.minecraft.world.entity.npc.AbstractVill diff --git a/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch b/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch index 55ea3201c..710a2e9dd 100644 --- a/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch +++ b/purpur-server/minecraft-patches/features/0008-Configurable-void-damage-height-and-damage.patch @@ -7,10 +7,10 @@ temporarily migrate to paper's config drop patch on the next minecraft release diff --git a/net/minecraft/server/MinecraftServer.java b/net/minecraft/server/MinecraftServer.java -index 47b1f87e224fe963807c244e9cf03b2c8b049d9c..e535d67c8c910884e151863b2dd793a39ed27a41 100644 +index 1eeea8d9e44857537d4591cce4dfd944ad48e2b2..7526322f7be340470db3848973844013a31a5d72 100644 --- a/net/minecraft/server/MinecraftServer.java +++ b/net/minecraft/server/MinecraftServer.java -@@ -1210,7 +1210,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop list = EquipmentSlot.VALUES.stream().filter(slot -> canGlideUsing(this.getItemBySlot(slot), slot)).toList(); EquipmentSlot equipmentSlot = Util.getRandom(list, this.random); diff --git a/purpur-server/minecraft-patches/features/0011-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch b/purpur-server/minecraft-patches/features/0011-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch index bc5dbf99e..c420ca56c 100644 --- a/purpur-server/minecraft-patches/features/0011-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch +++ b/purpur-server/minecraft-patches/features/0011-Phantoms-attracted-to-crystals-and-crystals-shoot-ph.patch @@ -73,7 +73,7 @@ index b2b7c55dcd3813f69d23c7999e858c1be35dd0cf..59202dbaae6b0bc222895f3e0d8772a1 @Override diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index ada1fc67934fac742d9693b90af429d0e2f507b1..590199dae5a0586ff23f26aee06dacd543f00e18 100644 +index 08fc2dc0fecfa370c99e877d502149a8ea147e5f..aea7b608d88d243113f67665844841ac879c3f88 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java @@ -47,6 +47,7 @@ public class Phantom extends FlyingMob implements Enemy { @@ -129,7 +129,7 @@ index ada1fc67934fac742d9693b90af429d0e2f507b1..590199dae5a0586ff23f26aee06dacd5 this.targetSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables this.targetSelector.addGoal(1, new Phantom.PhantomAttackPlayerTargetGoal()); } -@@ -505,6 +531,124 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -509,6 +535,124 @@ public class Phantom extends FlyingMob implements Enemy { } } diff --git a/purpur-server/minecraft-patches/features/0012-Phantoms-burn-in-light.patch b/purpur-server/minecraft-patches/features/0012-Phantoms-burn-in-light.patch index ea29b8107..34631ae4b 100644 --- a/purpur-server/minecraft-patches/features/0012-Phantoms-burn-in-light.patch +++ b/purpur-server/minecraft-patches/features/0012-Phantoms-burn-in-light.patch @@ -5,7 +5,7 @@ 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 438f09ef7b116352de1c75a04b42b6096bed8d87..e18301d69c60dbe8072dcf061beafd57e893da11 100644 +index aea7b608d88d243113f67665844841ac879c3f88..4cc1c8d8967b1e9ee5b0b1c50d887f3de3e8a882 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java @@ -53,6 +53,7 @@ public class Phantom extends FlyingMob implements Enemy { @@ -29,7 +29,7 @@ index 438f09ef7b116352de1c75a04b42b6096bed8d87..e18301d69c60dbe8072dcf061beafd57 if (getRider() == null || !this.isControllable()) // Purpur - Ridables this.igniteForSeconds(8.0F); } -@@ -370,6 +375,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -374,6 +379,7 @@ public class Phantom extends FlyingMob implements Enemy { List nearbyPlayers = serverLevel.getNearbyPlayers( this.attackTargeting, Phantom.this, Phantom.this.getBoundingBox().inflate(16.0, 64.0, 16.0) ); @@ -37,7 +37,7 @@ index 438f09ef7b116352de1c75a04b42b6096bed8d87..e18301d69c60dbe8072dcf061beafd57 if (!nearbyPlayers.isEmpty()) { nearbyPlayers.sort(Comparator.comparing(Entity::getY).reversed()); -@@ -735,6 +741,12 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -739,6 +745,12 @@ public class Phantom extends FlyingMob implements Enemy { return false; } else if (!target.isAlive()) { return false; diff --git a/purpur-server/minecraft-patches/features/0013-Make-entity-breeding-times-configurable.patch b/purpur-server/minecraft-patches/features/0013-Make-entity-breeding-times-configurable.patch index 6ba9dca1f..be0ec1071 100644 --- a/purpur-server/minecraft-patches/features/0013-Make-entity-breeding-times-configurable.patch +++ b/purpur-server/minecraft-patches/features/0013-Make-entity-breeding-times-configurable.patch @@ -47,10 +47,10 @@ index 33c3752be451508343cad83766da7c3be1822d02..fa34e7f1c20dfd569b52a9c8e0a8d4d5 animal.resetLove(); level.broadcastEntityEvent(this, (byte)18); diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index bcf554054111f85b095341a5455856ee79f3ade6..62fbaed0f81b900730ab22b969ffd48d31a268ce 100644 +index c150ba5f706b3dd51925533300c0432ccf5e2b81..6f0b927101f9b5a07a0b6749557f6b0ebf35ae64 100644 --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java -@@ -479,6 +479,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -480,6 +480,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } // Purpur end - Configurable entity base attributes @@ -65,7 +65,7 @@ index bcf554054111f85b095341a5455856ee79f3ade6..62fbaed0f81b900730ab22b969ffd48d public int getRemainingPersistentAngerTime() { return this.entityData.get(DATA_REMAINING_ANGER_TIME); diff --git a/net/minecraft/world/entity/animal/Cat.java b/net/minecraft/world/entity/animal/Cat.java -index ec56ba8da89cccdf37abb26b75e524ee98a2f29c..f0b7025e5a0d9f2aeb42dec388c1c532a46ece35 100644 +index 98ce277c5b27591e22daa3c85241be1b8689bfae..584568cef949cee24aa7850d2ff99d47cd089a6e 100644 --- a/net/minecraft/world/entity/animal/Cat.java +++ b/net/minecraft/world/entity/animal/Cat.java @@ -126,6 +126,13 @@ public class Cat extends TamableAnimal implements VariantHolder= 0D ? fallDistance >= serverLevel.purpurConfig.farmlandTrampleHeight : level.random.nextFloat() < fallDistance - 0.5F) // // Purpur - Configurable farmland trample height && entity instanceof LivingEntity - && (entity instanceof Player || serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) + && (entity instanceof Player || serverLevel.purpurConfig.farmlandBypassMobGriefing ^ serverLevel.getGameRules().getBoolean(GameRules.RULE_MOBGRIEFING)) @@ -346,7 +346,7 @@ index 9c0ded7ae7e3a520704033a866f80743ae85d772..4f3646961beb877520e257e11224c304 } // CraftBukkit end diff --git a/net/minecraft/world/level/block/TurtleEggBlock.java b/net/minecraft/world/level/block/TurtleEggBlock.java -index e5a0ee60a5565540ca313f6734637d99c66a8397..5618c67fcd8490262e837a964232cd8cb97e7b4f 100644 +index 88b8e4e5b2bea68739f55648926f4b423a09f6f2..960640b19e99fb8793739bca459aa195398d8605 100644 --- a/net/minecraft/world/level/block/TurtleEggBlock.java +++ b/net/minecraft/world/level/block/TurtleEggBlock.java @@ -210,7 +210,7 @@ public class TurtleEggBlock extends Block { diff --git a/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch b/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch index 4a0658fb2..070dfd2e2 100644 --- a/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch +++ b/purpur-server/minecraft-patches/features/0018-Toggle-for-water-sensitive-mob-damage.patch @@ -23,7 +23,7 @@ index 898b1e01026ec1f44cfe60e9f18a997c86e30594..e717c063c8f9623b8c4b4ea3843d05fd protected ParticleOptions getInkParticle() { return ParticleTypes.GLOW_SQUID_INK; diff --git a/net/minecraft/world/entity/ambient/Bat.java b/net/minecraft/world/entity/ambient/Bat.java -index e158fdc79c2c8f27203d6f229c1ac906394e5f96..2345ca8443693dafaae23a991d37e25b46a46da0 100644 +index ecbec552e5cd1935f57872d2fb502d3e9743e3d8..4fa526496265a85b637136f0fd0692ef4f570ad6 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 { @@ -41,7 +41,7 @@ index e158fdc79c2c8f27203d6f229c1ac906394e5f96..2345ca8443693dafaae23a991d37e25b public boolean isFlapping() { return !this.isResting() && this.tickCount % 10.0F == 0.0F; diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index 0ed9d499591a809c30d2399f64502de7505c46e7..70e90b91aaf1c5cd46d818d171194fbbba5000e6 100644 +index 6f0b927101f9b5a07a0b6749557f6b0ebf35ae64..d4025093d82cca0c5923058dc0e35c91ae7b40e3 100644 --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java @@ -177,7 +177,7 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { @@ -53,7 +53,7 @@ index 0ed9d499591a809c30d2399f64502de7505c46e7..70e90b91aaf1c5cd46d818d171194fbb this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F); this.setPathfindingMalus(PathType.COCOA, -1.0F); this.setPathfindingMalus(PathType.FENCE, -1.0F); -@@ -486,6 +486,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -487,6 +487,11 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } // Purpur end - Make entity breeding times configurable @@ -915,7 +915,7 @@ index 2c6b0fd46d9ed6a8d1ca7e90ebf596dd3f310f0e..bf26f5f6017c60d5991d5f6c87da2acb 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 065a8bbee9d31a4f443660c706d04cea69f4bdc3..eda7ee331451bcb812d089929589027cd6b9681e 100644 +index 4cc1c8d8967b1e9ee5b0b1c50d887f3de3e8a882..32b7c34d3c68dcfa936b628b2d038524204129a3 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java @@ -139,6 +139,13 @@ public class Phantom extends FlyingMob implements Enemy { @@ -1189,7 +1189,7 @@ index 132b38d717ac3c5acc64a5ec519f345ac57021d8..79a4a3f4e10e1f9c1a6100060a956360 protected Brain.Provider brainProvider() { return Brain.provider(MEMORY_TYPES, SENSOR_TYPES); diff --git a/net/minecraft/world/entity/monster/Zombie.java b/net/minecraft/world/entity/monster/Zombie.java -index b600fc46ed96d46769b7b289997a6e3cd422417b..61767c8dc1872d7d87d0757da4d3664c4ebafa54 100644 +index 98732a5014a1c8a91dbe79d070ce0b58daf1ba1c..5d12bc139c81ca342074c7c745635669020d0300 100644 --- a/net/minecraft/world/entity/monster/Zombie.java +++ b/net/minecraft/world/entity/monster/Zombie.java @@ -139,6 +139,13 @@ public class Zombie extends Monster { @@ -1207,7 +1207,7 @@ index b600fc46ed96d46769b7b289997a6e3cd422417b..61767c8dc1872d7d87d0757da4d3664c protected void registerGoals() { this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur - Ridables diff --git a/net/minecraft/world/entity/monster/ZombieVillager.java b/net/minecraft/world/entity/monster/ZombieVillager.java -index 167b5dcbd378f36a17fb7e93b137fcb4fd1d25f9..91f15f794238494fdac69b4d320337cf984a92f8 100644 +index f1e9bf75c50f353bd377051be82a391f97d952fd..94b9abc765b78a40a7ecbf4cbd775b778d49c815 100644 --- a/net/minecraft/world/entity/monster/ZombieVillager.java +++ b/net/minecraft/world/entity/monster/ZombieVillager.java @@ -124,6 +124,13 @@ public class ZombieVillager extends Zombie implements VillagerDataHolder { @@ -1297,10 +1297,10 @@ index eb82252cd87797927e153974b9280b5eaa251080..2237681f298113bda0556699e19e880f return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 09290db1fd3ca65b08862c6cfe3c9d21a77adc4f..0c8bbb8d00947f1ff2d843c08581cd632c0cb745 100644 +index c301a89f032746487a4e993d920060450433f238..af6ae76248a9894efbecf9e94160f8d215f6ad85 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java -@@ -232,6 +232,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -278,6 +278,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } // Purpur end - Configurable entity base attributes diff --git a/purpur-server/minecraft-patches/features/0019-API-for-any-mob-to-burn-daylight.patch b/purpur-server/minecraft-patches/features/0019-API-for-any-mob-to-burn-daylight.patch index c387eb318..2bb4b99bb 100644 --- a/purpur-server/minecraft-patches/features/0019-API-for-any-mob-to-burn-daylight.patch +++ b/purpur-server/minecraft-patches/features/0019-API-for-any-mob-to-burn-daylight.patch @@ -35,7 +35,7 @@ index d22350f58ad29700bdca54f4697110bf4639faf9..bc4f44fc16361903d6c1caac0114d849 this.type = entityType; this.level = level; diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 40c61ff158f700659de100b61ff0490b8b7a78b5..c9e04a1378b31abdaaca23a7bd8bbb32124a7f37 100644 +index 1e37b69139cc72ca54109d2d1316820d3b89b995..87ee2ba1f2563eaaecfab52c7083c01aba0315e7 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -301,6 +301,7 @@ public abstract class LivingEntity extends Entity implements Attackable { @@ -67,7 +67,7 @@ index 40c61ff158f700659de100b61ff0490b8b7a78b5..c9e04a1378b31abdaaca23a7bd8bbb32 } // CraftBukkit start -@@ -3564,6 +3572,32 @@ public abstract class LivingEntity extends Entity implements Attackable { +@@ -3571,6 +3579,32 @@ public abstract class LivingEntity extends Entity implements Attackable { if (this.level() instanceof ServerLevel serverLevel && this.isSensitiveToWater() && this.isInWaterRainOrBubble()) { this.hurtServer(serverLevel, this.damageSources().drown(), 1.0F); } @@ -213,7 +213,7 @@ index 31eef2869945d9de565d627cac3fc1a5db380a2a..e618e716cb5ff3a3c5d284e985455694 @Override diff --git a/net/minecraft/world/entity/monster/Phantom.java b/net/minecraft/world/entity/monster/Phantom.java -index eda7ee331451bcb812d089929589027cd6b9681e..78569c2790f74fb91c3c7e7b72158e77ec568c79 100644 +index 32b7c34d3c68dcfa936b628b2d038524204129a3..0ee817699fffbb929011465029182cc56befc30c 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java @@ -60,6 +60,7 @@ public class Phantom extends FlyingMob implements Enemy { @@ -249,7 +249,7 @@ index eda7ee331451bcb812d089929589027cd6b9681e..78569c2790f74fb91c3c7e7b72158e77 // Purpur start - Phantoms burn in light boolean burnFromDaylight = this.shouldBurnInDay && this.isSunBurnTick() && this.level().purpurConfig.phantomBurnInDaylight; boolean burnFromLightSource = this.level().purpurConfig.phantomBurnInLight > 0 && this.level().getMaxLocalRawBrightness(blockPosition()) >= this.level().purpurConfig.phantomBurnInLight; -@@ -295,7 +307,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -299,7 +311,7 @@ public class Phantom extends FlyingMob implements Enemy { if (compound.hasUUID("Paper.SpawningEntity")) { this.spawningEntity = compound.getUUID("Paper.SpawningEntity"); } @@ -258,7 +258,7 @@ index eda7ee331451bcb812d089929589027cd6b9681e..78569c2790f74fb91c3c7e7b72158e77 this.shouldBurnInDay = compound.getBoolean("Paper.ShouldBurnInDay"); } // Paper end -@@ -312,7 +324,7 @@ public class Phantom extends FlyingMob implements Enemy { +@@ -316,7 +328,7 @@ public class Phantom extends FlyingMob implements Enemy { if (this.spawningEntity != null) { compound.putUUID("Paper.SpawningEntity", this.spawningEntity); } diff --git a/purpur-server/minecraft-patches/features/0021-Mobs-always-drop-experience.patch b/purpur-server/minecraft-patches/features/0021-Mobs-always-drop-experience.patch index 2f703da0e..19c768b12 100644 --- a/purpur-server/minecraft-patches/features/0021-Mobs-always-drop-experience.patch +++ b/purpur-server/minecraft-patches/features/0021-Mobs-always-drop-experience.patch @@ -41,10 +41,10 @@ index 4fa526496265a85b637136f0fd0692ef4f570ad6..4ac052a78841939a53dac2afb575cb11 public boolean isFlapping() { return !this.isResting() && this.tickCount % 10.0F == 0.0F; diff --git a/net/minecraft/world/entity/animal/Bee.java b/net/minecraft/world/entity/animal/Bee.java -index 70e90b91aaf1c5cd46d818d171194fbbba5000e6..0912fa7de3e3f8e90121802312e78e3638ebd085 100644 +index d4025093d82cca0c5923058dc0e35c91ae7b40e3..38c95287da10247b0627ce16ad4914232b5a6f06 100644 --- a/net/minecraft/world/entity/animal/Bee.java +++ b/net/minecraft/world/entity/animal/Bee.java -@@ -486,6 +486,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { +@@ -487,6 +487,13 @@ public class Bee extends Animal implements NeutralMob, FlyingAnimal { } // Purpur end - Make entity breeding times configurable @@ -887,7 +887,7 @@ index bf26f5f6017c60d5991d5f6c87da2acbd95ef5bb..312d4a3d312b5c326d6ca13ccfc48171 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 78569c2790f74fb91c3c7e7b72158e77ec568c79..74ac280bfc62de761acb3d940b721aab6e325806 100644 +index 0ee817699fffbb929011465029182cc56befc30c..39f94cee78e8fc14d892cb64fb5234bf88d964ad 100644 --- a/net/minecraft/world/entity/monster/Phantom.java +++ b/net/minecraft/world/entity/monster/Phantom.java @@ -157,6 +157,13 @@ public class Phantom extends FlyingMob implements Enemy { @@ -1265,10 +1265,10 @@ index 2237681f298113bda0556699e19e880f4b04a853..4984b9864b63f92bc939b530253e871c return Monster.createMonsterAttributes() .add(Attributes.MAX_HEALTH, 50.0) diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java -index 73bf940b73e8bee91fcb6d7bec4545bd63d8da2e..aa6ed56b7a2da45fcbc8c7023e875ab3dd2d8617 100644 +index af6ae76248a9894efbecf9e94160f8d215f6ad85..92261f502de7b832845b6e6a12a091801096dc4d 100644 --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java -@@ -239,6 +239,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler +@@ -285,6 +285,13 @@ public class Villager extends AbstractVillager implements ReputationEventHandler } // Purpur end - Toggle for water sensitive mob damage diff --git a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch index 0ddf17a38..ab676b3b1 100644 --- a/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch +++ b/purpur-server/minecraft-patches/sources/net/minecraft/world/entity/npc/Villager.java.patch @@ -1,6 +1,15 @@ --- a/net/minecraft/world/entity/npc/Villager.java +++ b/net/minecraft/world/entity/npc/Villager.java -@@ -193,6 +_,13 @@ +@@ -179,6 +_,8 @@ + MemoryModuleType.MEETING_POINT, + (villager, holder) -> holder.is(PoiTypes.MEETING) + ); ++ private boolean isLobotomized = false; public boolean isLobotomized() { return this.isLobotomized; } // Purpur - Lobotomize stuck villagers ++ private int notLobotomizedCount = 0; // Purpur - Lobotomize stuck villagers + + public Villager(EntityType entityType, Level level) { + this(entityType, level, VillagerType.PLAINS); +@@ -193,6 +_,57 @@ this.setVillagerData(this.getVillagerData().setType(villagerType).setProfession(VillagerProfession.NONE)); } @@ -10,10 +19,80 @@ + return level().purpurConfig.villagerCanBeLeashed; + } + // Purpur end - Allow leashing villagers ++ ++ // Purpur start - Lobotomize stuck villagers ++ private boolean checkLobotomized() { ++ int interval = this.level().purpurConfig.villagerLobotomizeCheckInterval; ++ boolean shouldCheckForTradeLocked = this.level().purpurConfig.villagerLobotomizeWaitUntilTradeLocked; ++ if (this.notLobotomizedCount > 3) { ++ // check half as often if not lobotomized for the last 3+ consecutive checks ++ interval *= 2; ++ } ++ if (this.level().getGameTime() % interval == 0) { ++ // offset Y for short blocks like dirt_path/farmland ++ this.isLobotomized = !(shouldCheckForTradeLocked && this.getVillagerXp() == 0) && !canTravelFrom(BlockPos.containing(this.position().x, this.getBoundingBox().minY + 0.0625D, this.position().z)); ++ ++ if (this.isLobotomized) { ++ this.notLobotomizedCount = 0; ++ } else { ++ this.notLobotomizedCount++; ++ } ++ } ++ return this.isLobotomized; ++ } ++ ++ private boolean canTravelFrom(BlockPos pos) { ++ return canTravelTo(pos.east()) || canTravelTo(pos.west()) || canTravelTo(pos.north()) || canTravelTo(pos.south()); ++ } ++ ++ private boolean canTravelTo(BlockPos pos) { ++ net.minecraft.world.level.block.state.BlockState state = this.level().getBlockStateIfLoaded(pos); ++ if (state == null) { ++ // chunk not loaded ++ return false; ++ } ++ net.minecraft.world.level.block.Block bottom = state.getBlock(); ++ if (bottom instanceof net.minecraft.world.level.block.FenceBlock || ++ bottom instanceof net.minecraft.world.level.block.FenceGateBlock || ++ bottom instanceof net.minecraft.world.level.block.WallBlock) { ++ // bottom block is too tall to get over ++ return false; ++ } ++ net.minecraft.world.level.block.Block top = level().getBlockState(pos.above()).getBlock(); ++ // only if both blocks have no collision ++ return !bottom.hasCollision && !top.hasCollision; ++ } ++ // Purpur end - Lobotomize stuck villagers + @Override public Brain getBrain() { return (Brain)super.getBrain(); +@@ -289,11 +_,23 @@ + // Paper start - EAR 2 + this.customServerAiStep(level, false); + } +- protected void customServerAiStep(ServerLevel level, final boolean inactive) { ++ protected void customServerAiStep(ServerLevel level, boolean inactive) { // Purpur - Lobotomize stuck villagers - not final + // Paper end - EAR 2 + ProfilerFiller profilerFiller = Profiler.get(); + profilerFiller.push("villagerBrain"); +- if (!inactive) this.getBrain().tick(level, this); // Paper - EAR 2 ++ // Purpur start - Lobotomize stuck villagers ++ if (this.level().purpurConfig.villagerLobotomizeEnabled) { ++ // treat as inactive if lobotomized ++ inactive = inactive || checkLobotomized(); ++ } else { ++ this.isLobotomized = false; ++ } ++ // Purpur end - Lobotomize stuck villagers ++ // Pufferfish start ++ if (!inactive /*&& this.behaviorTick++ % this.activatedPriority == 0*/) { ++ this.getBrain().tick(level, this); // Paper - EAR 2 ++ } ++ // Pufferfish end + profilerFiller.pop(); + if (this.assignProfessionWhenSpawned) { + this.assignProfessionWhenSpawned = false; @@ -365,6 +_,7 @@ return InteractionResult.CONSUME; } diff --git a/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java.patch b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java.patch new file mode 100644 index 000000000..2072df52c --- /dev/null +++ b/purpur-server/paper-patches/files/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java.patch @@ -0,0 +1,14 @@ +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java +@@ -375,4 +_,11 @@ + getHandle().getGossips().gossips.clear(); + } + // Paper end ++ ++ // Purpur start - Lobotomize stuck villagers ++ @Override ++ public boolean isLobotomized() { ++ return getHandle().isLobotomized(); ++ } ++ // Purpur end - Lobotomize stuck villagers + } diff --git a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index 74cbef93f..a1c8438d1 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -2914,6 +2914,9 @@ public class PurpurWorldConfig { public boolean villagerAllowTrading = true; public boolean villagerAlwaysDropExp = false; public int villagerMinimumDemand = 0; + public boolean villagerLobotomizeEnabled = false; + public int villagerLobotomizeCheckInterval = 100; + public boolean villagerLobotomizeWaitUntilTradeLocked = false; private void villagerSettings() { villagerRidable = getBoolean("mobs.villager.ridable", villagerRidable); villagerRidableInWater = getBoolean("mobs.villager.ridable-in-water", villagerRidableInWater); @@ -2937,6 +2940,18 @@ public class PurpurWorldConfig { villagerAllowTrading = getBoolean("mobs.villager.allow-trading", villagerAllowTrading); villagerAlwaysDropExp = getBoolean("mobs.villager.always-drop-exp", villagerAlwaysDropExp); villagerMinimumDemand = getInt("mobs.villager.minimum-demand", villagerMinimumDemand); + if (PurpurConfig.version < 9) { + boolean oldValue = getBoolean("mobs.villager.lobotomize-1x1", villagerLobotomizeEnabled); + set("mobs.villager.lobotomize.enabled", oldValue); + set("mobs.villager.lobotomize-1x1", null); + } + if (PurpurConfig.version < 27) { + int oldValue = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval); + set("mobs.villager.lobotomize.check-interval", oldValue == 60 ? 100 : oldValue); + } + villagerLobotomizeEnabled = getBoolean("mobs.villager.lobotomize.enabled", villagerLobotomizeEnabled); + villagerLobotomizeCheckInterval = getInt("mobs.villager.lobotomize.check-interval", villagerLobotomizeCheckInterval); + villagerLobotomizeWaitUntilTradeLocked = getBoolean("mobs.villager.lobotomize.wait-until-trade-locked", villagerLobotomizeWaitUntilTradeLocked); } public boolean vindicatorRidable = false;