- Mixin — это Java-библиотека, которая изменяет скомпилированные классы Minecraft во время загрузки.
- Моды описывают, куда внедрять код, а не как выглядит файл, поэтому патчи выживают после обновлений игры.
- Fabric построен на Mixin и применяет миксины каждого мода во время загрузки классов.
- Mixin никогда не устанавливается отдельно; загрузчик включает его в себя.
Mixin — это Java-библиотека, которая позволяет модам изменять скомпилированные классы Minecraft во время загрузки игры, не редактируя исходный код. Моды пишут небольшие классы, которые указывают: «добавить этот код в этой точке в этом игровом методе», и Mixin вставляет их в байткод во время выполнения. Fabric использует её в качестве основного механизма моддинга.
Где используется Opal
Opal — это Fabric мод, поэтому он использует Mixin в своей основе. Вам не нужно устанавливать Mixin самостоятельно; руководство по настройке охватывает запуск Opal и Fabric.
Как работает Mixin
Mixin изменяет классы после их компиляции, но до запуска JVM. Мод поставляется с классом Mixin, нацеленным на реальный класс игры. Аннотации в этом классе отмечают места, куда должен быть внедрен код: начало метода, конец, конкретный вызов метода или возвращаемое значение. Когда Minecraft загружает целевой класс, Mixin переписывает его байт-код, чтобы вставить код мода.
Это важно, потому что Minecraft не предназначен для расширения. В игре нет официальных точек расширения для большинства функций. Mixin предоставляет модам возможность, рассматривая сам скомпилированный игровой код как поверхность для расширения.
Почему моды используют его вместо редактирования игры
Две причины: совместимость и обновления.
Редактирование исходного кода игры напрямую означает отправку полной модифицированной копии, на которой никто другой не может строить и которая ломается в момент обновления игры. Mixin-патчи небольшие и точные, поэтому многие моды могут патчить одну и ту же игру, не отправляя каждый свою полную версию.
Патчи также описывают, куда внедрять, а не как выглядит файл, поэтому Mixin, написанный для одной версии, часто все еще работает после обновления игры, при условии, что целевой метод все еще существует.
Как это сочетается с Fabric
Fabric построен на Mixin. Загрузчик читает конфигурацию mixin каждого мода, а затем передает указанные классы mixin в Mixin для их применения во время загрузки классов. Типичный мод Fabric состоит в основном из собственных классов и небольшого количества mixin, которые перехватывают немногие методы игры, которые ему необходимо изменить.
Общие точки внедрения
| Аннотация | Что делает |
|---|---|
@Inject | Выполняет ваш код в выбранной точке внутри целевого метода |
@Redirect | Заменяет конкретный вызов метода внутри целевого |
@ModifyArg | Изменяет аргумент, передаваемый в вызов внутри целевого |
@ModifyVariable | Переписывает локальную переменную в середине метода |
@Overwrite | Заменяет весь метод (крайняя мера; легко ломается) |
@Inject является инструментом по умолчанию, поскольку он наименее инвазивен и наиболее вероятно выдержит обновление игры. @Overwrite избегают, потому что он конфликтует с любым другим модом, затрагивающим тот же метод.
Часто задаваемые вопросы
Нет. Mixin — это библиотека, с помощью которой создаются моды. Вы не устанавливаете его отдельно; загрузчик, такой как Fabric, объединяет его и применяет миксины, предоставляемые вашими модами.
Нет. Патчи применяются в памяти при загрузке классов. Файлы на диске остаются нетронутыми, поэтому удаление мода приводит к чистому удалению внесенных им изменений.
Если оба патчат один и тот же метод несовместимым образом, особенно с использованием @Overwrite, один может отменить или сломать другой. Хорошо написанные миксины используют узкие точки вставки, чтобы не мешать друг другу.
Нет. Mixin — это общий Java-фреймворк для работы с байт-кодом, но чаще всего он используется в моддинге для Minecraft, и его принятие Fabric сделало его стандартом в этой среде.