事件

事件是节点图的执行入口:游戏里发生某件事,事件节点被触发,随后那条执行流上的节点依次运行。

监听事件

在 pub fn 上加 #[event_listener]。函数有且只有一个参数,就是事件本身:
#[event_listener]
pub fn on_tab_selected(event: TabSelectedEvent) {
    log(event.guid);
    event.entity.delete();
}
#[event_listener] 宏会自动给函数加上 #[unsafe(no_mangle)](所以它是个导出入口),并把事件节点和对应的调用插进主图。函数名随便取,事件类型由参数的类型决定 —— 类型上带着 #[event(N)] 属性,编译器从这里读出该触发哪个事件。一个事件可以有多个监听器,函数名不能重复。如果你想自己加一个事件类型(往 lib/src/event/ 里加):#[event(N)] 的 N 是事件节点的 ID,struct 的字段顺序必须和游戏端事件节点的出参顺序一致,因为编译器就是按顺序把字段类型拼成节点的出参的。struct 和字段都要是 pub。写法见加一个原生调用。

内置事件

事件类型按所在场景分三个模块。字段直接 event.xxx 访问。

character(角色)

use rust2genshin_lib::event::character::{CharacterDownEvent, CharacterReviveEvent};

entity(实体)

use rust2genshin_lib::event::entity::*;

player(玩家)

use rust2genshin_lib::event::player::{PlayerAllDownEvent, PlayerAbnormalReviveEvent, PlayerRevivedEvent};

还没做的

自定义事件、事件的参数传递规则(哪些类型能当事件参数)都还没实现 —— 目前只能用上表这些内置事件。