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:
{
"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:
{ "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:
@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:
@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:
{ "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.