Hacky EAR 2.0 fixes

EAR yields immunity to entities that are not on the ground and are not
"flying entities". What this "flying entity" filter actually entails
however is undocumented. The previous implementation checked for
FlyingMob, which only covered ghasts and phantoms, leaving entities like
the blaze and wither untouched for *some* reason.

To be improved by consulting the elders (cat).
This commit is contained in:
Bjarne Koll
2025-06-01 20:33:10 +02:00
parent ed3b39e944
commit ff05a2df63

View File

@@ -15,19 +15,20 @@ Adds villagers as separate config
diff --git a/io/papermc/paper/entity/activation/ActivationRange.java b/io/papermc/paper/entity/activation/ActivationRange.java diff --git a/io/papermc/paper/entity/activation/ActivationRange.java b/io/papermc/paper/entity/activation/ActivationRange.java
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..2ebee223085fe7926c7f3e555df19ae69f36157e index 0000000000000000000000000000000000000000..ae2bb9a73106febfe5f0d090abd4252bbb5fd27e
--- /dev/null --- /dev/null
+++ b/io/papermc/paper/entity/activation/ActivationRange.java +++ b/io/papermc/paper/entity/activation/ActivationRange.java
@@ -0,0 +1,318 @@ @@ -0,0 +1,334 @@
+package io.papermc.paper.entity.activation; +package io.papermc.paper.entity.activation;
+ +
+import net.minecraft.core.BlockPos; +import net.minecraft.core.BlockPos;
+import net.minecraft.server.MinecraftServer; +import net.minecraft.server.MinecraftServer;
+import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.Entity;
+import net.minecraft.world.entity.EntityType;
+import net.minecraft.world.entity.ExperienceOrb; +import net.minecraft.world.entity.ExperienceOrb;
+import net.minecraft.world.entity.FlyingMob;
+import net.minecraft.world.entity.LightningBolt; +import net.minecraft.world.entity.LightningBolt;
+import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.LivingEntity;
+import net.minecraft.world.entity.Marker;
+import net.minecraft.world.entity.Mob; +import net.minecraft.world.entity.Mob;
+import net.minecraft.world.entity.ai.Brain; +import net.minecraft.world.entity.ai.Brain;
+import net.minecraft.world.entity.animal.Animal; +import net.minecraft.world.entity.animal.Animal;
@@ -38,6 +39,7 @@ index 0000000000000000000000000000000000000000..2ebee223085fe7926c7f3e555df19ae6
+import net.minecraft.world.entity.boss.enderdragon.EndCrystal; +import net.minecraft.world.entity.boss.enderdragon.EndCrystal;
+import net.minecraft.world.entity.boss.enderdragon.EnderDragon; +import net.minecraft.world.entity.boss.enderdragon.EnderDragon;
+import net.minecraft.world.entity.boss.wither.WitherBoss; +import net.minecraft.world.entity.boss.wither.WitherBoss;
+import net.minecraft.world.entity.item.FallingBlockEntity;
+import net.minecraft.world.entity.item.ItemEntity; +import net.minecraft.world.entity.item.ItemEntity;
+import net.minecraft.world.entity.item.PrimedTnt; +import net.minecraft.world.entity.item.PrimedTnt;
+import net.minecraft.world.entity.monster.Creeper; +import net.minecraft.world.entity.monster.Creeper;
@@ -51,9 +53,13 @@ index 0000000000000000000000000000000000000000..2ebee223085fe7926c7f3e555df19ae6
+import net.minecraft.world.entity.projectile.ThrowableProjectile; +import net.minecraft.world.entity.projectile.ThrowableProjectile;
+import net.minecraft.world.entity.projectile.ThrownTrident; +import net.minecraft.world.entity.projectile.ThrownTrident;
+import net.minecraft.world.entity.schedule.Activity; +import net.minecraft.world.entity.schedule.Activity;
+import net.minecraft.world.entity.vehicle.AbstractBoat;
+import net.minecraft.world.entity.vehicle.AbstractMinecart;
+import net.minecraft.world.level.Level; +import net.minecraft.world.level.Level;
+import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.AABB;
+import org.spigotmc.SpigotWorldConfig; +import org.spigotmc.SpigotWorldConfig;
+import java.util.List;
+import java.util.Set;
+ +
+public final class ActivationRange { +public final class ActivationRange {
+ +
@@ -121,9 +127,9 @@ index 0000000000000000000000000000000000000000..2ebee223085fe7926c7f3e555df19ae6
+ || entity instanceof AbstractHurtingProjectile + || entity instanceof AbstractHurtingProjectile
+ || entity instanceof LightningBolt + || entity instanceof LightningBolt
+ || entity instanceof PrimedTnt + || entity instanceof PrimedTnt
+ || entity instanceof net.minecraft.world.entity.item.FallingBlockEntity + || entity instanceof FallingBlockEntity
+ || entity instanceof net.minecraft.world.entity.vehicle.AbstractMinecart + || entity instanceof AbstractMinecart
+ || entity instanceof net.minecraft.world.entity.vehicle.AbstractBoat + || entity instanceof AbstractBoat
+ || entity instanceof EndCrystal + || entity instanceof EndCrystal
+ || entity instanceof FireworkRocketEntity + || entity instanceof FireworkRocketEntity
+ || entity instanceof ThrownTrident; + || entity instanceof ThrownTrident;
@@ -172,10 +178,10 @@ index 0000000000000000000000000000000000000000..2ebee223085fe7926c7f3e555df19ae6
+ ActivationType.FLYING_MONSTER.boundingBox = player.getBoundingBox().inflate(flyingActivationRange, worldHeight, flyingActivationRange); + ActivationType.FLYING_MONSTER.boundingBox = player.getBoundingBox().inflate(flyingActivationRange, worldHeight, flyingActivationRange);
+ ActivationType.VILLAGER.boundingBox = player.getBoundingBox().inflate(villagerActivationRange, worldHeight, villagerActivationRange); + ActivationType.VILLAGER.boundingBox = player.getBoundingBox().inflate(villagerActivationRange, worldHeight, villagerActivationRange);
+ +
+ final java.util.List<Entity> entities = world.getEntities((Entity) null, ActivationRange.maxBB, e -> true); + final List<Entity> entities = world.getEntities((Entity) null, ActivationRange.maxBB, e -> true);
+ final boolean tickMarkers = world.paperConfig().entities.markers.tick; + final boolean tickMarkers = world.paperConfig().entities.markers.tick;
+ for (final Entity entity : entities) { + for (final Entity entity : entities) {
+ if (!tickMarkers && entity instanceof net.minecraft.world.entity.Marker) { + if (!tickMarkers && entity instanceof Marker) {
+ continue; + continue;
+ } + }
+ +
@@ -228,7 +234,7 @@ index 0000000000000000000000000000000000000000..2ebee223085fe7926c7f3e555df19ae6
+ return 100; + return 100;
+ } + }
+ if (!(entity instanceof final AbstractArrow arrow)) { + if (!(entity instanceof final AbstractArrow arrow)) {
+ if ((!entity.onGround() && !(entity instanceof FlyingMob))) { + if ((!entity.onGround() && !isEntityThatFlies(entity))) {
+ return 10; + return 10;
+ } + }
+ } else if (!arrow.isInGround()) { + } else if (!arrow.isInGround()) {
@@ -336,6 +342,16 @@ index 0000000000000000000000000000000000000000..2ebee223085fe7926c7f3e555df19ae6
+ // removed the original's dumb tick skipping for active entities + // removed the original's dumb tick skipping for active entities
+ return isActive; + return isActive;
+ } + }
+
+ private static Set<EntityType<?>> ENTITIES_THAT_FLY = Set.of(
+ EntityType.GHAST,
+ EntityType.HAPPY_GHAST,
+ EntityType.PHANTOM
+ );
+
+ private static boolean isEntityThatFlies(final Entity entity) {
+ return ENTITIES_THAT_FLY.contains(entity.getType());
+ }
+} +}
diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java diff --git a/net/minecraft/server/level/ChunkMap.java b/net/minecraft/server/level/ChunkMap.java
index a0eec03c9e710f871413f2052e9d2839d6bb0c54..f517b0d9d5ad5176f641ac61e2bef3a456b41e57 100644 index a0eec03c9e710f871413f2052e9d2839d6bb0c54..f517b0d9d5ad5176f641ac61e2bef3a456b41e57 100644