概览

这是什么

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++ 异常同样被防护拦截。

一帧的旅程

资源包mtr_custom_resources.json 声明
natives/<platform>/ 库文件
→
JCM 宿主(Java)发现模块 · 分配状态块
每帧序列化紧凑快照
传输层(零 JNI)共享内存轮询平面 · Panama FFM 平面
你的 C++ 模块mtrCreate → mtrRender → mtrDispose
读快照 · 写绘制记录
→
回放绘制文字 / 纹理 / 模型 / 声音
与 JS 脚本同一渲染路径
数据向右流动:快照(POD 结构 + 字符串池)进入模块;模块把扁平的绘制记录流写进五个输出内存区(arena),宿主按与 JS 相同的代码路径回放。绘制、字体、像素全部留在原生侧,只有快照搬运是每帧强制的唯一 Java 穿越。

十五行的 PIDS 脚本

examples/pids_arrivals.cpp — 到站显示
#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 无需编译工具链,迭代更快

兼容性

项目要求
Minecraft1.17.1 – 1.20.4(Fabric / Forge)
前置Minecraft Transit Railway 4.0.5+(必需);Fabric 版另需 Fabric API
Java16 及以上;22+ 自动启用全程零 JNI 的 FFM 平面
ABI宿主接受 ABI 6–13 模块;当前 SDK 编译产出 ABI 13
工具链C++17;MSVC / GCC / Clang;CMake ≥ 3.16(推荐)

文档目录