Skip to content

静态事件 v1.2

使用 @on(Event) 可以把函数绑定到编译器生成的事件分发器上。

基本语法

mcrs
@on(PlayerDeath)
fn handle_death(player: Player) {
    say("Player died!");
}

@on(PlayerJoin)
fn handle_join(player: Player) {
    give(player, "minecraft:diamond", 1);
}

事件运行时会注入 execute 上下文。推荐使用无参数 handler,并用 @s 表示触发事件的玩家;单个 Player 参数仍为兼容旧写法而接受。

可用事件

事件负载触发时机
PlayerDeathPlayer玩家死亡时
PlayerJoinPlayer玩家首次出现或重新加入时
EntityKillPlayer玩家击杀实体时

同一个事件可以注册多个处理函数。RedScript 会为每种事件生成一个分发器,并依次调用匹配的处理函数。

RedScript 不提供通用的内置物品使用事件。物品特定行为请使用 @function_tag(...),并配合你自己维护的记分板或进度 dispatcher。

示例

mcrs
@on(PlayerJoin)
fn welcome(player: Player) {
    say(f"Welcome {player}!");
}

@on(EntityKill)
fn reward_kill() {
    scoreboard_add(@s, "kills", 1);
}

编译方式

RedScript 会为每个被订阅的事件生成分发函数,并把你的处理器接入这些分发器。

  • 事件处理函数本身仍然是普通的强类型函数
  • 编译器负责生成 Minecraft 侧的检测逻辑
  • 匹配到的玩家或实体会被传入分发调用

这样既能保持事件代码简洁,也仍然会编译成普通的数据包函数。

如何选择事件入口

内置事件运行时请使用 @on(...)@on_death@on_login 等旧式专用名称仍会为了兼容被解析器识别,但它们不是当前接入运行时事件系统的路径。

如果需要内置集合之外的事件,请使用 @function_tag(...) 搭配显式的 Minecraft/stdlib dispatcher,不要假设一定存在某个专用装饰器。

下一步

Released under the MIT License.