Scripts natifs C++
Offre aux auteurs de packs de ressources de Minecraft Transit Railway 4 la possibilité d’écrire en C++ les cinq catégories de scripts — véhicule, PIDS, ascenseur, eyecandy (décoration), portes palières — avec le même cycle de vie et la même surface d’API que les scripts JavaScript, et zéro traversée de la JVM sur le chemin chaud. La documentation complète des scripts JavaScript (le système de script de JCM d’origine) se trouve dans la section Scripts JavaScript ci-dessous.
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
bibliothèques dans natives/<platform>/
sérialisation d’un instantané compact à chaque frame
lecture de l’instantané · écriture des enregistrements de dessin
le même chemin de rendu que les scripts JS
Un script PIDS en quinze lignes
#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énario | Recommandation |
|---|---|
| LCD haute résolution / écran à matrice de points, avec d’importantes surfaces de pixels redessinées à chaque frame | C++ 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ématiques | C++ 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 simple | JS aucune chaîne d’outils de compilation requise, itérations plus rapides |
Compatibilité
| Élément | Exigence |
|---|---|
| Minecraft | 1.17.1 – 1.20.4 (Fabric / Forge) |
| Dépendances | Minecraft Transit Railway 4.0.5+ (requis) ; la variante Fabric requiert en outre Fabric API |
| Java | 16 et plus ; en 22+, le plan FFM entièrement sans JNI s’active automatiquement |
| ABI | l’hôte accepte les modules ABI 6–13 ; le SDK actuel produit des modules ABI 13 |
| Chaîne d’outils | C++17 ; MSVC / GCC / Clang ; CMake ≥ 3.16 (recommandé) |