Volver al índice

src/main/java/ar/com/companeros/horror/ParasiteClearance.java

package ar.com.companeros.horror;

import net.minecraft.world.entity.Mob;
import net.minecraft.world.level.CollisionGetter;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;

/** Espacio físico del cuerpo: todas las consultas usan las formas de colisión reales. */
final class ParasiteClearance {
    static final float WIDTH = .6F;
    static final float COMPACT_HEIGHT = .85F;
    static final int TRANSITION_TICKS = 12;
    private static final double EPSILON = 1.0E-5;

    private ParasiteClearance() { }

    static AABB bodyAt(Vec3 feet, float height) {
        double radius = WIDTH / 2D;
        return new AABB(feet.x - radius, feet.y, feet.z - radius,
            feet.x + radius, feet.y + height, feet.z + radius).deflate(EPSILON);
    }

    static boolean fits(CollisionGetter world, Mob body, Vec3 feet, float height) {
        return world.noCollision(body, bodyAt(feet, height));
    }

    // Barrido corto y acotado; una escotilla abierta conserva su placa vertical como obstáculo.
    static boolean clearSegment(CollisionGetter world, Mob body, Vec3 from, Vec3 to, float height) {
        Vec3 offset = to.subtract(from);
        int samples = Math.max(1, Math.min(12, (int) Math.ceil(offset.length() / .2)));
        for (int step = 0; step <= samples; step++) {
            if (!fits(world, body, from.add(offset.scale(step / (double) samples)), height)) return false;
        }
        return true;
    }
}