总览
RTE 内置两套 JavaScript 运行时,让资源包里的脚本驱动列车显示、动态贴图、声音与粒子。本手册按代码实况编写。
这套脚本能做什么
资源包可以为车辆挂载 JS 脚本,在客户端每帧运行,用来:
- 读取列车状态 —— 速度、门、线路、下一站、到站距离
- 把内容画到动态贴图上 —— 车内 LCD、线路图、到站显示
- 提交自绘模型的绘制调用
- 播放声音、发射粒子
- 接收玩家右键 —— 按钮、驾驶台、手动开关门
两套引擎
| 引擎 | 说明 |
|---|---|
rhino | Mozilla Rhino,MTR 3.x 时代资源包使用的引擎。兼容性最好。 |
graal | GraalVM JavaScript,语法更新(支持 ES6+),性能通常更好。 |
auto | 由 RTE 决定。 |
默认是 rhino。优先级为
按车辆/资源包覆盖 > 客户端配置 scriptEngine > 资源包自带的 engine 字段。
客户端配置项 scriptEngineOverrides 可为单个车辆或一批车辆单独指定引擎,
键支持 * 后缀通配,多个模式命中时取最长前缀:
{
"scriptEngine": "rhino",
"scriptEngineOverrides": {
"mtr_custom_train_njmtr_s4": "graal",
"mtr_custom_train_wh_*": "graal"
}
}
重脚本(TCMS、复杂 LCD)单独走 graal、其余留在 rhino,
不必全局二选一。
Java 22 及以上无法使用 GraalJS。
内置的 GraalJS 依赖一个在 JDK 22 中被移除的内部方法,RTE 会在这类 JVM 上
直接改用 Rhino,不再尝试 Graal。Rhino 在 JDK 17 / 21 / 24 上均可用。
Rhino 与 GraalJS 的 Java 互操作语义不完全一致。
为 Rhino 写的脚本在 GraalJS 下可能需要调整,反之亦然。
若脚本原本面向 MTR 3.x,先用
rhino。一个最小例子
function create(ctx, state, train) {
state.tick = 0;
}
function render(ctx, state, train) {
state.tick++;
if (state.tick % 60 === 0) {
Resources.print("速度 " + train.speedKmh() + " km/h");
}
}
四个入口函数 create / render / dispose / use。
详见生命周期与线程与交互与 use 回调。
本手册的编写方式
所有 API 签名、函数名、配置项名均直接取自源码, 不是从旧版文档抄的。若你发现与实际不符,请开 Issue —— 那是文档的 bug。
本手册对应 RTE 1.0.0-beta.2。