HimDSL 2.1
现在所有的监听器任务和异步任务
都需明确使用
start("函数名"); stop("函数名");来启动或者关闭。
使用himdsl debug off/on可以关闭复杂的调试日志。
PS:一个文件只start了任务没有stop又不想重启服务器?
脚本里start改成stop,再次运行。
示例脚本。
/*
- HimDSL 事件监听教程脚本
- 功能:玩家可通过 /listen <事件名> 开启监听,/unlisten <事件名> 关闭监听。
- 支持的事件:chat, join, quit, move, break, place, command
- 默认所有监听器均为关闭状态,需手动开启。
*/
int main(){
// 启动命令监听器,以便玩家能够使用 /listen /unlisten 控制其他监听器
start("onCommand");
// 发送帮助信息
runcmd("CONSOLE","say === HimDSL 事件控制教程 ===");
runcmd("CONSOLE","say /listen <事件名> - 开启事件监听");
runcmd("CONSOLE","say /unlisten <事件名> - 关闭事件监听");
runcmd("CONSOLE","say 可用事件: chat, join, quit, move, break, place, command");
runcmd("CONSOLE","say 例如: /listen chat");
}
// ---------- 命令处理监听器 ----------
// 监听玩家发送的命令,解析并控制其他监听器的启停
@eventhandler void onCommand(event(PlayerCommandPreprocessEvent)) {
player p = @s;
var msg = event.getMessage(); // 获取完整命令,如 "/listen chat"
// 处理 /listen 命令
if(startsWith(msg, "/listen")) {
var parts = split(msg, " "); // 按空格分割
if(length(parts) < 2) {
runcmd("CONSOLE","say " + $player(p,name)$ + " 用法: /listen <事件名>");
event.setCancelled(true); // 阻止原命令执行(避免冲突)
return;
}
var name = parts[1]; // 获取事件名
// 根据事件名启动对应的监听器
if(name == "chat") {
start("onChat");
runcmd("CONSOLE","say 已开启聊天监听(消息将自动转为小写)");
} else if(name == "join") {
start("onJoin");
runcmd("CONSOLE","say 已开启玩家加入监听(会显示自定义欢迎消息)");
} else if(name == "quit") {
start("onQuit");
runcmd("CONSOLE","say 已开启玩家退出监听(会显示自定义告别消息)");
} else if(name == "move") {
start("onMove");
runcmd("CONSOLE","say 已开启玩家移动监听(会记录移动信息到日志)");
} else if(name == "break") {
start("onBreak");
runcmd("CONSOLE","say 已开启方块破坏监听(会记录破坏信息到日志)");
} else if(name == "place") {
start("onPlace");
runcmd("CONSOLE","say 已开启方块放置监听(会记录放置信息到日志)");
} else if(name == "command") {
// 注意:命令监听器本身也可开关,但若关闭则无法再通过命令控制,建议保持开启
runcmd("CONSOLE","say 命令监听器不建议关闭,否则无法使用 /listen 和 /unlisten");
} else {
runcmd("CONSOLE","say 未知事件: " + name + ",可用: chat, join, quit, move, break, place, command");
}
event.setCancelled(true); // 阻止原命令
return;
}
// 处理 /unlisten 命令
if(startsWith(msg, "/unlisten")) {
var parts = split(msg, " ");
if(length(parts) < 2) {
runcmd("CONSOLE","say " + $player(p,name)$ + " 用法: /unlisten <事件名>");
event.setCancelled(true);
return;
}
var name = parts[1];
if(name == "chat") {
stop("onChat");
runcmd("CONSOLE","say 已关闭聊天监听");
} else if(name == "join") {
stop("onJoin");
runcmd("CONSOLE","say 已关闭玩家加入监听");
} else if(name == "quit") {
stop("onQuit");
runcmd("CONSOLE","say 已关闭玩家退出监听");
} else if(name == "move") {
stop("onMove");
runcmd("CONSOLE","say 已关闭玩家移动监听");
} else if(name == "break") {
stop("onBreak");
runcmd("CONSOLE","say 已关闭方块破坏监听");
} else if(name == "place") {
stop("onPlace");
runcmd("CONSOLE","say 已关闭方块放置监听");
} else if(name == "command") {
runcmd("CONSOLE","say 命令监听器不建议关闭,否则无法使用 /listen 和 /unlisten");
} else {
runcmd("CONSOLE","say 未知事件: " + name + ",可用: chat, join, quit, move, break, place, command");
}
event.setCancelled(true);
return;
}
// 其他命令不做处理,允许正常执行
}
// ---------- 聊天事件监听 ----------
// 功能:将玩家发送的消息自动转为小写(并默认屏蔽敏感词,可自行扩展)
@eventhandler void onChat(event(AsyncPlayerChatEvent)) {
player p = @s;
var msg = event.getMessage();
// 简单示例:将消息转为小写
var newMsg = toLowerCase(msg);
event.setMessage(newMsg);
// 可扩展屏蔽敏感词(示例)
if(contains(msg, "fuck") || contains(msg, "shit")) {
event.setCancelled(true);
runcmd("CONSOLE","say " +
}
}
// ---------- 玩家加入事件 ----------
@eventhandler void onJoin(event(PlayerJoinEvent)) {
player p = @s;
var name =
// 自定义加入消息
event.setJoinMessage("§a欢迎 " + name + " 进入服务器!");
// 还可执行其他操作,如赠送初始物品等
}
// ---------- 玩家退出事件 ----------
@eventhandler void onQuit(event(PlayerQuitEvent)) {
player p = @s;
var name =
event.setQuitMessage("§c" + name + " 离开了服务器,再见!");
}
// ---------- 玩家移动事件 ----------
@eventhandler void onMove(event(PlayerMoveEvent)) {
player p = @s;
var from = event.getFrom();
var to = event.getTo();
// 仅当坐标有明显变化时输出日志(避免刷屏)
if(from.getX() != to.getX() || from.getY() != to.getY() || from.getZ() != to.getZ()) {
var name =
runcmd("CONSOLE","say " + name + " 移动到 (" + to.getX() + ", " + to.getY() + ", " + to.getZ() + ")");
}
}
// ---------- 方块破坏事件 ----------
@eventhandler void onBreak(event(BlockBreakEvent)) {
player p = @s;
var block = event.getBlock();
var blockType = block.getType().name().toLowerCase();
var name =
runcmd("CONSOLE","say " + name + " 破坏了 " + blockType + " 在 (" + block.getX() + ", " + block.getY() + ", " + block.getZ() + ")");
}
// ---------- 方块放置事件 ----------
@eventhandler void onPlace(event(BlockPlaceEvent)) {
player p = @s;
var block = event.getBlock();
var blockType = block.getType().name().toLowerCase();
var name =
runcmd("CONSOLE","say " + name + " 放置了 " + blockType + " 在 (" + block.getX() + ", " + block.getY() + ", " + block.getZ() + ")");
}