Learn · frameworks

O que é Mixin? Injeção de bytecode explicada

Mixin é a biblioteca de injeção de bytecode que permite que mods corrijam as classes compiladas do Minecraft no momento do carregamento. Veja como a injeção funciona e por que todo mod moderno precisa dela.

TRtrolPublished 7 min read

O que é Mixin no Minecraft?

Mixin é uma biblioteca de injeção de bytecode que permite a um mod corrigir as classes compiladas do Minecraft no momento do carregamento, sem nunca tocar no código-fonte original. Um mod escreve uma pequena classe que diz "insira este código neste ponto neste método do jogo" e o Mixin tece esse código no bytecode no instante em que a JVM carrega o alvo. O Fabric o utiliza como seu mecanismo central de modding.

Em resumo: o Minecraft é distribuído como código Java compilado. O Mixin trata essas classes compiladas como a superfície na qual você constrói e as edita na memória antes que o jogo execute um único frame.

Como funciona a injeção de bytecode do Mixin?

O Mixin funciona na lacuna entre compilar e executar. A classe do jogo já está compilada, mas a JVM ainda não a carregou. É nesse intervalo que o Mixin atua. Um mod entrega ao carregador uma classe mixin anotada para atingir uma classe real do jogo, e quando essa classe do jogo é carregada, o Mixin reescreve seu bytecode em tempo real para incorporar o código do mod.

As anotações são o truque todo. Elas não descrevem como o arquivo do jogo se parece linha por linha. Elas descrevem onde você quer chegar: o topo de um método, o retorno, uma chamada específica dentro dele, uma variável local. O Mixin encontra esse ponto no bytecode e costura suas instruções ao redor dele.

Isto é necessário porque o Minecraft nunca foi construído para ser expandido. Não existe uma API de plugin oficial para a maioria das alterações que os mods querem fazer. Mixin é a resposta para isso: se o jogo não lhe der um ponto de fixação, você o esculpe no código compilado.

Por que os mods usam Mixin em vez de editar o jogo diretamente?

Duas razões sustentam todo o argumento: compatibilidade e sobrevivência às atualizações.

Edite o código-fonte do jogo diretamente e você terá que distribuir uma cópia modificada completa do Minecraft. Ninguém mais pode construir sobre a sua bifurcação, e ela se desfaz assim que o jogo for atualizado. Os patches do Mixin são pequenos e cirúrgicos, o que significa que dezenas de mods podem corrigir o mesmo jogo de uma vez, sem nenhum deles distribuir um clone completo.

AbordagemCoexiste com outros modsSobrevive a uma atualização do jogoÉ distribuído como
Editar o jogo compilado manualmenteNão, uma bifurcação venceNão, quebra em qualquer alteraçãoUm jar modificado completo
Injeção MixinSim, os patches se acumulamFrequentemente, se o método sobreviverUm punhado de pequenas classes

A segunda coluna é o superpoder silencioso. Porque um mixin diz "injeção aqui" em vez de "o arquivo é exatamente este", muitos mixins continuam funcionando em diferentes versões sem nenhuma alteração. É a diferença entre descrever um destino e memorizar um mapa.

Como o Mixin se encaixa no Fabric?

O Fabric é construído sobre o Mixin, ponto final. O carregador lê a configuração de mixin de cada mod, coleta as classes de mixin que a configuração lista e as entrega ao Mixin para que sejam aplicadas durante o carregamento das classes. Você não configura nada disso manualmente; declarar seus mixins na configuração é toda a integração.

Um mod Fabric típico é composto principalmente por suas próprias classes normais, mais um pequeno conjunto de mixins que interceptam os poucos métodos do jogo que ele realmente precisa alterar. A lógica real do mod reside em código regular. Os mixins são apenas a camada fina que assume o controle nos momentos certos.

Quais são os pontos de injeção de Mixins mais comuns?

O tipo de injeção que você escolher determina o quão agressivo o patch é e o quão bem ele se integra com outros mods. Toques mais leves são mais seguros e à prova de atualizações. Injeções mais pesadas oferecem mais controle, mas à custa da fragilidade.

AnotaçãoO que fazQuando usar
@InjectExecuta seu código em um ponto escolhido dentro de um método de destinoO padrão; menos invasivo, mais à prova de atualizações
@RedirectSubstitui uma chamada de método específica dentro do destinoTroca uma única chamada sem reescrever o método
@ModifyArgAltera um argumento passado para uma chamada dentro do destinoAjusta um valor que entra em uma chamada
@ModifyVariableReescreve uma variável local no meio do métodoAjusta o estado que o método já computou
@OverwriteSubstitui um método inteiroÚltimo recurso; entra em conflito com qualquer outra modificação que o toque

@Inject é o cavalo de batalha porque é preciso e educado. Ele entra em um ponto específico e deixa o resto do método intacto, o que é exatamente o porquê de ele tender a sobreviver a atualizações e raramente entrar em conflito com outros mods. @Overwrite está no extremo oposto: ele destrói o método inteiro, então qualquer outro mod que também queira esse método perde. Bons mixins mantêm sua pegada pequena intencionalmente.

Um ponto de injeção limpo também é o motivo de a remoção de um mod ser instantânea. Nada foi gravado nos seus arquivos, então a remoção do mod remove todas as alterações junto com ele.

Por que o Mixin é importante para um cliente sério

Este é o alicerce sobre o qual o Terminus é construído. Um cliente utilitário premium vive ou morre dependendo de como ele se integra de forma limpa ao jogo, e o Mixin é o que torna isso possível sem enviar uma cópia desfigurada do Minecraft. Pontos de injeção estreitos mantêm o cliente compatível com os mods que você já executa, e eles resistem quando o jogo é atualizado, em vez de quebrar no dia do lançamento de uma atualização. Entender o Mixin é a maneira mais rápida de ver por que um cliente bem construído parece parte do jogo, em vez de um acessório frágil.

Perguntas Frequentes

Obtenha Terminus

Built on clean Mixin hooks, not a hacked-up jar.