Learn · frameworks

Cos'è Mixin? Spiegata l'iniezione di bytecode

Mixin è la libreria di iniezione di bytecode che consente ai mod di patchare le classi compilate di Minecraft al momento del caricamento. Ecco come funziona l'iniezione e perché ogni mod moderno ne ha bisogno.

TRtrolPublished 7 min read

Cos'è Mixin in Minecraft?

Mixin è una libreria di iniezione di bytecode che consente a un mod di modificare le classi compilate di Minecraft al momento del caricamento, senza mai toccare il codice sorgente originale. Un mod scrive una piccola classe che dice "inserisci questo codice in questo punto in questo metodo di gioco" e Mixin intreccia quel codice nel bytecode nel momento in cui la JVM carica il target. Fabric lo utilizza come meccanismo di modding principale.

In breve: Minecraft viene distribuito come codice Java compilato. Mixin tratta quelle classi compilate come la superficie su cui costruire e le modifica in memoria prima che il gioco esegua un singolo frame.

Come funziona l'iniezione di bytecode di Mixin?

Mixin opera nel divario tra compilazione ed esecuzione. La classe di gioco è già compilata, ma la JVM non l'ha ancora caricata. È in quel momento che Mixin interviene. Un mod fornisce al loader una classe mixin annotata per puntare a una classe di gioco reale e, quando quella classe di gioco viene caricata, Mixin riscrive il suo bytecode al volo per integrare il codice del mod.

Le annotazioni sono il vero trucco. Non descrivono come appare il file di gioco riga per riga. Descrivono dove vuoi arrivare: all'inizio di un metodo, al ritorno, a una chiamata specifica al suo interno, a una variabile locale. Mixin trova quel punto nel bytecode e vi inserisce le tue istruzioni.

È necessario perché Minecraft non è mai stato progettato per essere esteso. Non esiste una API ufficiale per plugin per la maggior parte di ciò che i mod vogliono modificare. Mixin è la risposta a questo: se il gioco non ti fornisce un gancio, te ne intagli uno nel codice compilato.

Perché i mod utilizzano Mixin invece di modificare direttamente il gioco?

Due motivi sostengono l'intero argomento: compatibilità e sopravvivenza agli aggiornamenti.

Modificare direttamente il codice sorgente del gioco significa dover distribuire una copia modificata completa di Minecraft. Nessun altro può basarsi sulla tua versione, e si rompe non appena il gioco viene aggiornato. Le patch Mixin sono piccole e mirate, il che significa che decine di mod possono modificare lo stesso gioco contemporaneamente senza dover distribuire una copia completa.

ApproccioCoesiste con altre modSopravvive a un aggiornamento del giocoViene distribuito come
Modifica manuale del codice compilatoNo, una sola versione prevaleNo, si rompe con qualsiasi modificaUn jar modificato completo
Iniezione MixinSì, le patch si sovrappongonoSpesso, se il metodo sopravviveUn piccolo numero di classi

Quella seconda colonna è il superpotere silenzioso. Poiché una mixin dice "iniettare qui" invece di "il file è esattamente questo", molte mixin continuano a funzionare tra le versioni senza modifiche. È la differenza tra descrivere una destinazione e memorizzare una mappa.

Come si integra Mixin in Fabric?

Il Fabric si basa su Mixin, punto e basta. Il loader legge la configurazione mixin di ogni mod, raccoglie le classi mixin elencate in tale configurazione e le passa a Mixin affinché vengano applicate durante il caricamento delle classi. Non devi configurare manualmente nessuno di questi elementi; dichiarare i tuoi mixin nella configurazione è l'intera integrazione.

Un mod Fabric tipico è composto principalmente dalle proprie classi normali, più un piccolo set di mixin che intercettano le poche funzioni di gioco che deve effettivamente modificare. La vera logica del mod risiede nel codice regolare. I mixin sono solo il sottile strato che prende il controllo nei momenti giusti.

Quali sono i punti di iniezione Mixin più comuni?

Il tipo di iniezione che scegli determina quanto sia aggressiva la patch e quanto bene si integra con altre mod. Interventi più leggeri sono più sicuri e resistenti agli aggiornamenti. Interventi più pesanti ti offrono maggiore controllo a costo di fragilità.

AnnotazioneCosa faQuando usarla
@InjectEsegue il tuo codice in un punto scelto all'interno di un metodo di destinazioneIl valore predefinito; meno invasivo, più resistente agli aggiornamenti
@RedirectSostituisce una specifica chiamata di metodo all'interno della destinazioneSostituisci una singola chiamata senza riscrivere il metodo
@ModifyArgModifica un argomento passato a una chiamata all'interno della destinazioneModifica un valore in ingresso a una chiamata
@ModifyVariableRiscrive una variabile locale a metà metodoRegola lo stato già calcolato dal metodo
@OverwriteSostituisce un intero metodoUltima risorsa; confligge con qualsiasi altra modifica che lo tocca

@Inject è il cavallo di battaglia perché è preciso e cortese. Interviene in un punto preciso e lascia il resto del metodo intatto, ed è proprio per questo che tende a sopravvivere agli aggiornamenti e raramente entra in conflitto con altre mod. @Overwrite si trova all'estremità opposta: annulla l'intero metodo, quindi qualsiasi altra mod che desideri anche quel metodo viene esclusa. Le buone mixin mantengono la loro impronta piccola di proposito.

Un punto di iniezione pulito è anche il motivo per cui la rimozione di una mod è istantanea. Niente è stato scritto nei tuoi file, quindi rimuovere la mod elimina tutte le modifiche associate.

Perché Mixin è importante per un cliente serio

Questo è il fondamento su cui Terminus è costruito. Un client utility premium sopravvive o fallisce a seconda di quanto pulitamente si integri nel gioco, e Mixin è ciò che lo rende possibile senza spedire una copia malconcia di Minecraft. I punti di iniezione ristretti mantengono il client compatibile con le mod che già utilizzi, e resistono agli aggiornamenti del gioco invece di rompersi al momento del rilascio di una patch. Comprendere Mixin è il modo più rapido per capire perché un client ben costruito si sente come parte del gioco invece di un componente fragile aggiunto in seguito.

FAQ

Prendi Terminus

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