From 7d060c599520b960047c8a7c259c314a9e4cb189 Mon Sep 17 00:00:00 2001 From: AdoLovesChicken Date: Tue, 26 May 2026 17:39:02 +1000 Subject: [PATCH] Fix collision issues on sub-levels with dying entities (https://github.com/ryanhcode/sable/issues/593) --- .../entity_sublevel_collision/EntityMixin.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/EntityMixin.java b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/EntityMixin.java index dcd86f47..e3391d5d 100644 --- a/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/EntityMixin.java +++ b/common/src/main/java/dev/ryanhcode/sable/mixin/entity/entity_sublevel_collision/EntityMixin.java @@ -108,8 +108,23 @@ public void updateEntityAfterFallOn(final Block instance, final BlockGetter arg, @Redirect(method = "move(Lnet/minecraft/world/entity/MoverType;Lnet/minecraft/world/phys/Vec3;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;collide(Lnet/minecraft/world/phys/Vec3;)Lnet/minecraft/world/phys/Vec3;")) public Vec3 sable$collideRedirect(final Entity entity, final Vec3 collisionMotion) { + final double MAX_MOTION = 10.0; + final Vec3 clampedMotion = (Math.abs(collisionMotion.x) > MAX_MOTION || + Math.abs(collisionMotion.y) > MAX_MOTION || + Math.abs(collisionMotion.z) > MAX_MOTION) + ? Vec3.ZERO + : collisionMotion; + + if (entity.isRemoved() + || (entity instanceof LivingEntity living && living.isDeadOrDying())) { + this.sable$collisionInfo = new SubLevelEntityCollision.CollisionInfo(); + this.sable$collisionInfo.motion = clampedMotion; + this.sable$trackingSubLevel = null; + return this.collide(clampedMotion); + } + final Entity self = (Entity) (Object) this; - final Vec3 motion = collisionMotion; + final Vec3 motion = clampedMotion; Vec3 velocity = Vec3.ZERO;