Vue d’ensemble

De quoi s’agit-il ?

La version d’origine de Joban Client Mod (JCM) permet aux packs de ressources d’écrire des scripts d’affichage dynamique en JavaScript. La branche Yanyang y ajoute les scripts natifs C++ : le script est compilé en bibliothèque partagée native (.dll / .so / .dylib), que le mod charge en jeu et pilote frame par frame.

Scripts C++ et scripts JS peuvent être mélangés au sein d’une même entrée de déclaration et rendus simultanément. Le mod détermine automatiquement la langue d’après les caractéristiques du fichier — .js est du JavaScript, tout le reste est analysé comme un module C++. Chaque côté capture ses instructions de dessin et les rejoue indépendamment, sans interférence.

🧩

Le même modèle de script

Cycle de vie create / render / dispose et état persistant par instance, rigoureusement identiques à JS ; les enveloppes d’instantané alignent le Wrapper JS champ par champ.

⚡

Transport zéro JNI

Java ↔ C++ communiquent par le plan de scrutation en mémoire partagée (tout JDK ≥ 16) ou par Panama FFM (JDK 22+), sans jamais passer par JNI ; une seule traversée vers l’hôte par frame et par instance.

🖥️

Ponts natifs, 8 plateformes

windows-x64 / windows-arm64 / linux-x64 / linux-arm64 / android-arm64 / macos-x64 / macos-arm64 / ios-arm64 sont tous intégrés au jar et appariés automatiquement selon l’architecture du système.

🛡️

Isolation des plantages

Un plantage de script désactive uniquement le module fautif et laisse une ligne de journal ; le processus du jeu n’est pas affecté. Les exceptions C++ levées dans le module sont elles aussi interceptées par le garde-fou anti-plantage.

Le parcours d’une frame

Pack de ressourcesdéclaration dans mtr_custom_resources.json
bibliothèques dans natives/<platform>/
→
Hôte JCM (Java)découverte des modules · allocation des blocs d’état
sérialisation d’un instantané compact à chaque frame
Couche de transport (zéro JNI)plan de scrutation en mémoire partagée · plan Panama FFM
Votre module C++mtrCreate → mtrRender → mtrDispose
lecture de l’instantané · écriture des enregistrements de dessin
→
Rejeu du dessintexte / textures / modèles / sons
le même chemin de rendu que les scripts JS
Les données circulent vers la droite : l’instantané (structure POD + pool de chaînes) entre dans le module ; le module écrit un flux plat d’enregistrements de dessin dans les cinq zones de sortie, que l’hôte rejoue par le même chemin de code que pour JS. Dessin, polices et pixels restent intégralement côté natif ; seul le marshalling de l’instantané demeure l’unique traversée Java imposée à chaque frame.

Un script PIDS en quinze lignes

examples/pids_arrivals.cpp — affichage des arrivées
#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)

Pas de JNI, pas de réflexion, pas de boxing appel par appel — pids.rows() ou arrivals().at(i).destination() sont de simples lectures mémoire sur l’instantané compact.

Quand choisir C++

ScénarioRecommandation
LCD haute résolution / écran à matrice de points, avec d’importantes surfaces de pixels redessinées à chaque frameC++ rastériseur logiciel Gfx2D + téléversement des rectangles modifiés, les pixels ne traversent pas la JVM
Traitement de chaînes complexe / tri à chaque frame / calculs mathématiquesC++ calcul natif sans allocation
Besoin d’appeler de nombreuses API Java (réseau, fichiers, gestionnaire de sons…)Au choix les deux côtés accèdent via Api au même ensemble d’objets publics
Logique d’affichage ponctuelle et simpleJS aucune chaîne d’outils de compilation requise, itérations plus rapides

Compatibilité

ÉlémentExigence
Minecraft1.17.1 – 1.20.4 (Fabric / Forge)
DépendancesMinecraft Transit Railway 4.0.5+ (requis) ; la variante Fabric requiert en outre Fabric API
Java16 et plus ; en 22+, le plan FFM entièrement sans JNI s’active automatiquement
ABIl’hôte accepte les modules ABI 6–13 ; le SDK actuel produit des modules ABI 13
Chaîne d’outilsC++17 ; MSVC / GCC / Clang ; CMake ≥ 3.16 (recommandé)

Sommaire de la documentation