C++ 原生脚本
为 Minecraft Transit Railway 4 的资源包作者提供以 C++ 编写车辆、PIDS、电梯、装饰、屏蔽门五类脚本的能力——与 JavaScript 脚本同生命周期、同 API 面,热路径零 JVM 穿越。JavaScript 脚本(原版 JCM 的脚本体系)的完整开发文档见下方「JavaScript 脚本」一节。
这是什么
Joban Client Mod(JCM)原版允许资源包用 JavaScript 编写动态显示脚本。Yanyang 分支在此基础上加入 C++ 原生脚本:把脚本编译为本机共享库(.dll / .so / .dylib),由模组在游戏内加载并逐帧驱动。
C++ 脚本与 JS 脚本可以在同一个声明条目里混用、同时渲染。模组按文件特征自动判定语言——.js 是 JavaScript,其余按 C++ 模块解析。两侧各自捕获绘制指令、各自回放,互不干扰。
同款脚本模型
create / render / dispose 生命周期与逐实例持久状态,和 JS 完全一致;快照包装器逐字段对齐 JS Wrapper。
零 JNI 传输
Java ↔ C++ 经共享内存轮询平面(任意 JDK ≥ 16)或 Panama FFM(JDK 22+)通信,全程不经 JNI;每帧每实例仅一次宿主穿越。
8 平台原生桥
windows-x64 / windows-arm64 / linux-x64 / linux-arm64 / android-arm64 / macos-x64 / macos-arm64 / ios-arm64 全部内置于 jar,按系统架构自动匹配。
崩溃隔离
脚本崩溃只禁用出错模块本身并留下一行日志,游戏进程不受影响;模块内的 C++ 异常同样被防护拦截。
一帧的旅程
natives/<platform>/ 库文件
每帧序列化紧凑快照
读快照 · 写绘制记录
与 JS 脚本同一渲染路径
十五行的 PIDS 脚本
#include <mtr/script.hpp>
struct ArrivalState {};
struct ArrivalDisplay : mtr::PidsScript<ArrivalState> {
static constexpr auto ID = "example:arrivals";
void render(mtr::PidsContext& ctx, ArrivalState&, const mtr::Pids& pids) override {
for (int row = 0; row < pids.rows(); row++) {
if (pids.is_row_hidden(row)) continue;
std::string text = pids.get_custom_message(row).str();
if (text.empty() && row < pids.arrivals().size())
text = pids.arrivals().at(row).destination().str();
if (!text.empty())
mtr::Text::create().text(text.c_str())
.pos(2, row * 10.0 + 2).size(pids.width() - 4, 9).draw(ctx);
}
}
};
MTR_REGISTER_PIDS_SCRIPT(ArrivalDisplay)
没有 JNI、没有反射、没有逐调用的装箱——pids.rows()、arrivals().at(i).destination() 都是紧凑快照上的普通内存读取。
什么时候选 C++
| 场景 | 建议 |
|---|---|
| 高分辨率 LCD / 点阵屏,每帧重画大量像素 | C++ Gfx2D 软件光栅 + 脏矩形上传,像素不跨 JVM |
| 复杂字符串处理 / 逐帧排序 / 数学计算 | C++ 原生计算零分配 |
| 需要调用大量 Java API(网络、文件、声音管理器) | 皆可 两侧都能经 Api 访问同一批公开对象 |
| 简单的一次性显示逻辑 | JS 无需编译工具链,迭代更快 |
兼容性
| 项目 | 要求 |
|---|---|
| Minecraft | 1.17.1 – 1.20.4(Fabric / Forge) |
| 前置 | Minecraft Transit Railway 4.0.5+(必需);Fabric 版另需 Fabric API |
| Java | 16 及以上;22+ 自动启用全程零 JNI 的 FFM 平面 |
| ABI | 宿主接受 ABI 6–13 模块;当前 SDK 编译产出 ABI 13 |
| 工具链 | C++17;MSVC / GCC / Clang;CMake ≥ 3.16(推荐) |