Proyecto

Mods de motor

Un nivel avanzado y excepcional: un mod que reemplaza una parte del propio juego. Casi ningún mod lo necesita.

¿Lo necesitas?

Casi seguro que no. Los mods escritos con CraftScript o Kotlin sobre la API de Crafting cubren bloques, ítems, criaturas, mundos, interfaz y eventos, y siguen funcionando cuando Minecraft se actualiza. Un mod de motor solo sirve para reemplazar una parte del propio juego, como un renderizador de chunks más rápido o un nuevo motor de iluminación. Si tu idea cabe en la API normal, usa la API normal.

Qué da y qué cuesta

El código del mod puede usar las clases del propio juego y modificarlas con mixins. El precio: está hecho para una versión exacta de Minecraft, solo funciona en ella y su autor debe actualizarlo con cada versión del juego. Nada de lo que usa tiene promesa de compatibilidad.

Declararlo

Añade una sección engine a crafting.mod.json con las configuraciones de mixins:

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 debe ser la versión exacta, por ejemplo 26.3, no un rango. En cualquier otra versión el mod no se carga y el juego dice por qué.

Partes exclusivas

Algunas partes del juego solo admiten un reemplazo. El mod las reclama con slots:

crafting.mod.jsonJSON
{ "engine": { "slots": ["chunk_renderer"] } }
Slot La parte que reemplaza
chunk_renderer el renderizador de chunks
lighting el motor de iluminación
shaders la tubería de shaders

Solo un mod puede reemplazar cada parte. Si dos lo intentan, el segundo no se carga y la pantalla de Mods dice qué mod la tiene. Un mod que toma shaders desactiva los shader packs.

En el código

Las funciones de motor requieren una aceptación explícita, para que nadie las use por accidente:

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) da el objeto propio del juego que hay detrás de un jugador, mundo, entidad o servidor de Crafting.

Un mixin

Un mixin se escribe en Java y modifica una clase del juego:

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

Su configuración, brandengine.mixins.json, lista los mixins:

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

Compilar

Compila contra el jar del juego y la biblioteca Mixin, ambos como compile-only. Java y Kotlin apuntan a la versión 25.

Lo que ve el jugador

La pantalla de Mods marca los mods de motor: «usa el juego directamente, hecho solo para Minecraft 26.3: una actualización del juego puede romperlo», y muestra qué parte reemplaza cada uno.