总览

RTE 内置两套 JavaScript 运行时,让资源包里的脚本驱动列车显示、动态贴图、声音与粒子。本手册按代码实况编写。

这套脚本能做什么

资源包可以为车辆挂载 JS 脚本,在客户端每帧运行,用来:

两套引擎

引擎说明
rhinoMozilla Rhino,MTR 3.x 时代资源包使用的引擎。兼容性最好。
graalGraalVM 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