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

const TICK_INTERVAL = 180; // cada 180 ticks (~9 segundos)
const PLAYER_RADIUS = 5;   // distancia para agrupar jugadores
const PARTICLE_ID = "pa:constelacion";

// Función para calcular distancia entre dos posiciones
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);
}

// Comprueba si el jugador está fuera del rango permitido
function isInForbiddenRange(pos) {
  const absX = Math.abs(pos.x);
  const absZ = Math.abs(pos.z);
  // Si X o Z superan ±20000 → se considera fuera del rango
  return (absX >= 20000 || absZ >= 20000);
}

// Ejecuta cada TICK_INTERVAL
system.runInterval(() => {
  const players = world.getPlayers().filter(p => p.dimension.id === "minecraft:the_end");
  const grouped = new Set();

  for (let i = 0; i < players.length; i++) {
    const p1 = players[i];
    if (grouped.has(p1.name)) continue;

    // ❌ No generar partículas si el jugador está fuera del rango permitido
    if (isInForbiddenRange(p1.location)) continue;

    // Crear grupo de jugadores cercanos
    const group = [p1];
    for (let j = i + 1; j < players.length; j++) {
      const p2 = players[j];
      if (grouped.has(p2.name)) continue;

      if (getDistance(p1.location, p2.location) <= PLAYER_RADIUS) {
        group.push(p2);
        grouped.add(p2.name);
      }
    }

    // Marcar jugador principal del grupo como procesado
    grouped.add(p1.name);

    // Posición de la partícula → en el jugador principal del grupo
    const pos = p1.location;
    p1.dimension.spawnParticle(PARTICLE_ID, pos);
  }
}, TICK_INTERVAL);