Projet
Mods de moteur
Un niveau avancé et exceptionnel : un mod qui remplace une partie du jeu lui-même. Presque aucun mod n'en a besoin.
En avez-vous besoin ?
Presque certainement non. Les mods écrits en CraftScript ou en Kotlin sur l'API de Crafting couvrent les blocs, objets, créatures, mondes, interface et événements, et continuent de fonctionner quand Minecraft se met à jour. Un mod de moteur ne sert qu'à remplacer une partie du jeu lui-même, comme un moteur de rendu des chunks plus rapide ou un nouveau moteur d'éclairage. Si votre idée tient dans l'API normale, utilisez-la.
Ce qu'il apporte et ce qu'il coûte
Le code du mod peut utiliser les classes du jeu lui-même et les modifier avec des mixins. Le prix : il est conçu pour une version exacte de Minecraft, ne fonctionne que sur elle, et son auteur doit le mettre à jour à chaque version du jeu. Rien de ce qu'il utilise ne bénéficie d'une promesse de compatibilité.
Le déclarer
Ajoutez une section engine à crafting.mod.json, avec les configurations de mixins :
{
"id": "brandengine",
"name": "Brand Engine",
"version": "1.0.0",
"game": "26.3",
"entrypoints": ["com.example.engine.BrandEngine"],
"engine": { "mixins": ["brandengine.mixins.json"] }
}game doit être la version exacte, par exemple 26.3, pas une plage. Sur toute autre version, le mod ne se charge pas et le jeu en explique la raison.
Parties exclusives
Certaines parties du jeu n'acceptent qu'un seul remplacement. Un mod les réclame avec slots :
{ "engine": { "slots": ["chunk_renderer"] } }| Slot | La partie remplacée |
|---|---|
chunk_renderer |
le moteur de rendu des chunks |
lighting |
le moteur d'éclairage |
shaders |
le pipeline de shaders |
Un seul mod peut remplacer chaque partie. Si deux essaient, le second ne se charge pas et l'écran des mods indique quel mod l'occupe. Un mod qui prend shaders désactive les packs de shaders.
Dans le code
Les fonctions de moteur demandent une acceptation explicite, pour que personne ne les utilise par accident :
@OptIn(CraftingInternal::class)
class BrandEngine : CraftingMod {
override fun onLoad(ctx: ModContext) {
Crafting.events.on<ServerStartedEvent> { e ->
val server = Engine.handle(e.server) as MinecraftServer
ctx.logger.info("Server brand: ${server.serverModName}")
}
}
}Engine.handle(view) donne l'objet propre du jeu derrière un joueur, un monde, une entité ou un serveur de Crafting.
Un mixin
Un mixin s'écrit en Java et modifie une classe du jeu :
@Mixin(MinecraftServer.class)
public abstract class ServerBrandMixin {
@Inject(method = "getServerModName", at = @At("RETURN"), cancellable = true)
private void brand(CallbackInfoReturnable<String> cir) {
cir.setReturnValue(cir.getReturnValue() + "+brandengine");
}
}Sa configuration, brandengine.mixins.json, liste les mixins :
{ "required": true, "package": "com.example.engine.mixin", "compatibilityLevel": "JAVA_25",
"mixins": ["ServerBrandMixin"], "injectors": { "defaultRequire": 1 } }Compiler
Compilez contre le jar du jeu et la bibliothèque Mixin, tous deux en compile-only. Java et Kotlin ciblent la version 25.
Ce que voient les joueurs
L'écran des mods signale les mods de moteur : « utilise directement le jeu, conçu pour Minecraft 26.3 uniquement : une mise à jour du jeu peut le casser », et indique quelle partie chacun remplace.