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.
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.
| Abordagem | Coexiste com outros mods | Sobrevive a uma atualização do jogo | É distribuído como |
|---|---|---|---|
| Editar o jogo compilado manualmente | Não, uma bifurcação vence | Não, quebra em qualquer alteração | Um jar modificado completo |
| Injeção Mixin | Sim, os patches se acumulam | Frequentemente, se o método sobreviver | Um 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ção | O que faz | Quando usar |
|---|---|---|
@Inject | Executa seu código em um ponto escolhido dentro de um método de destino | O padrão; menos invasivo, mais à prova de atualizações |
@Redirect | Substitui uma chamada de método específica dentro do destino | Troca uma única chamada sem reescrever o método |
@ModifyArg | Altera um argumento passado para uma chamada dentro do destino | Ajusta um valor que entra em uma chamada |
@ModifyVariable | Reescreve uma variável local no meio do método | Ajusta o estado que o método já computou |
@Overwrite | Substitui 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
Não. Mixin é uma biblioteca com a qual os mods são construídos, não algo que você baixa separadamente. Um carregador como o Fabric inclui o Mixin internamente e aplica os mixins que cada mod declara quando o jogo é carregado.
Não. Toda a aplicação de patches ocorre na memória durante o carregamento das classes. O arquivo jar no disco nunca é alterado, razão pela qual a remoção de um mod elimina completamente seu comportamento, sem deixar rastros.
Quando ambos aplicam o mesmo método de maneiras conflitantes, um pode sobrescrever o outro. O culpado usual é @Overwrite. Mixins que usam pontos de injeção mais específicos como @Inject coexistem de forma muito mais confiável.
Não. Mixin é um framework Java bytecode de uso geral. Modding do Minecraft é apenas onde ele é mais utilizado, e a padronização do Fabric nele o tornou a ferramenta padrão para o ecossistema.
Obtenha Terminus
Built on clean Mixin hooks, not a hacked-up jar.