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


export const event_raincloud = {
  onTick: ({ block, dimension }) => {
    dimension.spawnParticle("dungeon:rain", {
      x: block.location.x + 0,
      y: block.location.y - 0,
      z: block.location.z + 0
    });
  },
};

// Almacenamos jugadores activados
const activatedPlayers = new Set();

// Función principal para detectar bloques de nube alrededor de un jugador
export function detectCloudBlocks(player) {
  const targetBlock = ["dungeon:darkcloud", "dungeon:cloud"]; // Bloques objetivo
  const scoreboardName = "cloudblocks"; // Nombre del scoreboard
  const playerPos = player.location;

  // Configuración del rango de detección
  const range = 0.05;
  const startX = Math.floor(playerPos.x - range);
  const startY = Math.max(Math.floor(playerPos.y - 1), -62); // Límite Y mínimo
  const startZ = Math.floor(playerPos.z - range);

  const endX = Math.floor(playerPos.x + range);
  const endY = Math.min(Math.floor(playerPos.y + 0), 319); // Límite Y máximo
  const endZ = Math.floor(playerPos.z + range);

  let count = 0;

  // Optimizar iteraciones dentro del rango
  const dimension = world.getDimension(player.dimension.id);
  outerLoop: for (let x = startX; x <= endX; x++) {
    for (let y = startY; y <= endY; y++) {
      for (let z = startZ; z <= endZ; z++) {
        const block = dimension.getBlock({ x, y, z });
        if (block && targetBlock.includes(block.typeId)) {
          count++;
          if (count >= 1) break outerLoop; // Salir de todos los bucles al alcanzar el objetivo
        }
      }
    }
  }

  // Gestionar el estado del jugador en base al conteo
  if (count >= 1) {
    // Aplicar efectos personalizados
    player.runCommandAsync(`effect @s slow_falling 2 1 true`);
    player.runCommandAsync(`tag @s add cloudzone`);
    player.runCommandAsync(`scoreboard players set @s ${scoreboardName} ${count}`);

  } else {
    if (activatedPlayers.has(player.name)) {
      activatedPlayers.delete(player.name); // Quitar del conjunto

      // Eliminar efectos si ya no cumple con las condiciones
      player.runCommandAsync(`scoreboard players set @s ${scoreboardName} 0`);
      player.runCommandAsync(`tag @s remove cloudzone`);
    }
  }
}

// Ejecutar la verificación periódicamente
system.runInterval(() => {
  const players = world.getPlayers();

  // Detectar bloques solo si hay jugadores en el mundo
  if (players.length > 0) {
    players.forEach(player => {
      detectCloudBlocks(player); // Verificar bloques de nube alrededor del jugador
    });
  }
}, 20); // Cada 2 segundos (40 ticks)
