概覽

這是甚麼

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(推薦)

文件目錄