Progetto
Mod del motore
Un livello avanzato ed eccezionale: una mod che sostituisce una parte del gioco stesso. Quasi nessuna mod ne ha bisogno.
Ti serve?
Quasi certamente no. Le mod scritte in CraftScript o Kotlin con l'API di Crafting coprono blocchi, oggetti, creature, mondi, interfaccia ed eventi, e continuano a funzionare quando Minecraft si aggiorna. Una mod del motore serve solo a sostituire una parte del gioco stesso, come un renderer dei chunk più veloce o un nuovo motore di illuminazione. Se la tua idea rientra nell'API normale, usala.
Cosa offre e quanto costa
Il codice della mod può usare le classi del gioco stesso e modificarle con i mixin. Il prezzo: è fatta per una versione esatta di Minecraft, funziona solo su quella e il suo autore deve aggiornarla a ogni versione del gioco. Nulla di ciò che usa ha una promessa di compatibilità.
Dichiararla
Aggiungi una sezione engine a crafting.mod.json, con le configurazioni dei mixin:
{
"id": "brandengine",
"name": "Brand Engine",
"version": "1.0.0",
"game": "26.3",
"entrypoints": ["com.example.engine.BrandEngine"],
"engine": { "mixins": ["brandengine.mixins.json"] }
}game deve essere la versione esatta, ad esempio 26.3, non un intervallo. Su qualunque altra versione la mod non si carica e il gioco ne spiega il motivo.
Parti esclusive
Alcune parti del gioco ammettono una sola sostituzione. Una mod le richiede con slots:
{ "engine": { "slots": ["chunk_renderer"] } }| Slot | La parte che sostituisce |
|---|---|
chunk_renderer |
il renderer dei chunk |
lighting |
il motore di illuminazione |
shaders |
la pipeline degli shader |
Una sola mod può sostituire ciascuna parte. Se due ci provano, la seconda non si carica e la schermata delle mod dice quale mod la possiede. Una mod che prende shaders disattiva i pacchetti di shader.
Nel codice
Le funzioni del motore richiedono un consenso esplicito, così nessuno le usa per caso:
@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) restituisce l'oggetto proprio del gioco dietro un giocatore, un mondo, un'entità o un server di Crafting.
Un mixin
Un mixin si scrive in Java e modifica una classe del gioco:
@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");
}
}La sua configurazione, brandengine.mixins.json, elenca i mixin:
{ "required": true, "package": "com.example.engine.mixin", "compatibilityLevel": "JAVA_25",
"mixins": ["ServerBrandMixin"], "injectors": { "defaultRequire": 1 } }Compilare
Compila contro il jar del gioco e la libreria Mixin, entrambi come compile-only. Java e Kotlin puntano alla versione 25.
Cosa vedono i giocatori
La schermata delle mod segnala le mod del motore: «usa direttamente il gioco, fatta solo per Minecraft 26.3: un aggiornamento del gioco può romperla», e mostra quale parte sostituisce ciascuna.