Skip to content

HimDSL 2.1

Choose a tag to compare

@HimxhMC HimxhMC released this 19 Aug 20:11
· 3 commits to main since this release
99f0d47

现在所有的监听器任务和异步任务
都需明确使用
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 " + $player(p,name)$ + " 使用了不文明语言,已拦截");
}
}

// ---------- 玩家加入事件 ----------
@eventhandler void onJoin(event(PlayerJoinEvent)) {
player p = @s;
var name = $player(p,name)$;
// 自定义加入消息
event.setJoinMessage("§a欢迎 " + name + " 进入服务器!");
// 还可执行其他操作,如赠送初始物品等
}

// ---------- 玩家退出事件 ----------
@eventhandler void onQuit(event(PlayerQuitEvent)) {
player p = @s;
var name = $player(p,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 = $player(p,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 = $player(p,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 = $player(p,name)$;
runcmd("CONSOLE","say " + name + " 放置了 " + blockType + " 在 (" + block.getX() + ", " + block.getY() + ", " + block.getZ() + ")");
}