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