Scheduler API
El Scheduler API permite ejecutar tareas JS con transacción activa (Tx) para que puedas usar world y server de forma segura, similar a Bukkit.
Todos los callbacks se ejecutan en un contexto seguro y sin deadlocks.
⚠️ No usar
worldniserver.getPlayers()desde timers (setInterval,setTimeout). Para eso usáscheduler.
API
js
scheduler.run(fn)
scheduler.runLater(ticks, fn)
scheduler.runRepeating(ticks, fn) // retorna task.cancel()- ticks: cada tick equivale a 50ms (20 ticks = 1s).
- fn: recibe
(world, server)como argumentos.
Ejemplos reales
1) Ejecutar una tarea inmediata
js
scheduler.run(function(world, server) {
world.setBlock(0, 64, 0, "minecraft:diamond_block");
});2) Ejecutar una vez después de 2 segundos
js
scheduler.runLater(40, function(world, server) {
server.broadcast("§a¡Comenzó el evento!");
});3) Repetir cada segundo
js
var task = scheduler.runRepeating(20, function(world, server) {
server.broadcast("§7Jugadores: §f" + server.getPlayerCount());
});
// detener luego
// task.cancel();4) Usar world + player con scoreboard
js
scheduler.runRepeating(5, function(world, server) {
var players = server.getPlayers();
for (var i = 0; i < players.length; i++) {
var p = players[i];
var sb = scoreboard.create("§aServidor");
sb.setLines([
"§7Coords: " + Math.floor(p.getX()) + " " + Math.floor(p.getY()) + " " + Math.floor(p.getZ()),
"§7Bloque debajo: " + world.getBlock(Math.floor(p.getX()), Math.floor(p.getY()) - 1, Math.floor(p.getZ()))
]);
p.sendScoreboard(sb);
}
});5) Acceder a inventarios de cofres
js
scheduler.run(function(world) {
var inv = world.getInventory(0, 64, 0);
if (inv) {
inv.addItem("minecraft:diamond", 1);
}
});¿Por qué usar scheduler?
worldyservernecesitan Tx activa.setTimeoutysetIntervalno tienen Tx → pueden causar deadlocks.- Scheduler siempre ejecuta dentro de
World.Exec()con Tx segura.
Cancelación
js
var task = scheduler.runRepeating(20, function(world, server) {
server.broadcast("tick");
});
// cancelar cuando quieras
// task.cancel();