调度器API
调度器API允许脚本在指定时间后执行代码,或者定期重复执行代码,是实现延迟操作和定时任务的重要工具。
基本概念
- 刻(Tick):游戏中的时间单位,1秒等于20刻
- 延迟执行:在指定刻数后执行一次代码
- 重复执行:每隔指定刻数重复执行代码
- 延迟重复执行:在延迟指定刻数后,开始重复执行代码
调度器方法
调度器API通过 allay 对象提供。
allay.runLater(delay, callback, thisArg)
延迟指定刻数后执行一次回调函数。
参数:
- delay - 延迟的刻数(Number),20刻=1秒
- callback - 延迟后要执行的回调函数
- thisArg - 回调函数中的 this 值(可选)
示例:
function onPlayerJoin(player) {
player.sendMessage("欢迎来到服务器!");
// 延迟10秒(200刻)后发送欢迎消息
allay.runLater(200, function() {
player.sendMessage("希望你在服务器玩得愉快!");
}, this);
}
allay.runRepeating(period, callback, thisArg)
每隔指定刻数重复执行回调函数。
参数:
- period - 重复执行的间隔刻数(Number),20刻=1秒
- callback - 每隔指定刻数要执行的回调函数
- thisArg - 回调函数中的 this 值(可选)
示例:
function onEnable() {
console.log("服务器监控已启动");
// 每分钟(1200刻)检查一次在线玩家数量
allay.runRepeating(1200, function() {
var onlineCount = getOnlinePlayerCount();
var maxPlayers = getMaxPlayers();
console.log("当前在线人数: " + onlineCount + "/" + maxPlayers);
}, this);
}
allay.runDelayedRepeating(delay, period, callback, thisArg)
延迟指定刻数后,每隔指定刻数重复执行回调函数。
参数:
- delay - 初始延迟的刻数(Number)
- period - 重复执行的间隔刻数(Number)
- callback - 要执行的回调函数
- thisArg - 回调函数中的 this 值(可选)
示例:
function onEnable() {
console.log("自动保存系统已启动");
// 延迟10秒(200刻)后开始自动保存,然后每隔30秒(600刻)保存一次
allay.runDelayedRepeating(200, 600, function() {
console.log("开始自动保存数据...");
// 这里可以添加保存数据的逻辑
console.log("自动保存完成!");
}, this);
}
allay.cleanup()
清理所有事件监听和定时任务,包括所有调度器任务。
示例:
function onDisable() {
console.log("清理所有任务");
allay.cleanup(); // 清理所有事件监听和定时任务
}
示例:自动广播系统
function onEnable() {
console.log("自动广播系统已启动");
// 广播消息列表
var messages = [
"欢迎来到服务器!",
"请遵守服务器规则。",
"如有问题,请联系管理员。",
"享受游戏时光!"
];
var messageIndex = 0;
// 每隔5分钟(6000刻)广播一条消息
allay.runRepeating(6000, function() {
var message = messages[messageIndex];
broadcast(message); // 假设broadcast是一个广播函数
console.log("广播消息: " + message);
messageIndex = (messageIndex + 1) % messages.length;
}, this);
}
function onDisable() {
console.log("自动广播系统已禁用");
allay.cleanup();
}
示例:倒计时系统
function startCountdown(player, seconds, message) {
var remaining = seconds;
// 发送初始消息
player.sendMessage(message);
player.sendMessage("倒计时开始: " + remaining + "秒");
// 每秒更新一次倒计时
var countdownTask = allay.runRepeating(20, function() {
remaining--;
if (remaining > 0) {
player.sendMessage("倒计时: " + remaining + "秒");
} else {
player.sendMessage("倒计时结束!");
// 这里可以添加倒计时结束后的逻辑
// 清理所有任务
allay.cleanup();
}
}, this);
}
// 使用示例
function onPlayerCommand(player, command) {
if (command === "/countdown") {
startCountdown(player, 10, "准备开始活动!");
}
}
注意事项
- 调度器任务会在脚本禁用或卸载时自动清理,无需手动处理
- 使用
allay.cleanup()函数可以手动清理所有调度器任务和事件监听 - 避免设置过小的延迟或间隔,这可能会影响服务器性能
- 长时间运行的回调函数会阻塞服务器主线程,建议保持回调函数简洁高效
- 调度器任务的执行时间可能会因为服务器负载而略有延迟
- 重复执行的任务会一直运行,直到脚本被禁用或卸载,或者手动清理
- 回调函数中的
this值默认是全局对象,如需指定this值,可以使用thisArg参数