Lobotomize stuck villagers

This commit is contained in:
William Blake Galbreath
2025-01-12 14:38:06 -08:00
committed by granny
parent 9cf9db1dbd
commit ce589297ea
19 changed files with 205 additions and 244 deletions

View File

@@ -1,25 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: BillyGalbreath <Blake.Galbreath@Gmail.com>
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
}

View File

@@ -1,139 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
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<? extends Villager> 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<Villager> getBrain() {
return (Brain<Villager>) 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;

View File

@@ -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
}

View File

@@ -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<TickTa
@@ -1734,6 +1734,7 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
serverLevel.hasEntityMoveEvent = io.papermc.paper.event.entity.EntityMoveEvent.getHandlerList().getRegisteredListeners().length > 0; // Paper - Add EntityMoveEvent
serverLevel.updateLagCompensationTick(); // Paper - lag compensation
net.minecraft.world.level.block.entity.HopperBlockEntity.skipHopperEvents = serverLevel.paperConfig().hopper.disableMoveEvent || org.bukkit.event.inventory.InventoryMoveItemEvent.getHandlerList().getRegisteredListeners().length == 0; // Paper - Perf: Optimize Hoppers
@@ -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<Villager> getBrain() {
return (Brain<Villager>)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 {

View File

@@ -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

View File

@@ -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

View File

@@ -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<TickTa
@@ -1211,7 +1211,15 @@ public abstract class MinecraftServer extends ReentrantBlockableEventLoop<TickTa
LOGGER.info("*************************************************************************************");
}
// Paper end - Add onboarding message for initial server start
@@ -28,7 +28,7 @@ index 47b1f87e224fe963807c244e9cf03b2c8b049d9c..e535d67c8c910884e151863b2dd793a3
long l;
if (!this.isPaused() && this.tickRateManager.isSprinting() && this.tickRateManager.checkShouldSprintThisTick()) {
diff --git a/net/minecraft/server/dedicated/DedicatedServer.java b/net/minecraft/server/dedicated/DedicatedServer.java
index 30f564baff8f0c0526ece7f46cf6c2acc3054906..add61fdd55cd47247bf9dd2f625631c4536bb90a 100644
index 2e0846bd7d98d1c33d5a74ccbd41f4c4092ea6a1..5d897a8b9752e7416e528a79f4d12f712528dde8 100644
--- a/net/minecraft/server/dedicated/DedicatedServer.java
+++ b/net/minecraft/server/dedicated/DedicatedServer.java
@@ -208,6 +208,15 @@ public class DedicatedServer extends MinecraftServer implements ServerInterface

View File

@@ -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 fef8910f31d697a77ea6f0e7aa6fd5ebb26367a1..0839dbdc74036a2b3e4bfc934eb95dfb88f010d8 100644
index b96fc67d28809f66181b1d36b475a8f85d596ea7..4c7c8840584736fc55782314342e55cc84f233ec 100644
--- a/net/minecraft/world/entity/LivingEntity.java
+++ b/net/minecraft/world/entity/LivingEntity.java
@@ -3585,7 +3585,18 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -3592,7 +3592,18 @@ public abstract class LivingEntity extends Entity implements Attackable {
if (i1 % 2 == 0) {
List<EquipmentSlot> list = EquipmentSlot.VALUES.stream().filter(slot -> canGlideUsing(this.getItemBySlot(slot), slot)).toList();
EquipmentSlot equipmentSlot = Util.getRandom(list, this.random);

View File

@@ -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 {
}
}

View File

@@ -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<Player> 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.<Player, Double>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;

View File

@@ -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<Holder<CatVarian
@@ -204,7 +204,7 @@ index 5b07dff937c8873300eabecf1c510cf562fae4f3..450c7be36846bf4e95f84615fca89350
protected boolean canDispenserEquipIntoSlot(EquipmentSlot slot) {
return slot == EquipmentSlot.MAINHAND && this.canPickUpLoot();
diff --git a/net/minecraft/world/entity/animal/Parrot.java b/net/minecraft/world/entity/animal/Parrot.java
index 0d78ebe27928006f11e9b49380d6a759d273645d..1020e28a8c82b786a317098e2072d1a16f8964f0 100644
index 87de937fd17c2e7e8916f8503b0334e7015bdb8f..9d7e142cc4b9ea32aad7ab17f3fc09a7a3a1d862 100644
--- a/net/minecraft/world/entity/animal/Parrot.java
+++ b/net/minecraft/world/entity/animal/Parrot.java
@@ -194,6 +194,13 @@ public class Parrot extends ShoulderRidingEntity implements VariantHolder<Parrot
@@ -312,7 +312,7 @@ index 4f0fbbb2caeda6d1477d3297fd68f802e4f3a9ca..edbccb7ca27aa8a1917eb8b35b3ba860
this.entityData.set(HOME_POS, homePos);
}
diff --git a/net/minecraft/world/entity/animal/Wolf.java b/net/minecraft/world/entity/animal/Wolf.java
index 710d37dc7623738ce8d8310eaecec8e3a1bc63f0..3e1cb63c1658dccc3bee53ed82ff5b5b7f321afd 100644
index 93a0fda3a2f3598c9f5606e4f379b60a2129a07b..136f2c43272e5a45e473b66656818ed88de1cff3 100644
--- a/net/minecraft/world/entity/animal/Wolf.java
+++ b/net/minecraft/world/entity/animal/Wolf.java
@@ -210,6 +210,13 @@ public class Wolf extends TamableAnimal implements NeutralMob, VariantHolder<Hol
@@ -455,7 +455,7 @@ index 8bd118e82da9e4d4153de0a3efaf6d69e3c4c540..0339ab08b3029a9ffc102c5b865e411a
protected void randomizeAttributes(RandomSource random) {
this.getAttribute(Attributes.MAX_HEALTH).setBaseValue(generateMaxHealth(random::nextInt));
diff --git a/net/minecraft/world/entity/animal/horse/Llama.java b/net/minecraft/world/entity/animal/horse/Llama.java
index 8b6beeff7ad0c7ca7bc09f505891f560096d5c9a..67413d7c1cbef72a9068b33ea69125315aa35565 100644
index 58e726dd33f572a31b4910b9ff666c4252fb03a9..6efe52edb6909ed2b38210ce6a0334eddc55f261 100644
--- a/net/minecraft/world/entity/animal/horse/Llama.java
+++ b/net/minecraft/world/entity/animal/horse/Llama.java
@@ -141,6 +141,13 @@ public class Llama extends AbstractChestedHorse implements VariantHolder<Llama.V

View File

@@ -135,10 +135,10 @@ index 6b99afb4f237b5d6def98f3e03492975b795bc95..234e9d4aca14bc2a2e138918be143051
brain.setMemory(MemoryModuleType.SECONDARY_JOB_SITE, list);
} else {
diff --git a/net/minecraft/world/entity/npc/Villager.java b/net/minecraft/world/entity/npc/Villager.java
index 9f756a6505ab185f7dd1cb671891f2095251ce0e..09290db1fd3ca65b08862c6cfe3c9d21a77adc4f 100644
index 2f685a186b2dc27e70cddd5c4951c27e7ee3ef53..c301a89f032746487a4e993d920060450433f238 100644
--- a/net/minecraft/world/entity/npc/Villager.java
+++ b/net/minecraft/world/entity/npc/Villager.java
@@ -265,7 +265,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@@ -311,7 +311,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
villagerBrain.setSchedule(Schedule.VILLAGER_DEFAULT);
villagerBrain.addActivityWithConditions(
Activity.WORK,
@@ -147,7 +147,7 @@ index 9f756a6505ab185f7dd1cb671891f2095251ce0e..09290db1fd3ca65b08862c6cfe3c9d21
ImmutableSet.of(Pair.of(MemoryModuleType.JOB_SITE, MemoryStatus.VALUE_PRESENT))
);
}
@@ -918,7 +918,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
@@ -976,7 +976,7 @@ public class Villager extends AbstractVillager implements ReputationEventHandler
}
public boolean hasFarmSeeds() {

View File

@@ -5,10 +5,10 @@ Subject: [PATCH] Add mobGriefing bypass to everything affected
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
index 0839dbdc74036a2b3e4bfc934eb95dfb88f010d8..40c61ff158f700659de100b61ff0490b8b7a78b5 100644
index 4c7c8840584736fc55782314342e55cc84f233ec..1e37b69139cc72ca54109d2d1316820d3b89b995 100644
--- a/net/minecraft/world/entity/LivingEntity.java
+++ b/net/minecraft/world/entity/LivingEntity.java
@@ -1808,7 +1808,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
@@ -1815,7 +1815,7 @@ public abstract class LivingEntity extends Entity implements Attackable {
if (this.level() instanceof ServerLevel serverLevel) {
boolean var6 = false;
if (this.dead && entitySource instanceof WitherBoss) { // Paper
@@ -307,7 +307,7 @@ index 8270d76a753bfd26a4c8ef6610bee5c24ee59cfe..c06b589e669b055a26f662df60070d59
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 78597e2cb78d15846e24bf45d5b56d21dbf1b4a3..861c669e59a1c286fd03fbed41ab47cfc27cdb6b 100644
index b43f16297ac4441d78d0dc1fadb555698b0c3f6d..27f0c5c886a3f8b14ef9a00e2aaaabf4bf09c7db 100644
--- a/net/minecraft/world/level/block/CropBlock.java
+++ b/net/minecraft/world/level/block/CropBlock.java
@@ -182,7 +182,7 @@ public class CropBlock extends BushBlock implements BonemealableBlock {
@@ -320,12 +320,12 @@ index 78597e2cb78d15846e24bf45d5b56d21dbf1b4a3..861c669e59a1c286fd03fbed41ab47cf
}
diff --git a/net/minecraft/world/level/block/FarmBlock.java b/net/minecraft/world/level/block/FarmBlock.java
index eda8c35b7477a8a3107d865334e68653e061e6b3..7f5358e6c1fd574fb9a96a507e411da7916d0a40 100644
index 6ab9a1188ce60e114ef35e393d9f2f46d490af83..9a7ca836e54cc3f58001c85f0079747f4d4941ad 100644
--- a/net/minecraft/world/level/block/FarmBlock.java
+++ b/net/minecraft/world/level/block/FarmBlock.java
@@ -114,7 +114,7 @@ public class FarmBlock extends Block {
if (level instanceof ServerLevel serverLevel
&& level.random.nextFloat() < fallDistance - 0.5F
&& (serverLevel.purpurConfig.farmlandTrampleHeight >= 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 {

View File

@@ -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<Zoglin> 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

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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<? extends Villager> 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<Villager> getBrain() {
return (Brain<Villager>)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;
}

View File

@@ -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
}

View File

@@ -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;