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

function getDistance(pos1, pos2) {
  const dx = pos1.x - pos2.x;
  const dy = pos1.y - pos2.y;
  const dz = pos1.z - pos2.z;
  return Math.sqrt(dx * dx + dy * dy + dz * dz);
}

// Guarda la última posición del jugador
const lastPositions = new Map();

// Comprueba si está fuera del rango permitido
function isBeyondLimit(pos) {
  const absX = Math.abs(pos.x);
  const absZ = Math.abs(pos.z);
  return absX >= 20000 || absZ >= 20000;
}

function spawnLuciernagas() {
  for (const player of world.getPlayers()) {
    if (player.dimension.id !== "minecraft:the_end") continue;

    const currentPos = player.location;

    // ❌ Evitar generar partículas fuera del rango permitido
    if (isBeyondLimit(currentPos)) continue;

    const lastPos = lastPositions.get(player.name);
    let moved = true;

    if (lastPos) {
      moved = getDistance(currentPos, lastPos) > 0.2;
    }

    lastPositions.set(player.name, { ...currentPos });

    // Si se mueve → más partículas; si no → pocas
    const particlesToSpawn = moved ? 3 : 1;

    for (let i = 0; i < particlesToSpawn; i++) {
      // Probabilidad para evitar saturación
      if (Math.random() < 0.3) {
        // Genera la partícula a cierta distancia del jugador
        const distance = Math.random() * 20 + 5; // 5–25 bloques
        const angle = Math.random() * Math.PI * 2;
        const heightOffset = Math.random() * 10 - 5; // -5 a +5 bloques

        const particlePos = {
          x: currentPos.x + Math.cos(angle) * distance,
          y: currentPos.y + heightOffset,
          z: currentPos.z + Math.sin(angle) * distance,
        };

        player.dimension.spawnParticle("pa:brillo", particlePos);
      }
    }
  }
}

// Ejecuta cada 0.5 segundos
system.runInterval(spawnLuciernagas, 20);