Projeto

Mods de motor

Um nível avançado e excepcional: um mod que substitui uma parte do próprio jogo. Quase nenhum mod precisa dele.

Você precisa disso?

Quase certamente não. Mods escritos em CraftScript ou Kotlin sobre a API do Crafting cobrem blocos, itens, criaturas, mundos, interface e eventos, e continuam funcionando quando o Minecraft atualiza. Um mod de motor serve apenas para substituir uma parte do próprio jogo, como um renderizador de chunks mais rápido ou um novo motor de iluminação. Se a sua ideia cabe na API normal, use-a.

O que oferece e o que custa

O código do mod pode usar as classes do próprio jogo e modificá-las com mixins. O preço: ele é feito para uma versão exata do Minecraft, só roda nela e o autor precisa atualizá-lo a cada versão do jogo. Nada do que ele usa tem promessa de compatibilidade.

Declarando

Adicione uma seção engine ao crafting.mod.json, com as configurações 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 deve ser a versão exata, por exemplo 26.3, e não um intervalo. Em qualquer outra versão o mod não carrega, e o jogo diz o motivo.

Partes exclusivas

Algumas partes do jogo só aceitam uma substituição. O mod as reivindica com slots:

crafting.mod.jsonJSON
{ "engine": { "slots": ["chunk_renderer"] } }
Slot A parte que substitui
chunk_renderer o renderizador de chunks
lighting o motor de iluminação
shaders o pipeline de shaders

Só um mod pode substituir cada parte. Se dois tentarem, o segundo não carrega e a tela de mods diz qual mod a tem. Um mod que ocupa shaders desativa os pacotes de shaders.

No código

Os recursos de motor exigem uma adesão explícita, para que ninguém os use por acidente:

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) entrega o objeto próprio do jogo por trás de um jogador, mundo, entidade ou servidor do Crafting.

Um mixin

Um mixin é escrito em Java e modifica uma classe do jogo:

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

Sua configuração, brandengine.mixins.json, lista os mixins:

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

Compilando

Compile contra o jar do jogo e a biblioteca Mixin, ambos como compile-only. Java e Kotlin miram a versão 25.

O que os jogadores veem

A tela de mods marca os mods de motor: «usa o jogo diretamente, feito apenas para o Minecraft 26.3: uma atualização do jogo pode quebrá-lo», e mostra qual parte cada um substitui.