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.
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ście | Współistnieje z innymi modami | Przetrwa aktualizację gry | Dostarczany jako |
|---|---|---|---|
| Ręczna edycja skompilowanej gry | Nie, wygrywa jeden fork | Nie, psuje się przy każdej zmianie | Pełny zmodyfikowany plik jar |
| Wstrzykiwanie Mixin | Tak, poprawki się nakładają | Często, jeśli metoda przetrwa | Kilka 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.
| Adnotacja | Co robi | Kiedy się do niej sięgnąć |
|---|---|---|
@Inject | Wykonuje Twój kod w wybranym punkcie wewnątrz docelowej metody | Domyślne rozwiązanie; najmniej inwazyjne, najbardziej odporne na aktualizacje |
@Redirect | Zastępuje jedno konkretne wywołanie metody wewnątrz docelowej | Wymiana pojedynczego wywołania bez przepisywania metody |
@ModifyArg | Zmienia argument przekazywany do wywołania metody wewnątrz docelowej | Korekta jednej wartości przekazywanej do wywołania |
@ModifyVariable | Przepisuje lokalną zmienną w trakcie działania metody | Korekta stanu, który metoda już obliczyła |
@Overwrite | Zastę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
Nie. Mixin to biblioteka, za pomocą której tworzone są mody, a nie coś, co pobiera się samodzielnie. Ładowacz, taki jak Fabric, zawiera Mixin wewnętrznie i stosuje miksiny zadeklarowane przez każdy mod podczas ładowania gry.
Nie. Wszystkie poprawki zachodzą w pamięci podczas ładowania klas. Plik jar na dysku nigdy się nie zmienia, dlatego usunięcie moda całkowicie usuwa jego działanie, nie pozostawiając po sobie żadnych śladów.
Kiedy oba elementy poprawiają tę samą metodę w sposób kolidujący, jeden może przyćmić drugi. Najczęstszym winowajcą jest @Overwrite. Miksiny wykorzystujące wąskie punkty wstrzykiwania, takie jak @Inject, z większą pewnością współistnieją.
Nie. Mixin to uniwersalny framework do manipulacji bytecode'u Javy. Modyfikacje Minecrafta to miejsce, gdzie jest najczęściej używany, a standaryzacja Fabric na jego rzecz uczyniła go domyślnym narzędziem dla tego ekosystemu.
Pobierz Terminus
Built on clean Mixin hooks, not a hacked-up jar.