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