Projekt

Engine-Mods

Eine fortgeschrittene Ausnahmestufe: ein Mod, der einen Teil des Spiels selbst ersetzt. Fast kein Mod braucht sie.

Brauchst du das?

Mit ziemlicher Sicherheit nicht. Mods in CraftScript oder Kotlin auf der Crafting-API decken Blöcke, Items, Kreaturen, Welten, Oberfläche und Ereignisse ab und funktionieren weiter, wenn Minecraft aktualisiert wird. Ein Engine-Mod dient nur dazu, einen Teil des Spiels selbst zu ersetzen, etwa einen schnelleren Chunk-Renderer oder eine neue Beleuchtungs-Engine. Passt deine Idee in die normale API, nutze sie.

Was es bietet und was es kostet

Der Code des Mods kann die eigenen Klassen des Spiels verwenden und sie mit Mixins patchen. Der Preis: Er ist für genau eine Minecraft-Version gemacht, läuft nur dort, und sein Autor muss ihn für jede Spielversion aktualisieren. Für nichts, was er benutzt, gibt es ein Kompatibilitätsversprechen.

Deklarieren

Füge in crafting.mod.json einen Abschnitt engine mit den Mixin-Konfigurationen hinzu:

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 muss die exakte Version sein, zum Beispiel 26.3, kein Bereich. Auf jeder anderen Version wird der Mod nicht geladen, und das Spiel nennt den Grund.

Exklusive Teile

Manche Teile des Spiels können nur einen Ersatz haben. Ein Mod beansprucht sie mit slots:

crafting.mod.jsonJSON
{ "engine": { "slots": ["chunk_renderer"] } }
Slot Der ersetzte Teil
chunk_renderer der Chunk-Renderer
lighting die Beleuchtungs-Engine
shaders die Shader-Pipeline

Jeden Teil kann nur ein Mod ersetzen. Versuchen es zwei, wird der zweite nicht geladen, und der Mods-Bildschirm zeigt, welcher Mod den Teil hat. Ein Mod, der shaders belegt, schaltet Shaderpakete ab.

Im Code

Engine-Funktionen erfordern ein ausdrückliches Opt-in, damit niemand sie versehentlich nutzt:

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) liefert das eigene Objekt des Spiels hinter einem Crafting-Spieler, einer Welt, einer Entität oder einem Server.

Ein Mixin

Ein Mixin wird in Java geschrieben und patcht eine Klasse des Spiels:

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");
    }
}

Seine Konfiguration brandengine.mixins.json listet die Mixins auf:

brandengine.mixins.jsonJSON
{ "required": true, "package": "com.example.engine.mixin", "compatibilityLevel": "JAVA_25",
  "mixins": ["ServerBrandMixin"], "injectors": { "defaultRequire": 1 } }

Bauen

Kompiliere gegen die Spiel-JAR und die Mixin-Bibliothek, beide als compile-only. Java und Kotlin zielen auf Version 25.

Was Spieler sehen

Der Mods-Bildschirm markiert Engine-Mods: „nutzt das Spiel direkt, nur für Minecraft 26.3 gemacht: ein Spiel-Update kann ihn kaputtmachen“, und zeigt, welchen Teil jeder ersetzt.