import { world } from "@minecraft/server";

const FLOOD_TYPES = [
    "halo:flood_elite_mayor_rifle_de_plasma",
    "halo:flood_elite_mayor_sin_arma",
    "halo:flood_elite_mayor_revival",
    "halo:flood_elite_mayor_needler",
    "halo:flood_elite_mayor_carbine",
    "halo:flood_elite_ultra_rifle_de_plasma",
    "halo:flood_elite_ultra_sin_arma",
    "halo:flood_elite_ultra_revival",
    "halo:flood_elite_ultra_needler",
    "halo:flood_elite_ultra_carbine",
    "halo:flood_elite_specops_rifle_de_plasma",
    "halo:flood_elite_specops_sin_arma",
    "halo:flood_elite_specops_revival",
    "halo:flood_elite_specops_needler",
    "halo:flood_elite_specops_carbine",
    "halo:flood_elite_invisible_rifle_de_plasma",
    "halo:flood_elite_invisible_sin_arma",
    "halo:flood_elite_invisible_revival",
    "halo:flood_elite_invisible_needler",
    "halo:flood_elite_invisible_carbine",
    "halo:flood_elite_zealot_rifle_de_plasma",
    "halo:flood_elite_zealot_sin_arma",
    "halo:flood_elite_zealot_revival",
    "halo:flood_elite_zealot_needler",
    "halo:flood_elite_zealot_carbine",
    "halo:flood_elite_menor_rifle_de_plasma",
    "halo:flood_elite_menor_sin_arma",
    "halo:flood_elite_menor_revival",
    "halo:flood_elite_menor_needler",
    "halo:flood_elite_menor_carbine",
    "halo:flood_marine_smg",
    "halo:flood_marine_revival",
    "halo:flood_marine_rifle_de_batalla",
    "halo:flood_marine_rifle_de_asalto",
    "halo:flood_marine_sin_arma",
    "halo:flood_brute_revival",
    "halo:flood_brute_sin_arma"
];

const PUSH_FORCE = 2.6;
const PUSH_UP = 0.15;

const MELEE_RANGE = 3;

world.afterEvents.entityHurt.subscribe(ev => {
    const victim = ev.hurtEntity;
    const source = ev.damageSource;
    const attacker = source?.damagingEntity;

    if (!attacker) return;
    if (!FLOOD_TYPES.includes(attacker.typeId)) return;

    if (source.isProjectile || source.projectile) return;

    const dx = victim.location.x - attacker.location.x;
    const dz = victim.location.z - attacker.location.z;
    const distance = Math.hypot(dx, dz);

    if (distance > MELEE_RANGE) return;

    const len = distance || 1;

    victim.applyKnockback(
        dx / len,
        dz / len,
        PUSH_FORCE,
        PUSH_UP
    );
});
