Skip to main content

Scheduler API

Allows executing code with delay or asynchronously.

Methods

MethodDescription
scheduler.runLater(ticks, callback)Execute after N ticks
scheduler.runSync(callback)Execute synchronously (main thread)
scheduler.runAsync(callback)Execute asynchronously

Important: 20 ticks = 1 second

Examples

Delayed Task

// Execute after 10 seconds (200 ticks)
scheduler.runLater(200, () => {
player.sendMessage("§aMessage after 10 seconds!");
});

Synchronous Task

// Execute on main server thread
scheduler.runSync(() => {
const world = server.getWorlds().get(0);
world.setTime(1000);
server.broadcastMessage("§aTime changed!");
});

Asynchronous Task

// Execute in separate thread
scheduler.runAsync(() => {
logger.info("Starting heavy operation...");

// Simulate heavy work
try {
Thread.sleep(5000);
} catch (e) {}

logger.info("Operation complete!");

// Return to main thread for Bukkit interaction
scheduler.runSync(() => {
server.broadcastMessage("§aDone!");
});
});

Timer (Repeating Task)

// Timer in pure JS (needs manual implementation)
let timerTicks = 0;

events.on(org.bukkit.event.server.ServerTickEvent, (event) => {
timerTicks++;

// Every minute (1200 ticks)
if (timerTicks >= 1200) {
timerTicks = 0;
server.broadcastMessage("§eA minute passed!");
}
});

Canceling Task

To cancel a task, save its ID:

// Starting task returns ID
const taskId = scheduler.runLater(200, () => {
// code
});

// Cancel (via Bukkit API)
Bukkit.getScheduler().cancelTask(taskId);

Practical Examples

Delay After Player Join

const PlayerJoinEvent = Java.type('org.bukkit.event.player.PlayerJoinEvent');

events.on(PlayerJoinEvent, (event) => {
const player = event.getPlayer();

// After 5 seconds - reminder
scheduler.runLater(100, () => {
if (player.isOnline()) {
player.sendMessage("§eDon't forget to join our /discord!");
}
});

// After 1 minute - check activity
scheduler.runLater(1200, () => {
if (player.isOnline()) {
// Check player activity
}
});
});

Command Cooldown

let cooldowns = {};

commands.register("kit", "Get kit", "/kit", (sender, args) => {
if (!(sender instanceof org.bukkit.entity.Player)) return;

const player = sender;
const uuid = player.getUniqueId().toString();
const cooldownTime = 3600; // 1 hour in seconds

if (cooldowns[uuid] && Date.now() < cooldowns[uuid]) {
const remaining = Math.ceil((cooldowns[uuid] - Date.now()) / 1000);
player.sendMessage("§cWait " + remaining + " seconds!");
return;
}

// Give kit
const ItemStack = Java.type('org.bukkit.inventory.ItemStack');
const Material = Java.type('org.bukkit.Material');

player.getInventory().addItem(new ItemStack(Material.DIAMOND, 10));
player.sendMessage("§aKit received!");

// Set cooldown
cooldowns[uuid] = Date.now() + (cooldownTime * 1000);
});

When to Use Which Method

SituationMethod
Delay after eventrunLater
Database operationsrunAsync
HTTP requestsrunAsync
World/player modificationsrunSync
Sending messagesrunSync