From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Wed, 27 Nov 2024 23:13:12 -0500 Subject: [PATCH] Only player pushable Useful for extreme cases like massive entities collide together in a small area diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java index a927e8a7d9149f5b7abaae50ba8d4fdc6ec87b55..0f717ee9e977ece4f30e66d9d1caf6bb7beecda7 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -3635,7 +3635,7 @@ public abstract class LivingEntity extends Entity implements Attackable { this.checkAutoSpinAttack(boundingBox, this.getBoundingBox()); } - this.pushEntities(); + if (!org.dreeam.leaf.config.modules.gameplay.OnlyPlayerPushable.enabled) this.pushEntities(); // Leaf - Only player pushable // Paper start - Add EntityMoveEvent // Purpur start - Ridables if (this.xo != this.getX() || this.yo != this.getY() || this.zo != this.getZ() || this.yRotO != this.getYRot() || this.xRotO != this.getXRot()) { @@ -3778,7 +3778,12 @@ public abstract class LivingEntity extends Entity implements Attackable { return; } // Paper end - don't run getEntities if we're not going to use its result - List pushableEntities = this.level().getPushableEntities(this, this.getBoundingBox()); + // Leaf start - Only player pushable + final AABB box = this.getBoundingBox(); + List pushableEntities = org.dreeam.leaf.config.modules.gameplay.OnlyPlayerPushable.enabled + ? getNearbyPushablePlayers(this, box, EntitySelector.pushableBy(this)) + : this.level().getPushableEntities(this, box); + // Leaf end - Only player pushable if (!pushableEntities.isEmpty()) { if (this.level() instanceof ServerLevel serverLevel) { // Paper - don't run getEntities if we're not going to use its result; moved up @@ -3812,6 +3817,44 @@ public abstract class LivingEntity extends Entity implements Attackable { } } + // Leaf start - Only player pushable + public List getNearbyPushablePlayers(Entity entity, AABB box, Predicate conditions) { + final Vec3 vec = entity.position; + final net.minecraft.core.BlockPos.MutableBlockPos mutablePos = new net.minecraft.core.BlockPos.MutableBlockPos(); + + mutablePos.set(vec.x, vec.y, vec.z); + + final ca.spottedleaf.moonrise.common.list.ReferenceList players = ((ca.spottedleaf.moonrise.patches.chunk_system.level.ChunkSystemServerLevel) this.level()).moonrise$getNearbyPlayers().getPlayers( + mutablePos, ca.spottedleaf.moonrise.common.misc.NearbyPlayers.NearbyMapType.SPAWN_RANGE + ); + + if (players == null) { + return new java.util.ArrayList<>(); + } + + List ret = null; + + final ServerPlayer[] raw = players.getRawDataUnchecked(); + final int len = players.size(); + + java.util.Objects.checkFromIndexSize(0, len, raw.length); + + for (int i = 0; i < len; ++i) { + final ServerPlayer player = raw[i]; + if (player != entity && box.intersects(player.getBoundingBox()) && conditions.test(player)) { + if (ret == null) { + ret = new java.util.ArrayList<>(len - i); + ret.add(player); + } else { + ret.add(player); + } + } + } + + return ret == null ? new java.util.ArrayList<>() : ret; + } + // Leaf end - Only player pushable + protected void checkAutoSpinAttack(AABB boundingBoxBeforeSpin, AABB boundingBoxAfterSpin) { AABB aabb = boundingBoxBeforeSpin.minmax(boundingBoxAfterSpin); List entities = this.level().getEntities(this, aabb); diff --git a/net/minecraft/world/entity/decoration/ArmorStand.java b/net/minecraft/world/entity/decoration/ArmorStand.java index cb2a8f9cff99a7a906bc7be09d301728742bc11e..f3ef1c11f1f5fe02c0b38f327b527221a5a45b0f 100644 --- a/net/minecraft/world/entity/decoration/ArmorStand.java +++ b/net/minecraft/world/entity/decoration/ArmorStand.java @@ -247,7 +247,7 @@ public class ArmorStand extends LivingEntity { @Override protected void pushEntities() { - if (!this.level().paperConfig().entities.armorStands.doCollisionEntityLookups) return; // Paper - Option to prevent armor stands from doing entity lookups + if (org.dreeam.leaf.config.modules.gameplay.OnlyPlayerPushable.enabled || !this.level().paperConfig().entities.armorStands.doCollisionEntityLookups) return; // Paper - Option to prevent armor stands from doing entity lookups // Leaf - Only player pushable for (Entity entity : this.level().getEntitiesOfClass(AbstractMinecart.class, this.getBoundingBox(), RIDABLE_MINECARTS)) { // Paper - optimise collisions if (this.distanceToSqr(entity) <= 0.2) { entity.push(this);