Learn · frameworks

Czym jest Mixin? Wyjaśnienie wstrzykiwania kodu bajtowego

Mixin to biblioteka wstrzykiwania kodu bajtowego, która umożliwia modyfikacjom poprawianie skompilowanych klas Minecrafta podczas ładowania. Oto jak działa wstrzykiwanie i dlaczego każdy nowoczesny mod go potrzebuje.

TRtrolPublished 6 min read

Co to jest Mixin w Minecrafcie?

Mixin to biblioteka do wstrzykiwania kodu bajtowego, która umożliwia modowi poprawianie skompilowanych klas Minecrafta podczas ładowania, bez dotykania oryginalnego kodu źródłowego. Mod pisze małą klasę, która mówi „wstaw ten kod w tym miejscu w tej metodzie gry”, a Mixin wplata ten kod w kod bajtowy w momencie, gdy JVM ładuje docelową klasę. Fabric wykorzystuje go jako podstawowy mechanizm modyfikacji.

Krótko mówiąc: Minecraft jest dostarczany jako skompilowany kod Java. Mixin traktuje te skompilowane klasy jako powierzchnię, na której budujesz, i edytuje je w pamięci zanim gra uruchomi choćby pojedynczy kadr.

Jak działa wstrzykiwanie kodu bajtowego przez Mixin?

Mixin działa w przerwie między kompilacją a wykonaniem. Klasa gry jest już skompilowana, ale JVM jeszcze jej nie załadowało. To jest okno czasowe, którego używa Mixin. Mod przekazuje ładowaczowi klasę mixin, która jest oznaczona, aby celować w rzeczywistą klasę gry, a gdy ta klasa gry zostanie załadowana, Mixin na bieżąco przepisuje jej kod bajtowy, aby włączyć kod modu.

Oznaczenia to cały trik. Nie opisują, jak wygląda plik gry linia po linii. Opisują gdzie chcesz wylądować: na początku metody, na powrocie, na konkretnym wywołaniu wewnątrz niej, na zmiennej lokalnej. Mixin znajduje to miejsce w kodzie bajtowym i wplata Twoje instrukcje wokół niego.

To jest konieczne, ponieważ Minecraft nigdy nie został zaprojektowany do rozbudowy. Nie ma oficjalnego API wtyczek dla większości zmian, które chcą wprowadzać mody. Mixin jest odpowiedzią na to: jeśli gra nie poda Ci haczyka, wyrzeźbisz go sobie w skompilowanym kodzie.

Dlaczego mody używają Mixin zamiast edytować grę bezpośrednio?

Dwa powody stanowią całą argumentację: kompatybilność i przetrwanie aktualizacji.

Edytuj kod źródłowy gry bezpośrednio i musisz dystrybuować pełną zmodyfikowaną kopię Minecrafta. Nikt inny nie może budować na Twoim forku, a on rozpada się, gdy gra zostanie zaktualizowana. Patch Mixin jest mały i precyzyjny, co oznacza, że dziesiątki modów mogą jednocześnie poprawiać tę samą grę, nie dystrybuując żadnej z nich pełnej kopii.

PodejścieWspółistnieje z innymi modamiPrzetrwa aktualizację gryDostarczany jako
Ręczna edycja skompilowanej gryNie, wygrywa jeden forkNie, psuje się przy każdej zmianiePełny zmodyfikowany plik jar
Wstrzykiwanie MixinTak, poprawki się nakładająCzęsto, jeśli metoda przetrwaKilka małych klas

Ta druga kolumna to cicha supermoc. Ponieważ mixin mówi „wstrzyknij tutaj” zamiast „plik jest dokładnie taki”, wiele mixinów nadal działa w różnych wersjach bez żadnych zmian. To różnica między opisem celu a zapamiętywaniem mapy.

Jak Mixin wpisuje się w Fabric?

Tkanina opiera się na Mixin, kropka. Ładowacz odczytuje konfigurację mixin dla każdego moda, zbiera klasy mixin, które są wymienione w tej konfiguracji, i przekazuje je do Mixin, aby zostały zastosowane podczas ładowania klas. Nie musisz nic z tego konfigurować ręcznie; deklarowanie mixinów w konfiguracji to cała integracja.

Typowy mod Fabric składa się głównie z własnych, normalnych klas, plus niewielkiej liczby mixinów, które podłączają się do kilku metod gry, które mod faktycznie musi zmienić. Prawdziwa logika moda znajduje się w zwykłym kodzie. Mixiny to tylko cienka warstwa, która przejmuje kontrolę we właściwych momentach.

Jakie są typowe punkty wstrzykiwania Mixinów?

Rodzaj wstrzyknięcia, który wybierzesz, decyduje o agresywności patcha i o tym, jak dobrze współgra on z innymi modami. Lżejsze zmiany są bezpieczniejsze i odporne na aktualizacje. Cięższe dają więcej kontroli kosztem kruchości.

AdnotacjaCo robiKiedy się do niej sięgnąć
@InjectWykonuje Twój kod w wybranym punkcie wewnątrz docelowej metodyDomyślne rozwiązanie; najmniej inwazyjne, najbardziej odporne na aktualizacje
@RedirectZastępuje jedno konkretne wywołanie metody wewnątrz docelowejWymiana pojedynczego wywołania bez przepisywania metody
@ModifyArgZmienia argument przekazywany do wywołania metody wewnątrz docelowejKorekta jednej wartości przekazywanej do wywołania
@ModifyVariablePrzepisuje lokalną zmienną w trakcie działania metodyKorekta stanu, który metoda już obliczyła
@OverwriteZastępuje całą metodęOstateczność; koliduje z czymkolwiek innym, co jej dotyczy

@Inject jest podstawowym narzędziem, ponieważ jest precyzyjne i uprzejme. Wprowadza się w konkretnym miejscu i pozostawia resztę metody nietkniętą, co jest dokładnie tym, dlaczego ma tendencję do przetrwania aktualizacji i rzadko walczy z innymi modami. @Overwrite znajduje się po drugiej stronie: niszczy całą metodę, więc każdy inny mod, który również chce tej metody, traci. Dobre mixiny celowo utrzymują swój ślad mały.

Czysty punkt wstrzyknięcia jest również powodem, dla którego usuwanie moda przebiega błyskawicznie. Nic nie zostało zapisane w Twoich plikach, więc usunięcie moda usuwa wszystkie zmiany wraz z nim.

Dlaczego Mixin ma znaczenie dla poważnego klienta

To podstawa, na której zbudowany jest Terminus. Premiumowy klient użytkowy żyje lub umiera w zależności od tego, jak czysto wchodzi w grę, a Mixin umożliwia to bez wysyłania zmasakrowanej kopii Minecrafta. Wąskie punkty wstrzykiwania utrzymują klienta kompatybilnym z modami, które już używasz, i są stabilne podczas aktualizacji gry, zamiast psuć się w dniu wydania łatki. Zrozumienie Mixin to najszybszy sposób, aby zobaczyć, dlaczego dobrze zbudowany klient wydaje się być częścią gry, a nie delikatnym dodatkiem.

FAQ

Pobierz Terminus

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