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:

crafting.mod.jsonJSON
{
  "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:

crafting.mod.jsonJSON
{ "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:

BrandEngine.ktKotlin
@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:

ServerBrandMixin.javaJava
@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:

brandengine.mixins.jsonJSON
{ "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.