Расширение доступа 26.1.2
Изучите, как использовать расширители доступа из файлов в формате classtweaker.
Расширение доступа — это тип модификации классов, используемый для ослабления ограничений доступа к классам, методам и полям и отражения этих изменений в декомпилированном исходном коде. Это включает в себя перевод их в публичные, расширяемые и/или изменяемые.
Элементы access widener могут быть транзитивными, чтобы изменения были видны модам, зависящим от вашего мода.
Для доступа к полям или методам зачастую безопаснее и проще использовать accessor mixins, однако есть два случая, когда их недостаточно и требуется расширение доступа:
- Если вам нужен доступ к приватному или защищённому классу, или к классу с видимостью по умолчанию
- Если вам нужно переопределить финальный метод или расширить финальный класс
Однако, в отличие от accessor mixins, модификация классов работает только с классами Vanilla Minecraft и не применяется к другим модам.
Директивы доступа
Элементы access widener начинаются с одного из трёх ключевых слов-директив, которые определяют тип применяемого изменения.
Accessible (Доступный)
accessible может быть применено к классам, методам и полям:
- Поля и классы становятся публичными.
- Методы тоже становятся публичными, а также финальными, если изначально были приватными.
Расширение видимости метода или поля также расширяет видимость его класса.
Extendable (Расширяемый)
extendable может быть применено к классам и методам:
- Классы становятся публичными и нефинальными
- Методы становатся защищёнными и нефинальными
Изменение расширяемости метода также меняет расширяемость его класса.
Mutable (Изменяемый)
mutable может сделать поле изменяемым.
Чтобы сделать приватное неизменяемое поле доступным и изменяемым, вам нужно создать два отдельных включения в файле.
Указание целей
Для модификации классов используются их внутренние имена. Для полей и методов вам нужно указать название их класса, их название и их дескриптор байткода.
Формат:
classtweaker
<accessible / extendable> class <className>Пример:
classtweaker
# Makes the inner class MenuSupplier in MenuType public
accessible class net/minecraft/world/inventory/MenuType$MenuSupplierГенерация записей
Ручное написание записей access widener занимает много времени и подвержено человеческим ошибкам. Давайте рассмотрим инструменты, которые упрощают часть процесса, позволяя генерировать и копировать записи.
mcsrc.dev
Доступный для всех версий с необфусцированным JAR, а именно 1.21.11 и выше, mcsrc позволяет декомпилировать и просматривать исходный код Minecraft в браузере, а также копировать цели для Mixin, access widener или access transformer в буфер обмена.
Чтобы скопировать запись access widener, сначала перейдите к классу, который вы хотите изменить, и ПКМ по нужному элементу, чтобы открыть контекстное меню.

Затем нажмите Копировать Class Tweaker / Access Widener, после чего в верхней части страницы появится подтверждение.

Затем вы можете вставить эту запись в файл class tweaker.
Плагин Minecraft Development (IntelliJ IDEA)
Плагин Minecraft Development, также известный как MCDev, — это плагин для IntelliJ IDEA, который помогает в различных аспектах разработки модов для Minecraft. Например, он позволяет копировать записи access widener из декомпилированного исходного кода в буфер обмена.
Чтобы скопировать запись access widener, сначала перейдите к классу, который вы хотите изменить, и ПКМ по нужному элементу, чтобы открыть контекстное меню.

Затем нажмите Копировать / Спец. вставка, а затем AW Entry.

Теперь над элементом, по которому вы щёлкнули ПКМ, должно появиться подтверждение.

Затем вы можете вставить эту запись в файл class tweaker.
Применение изменений
Чтобы увидеть применённые изменения, необходимо обновить Gradle-проект и пересгенерировать исходники. Целевые элементы должны иметь соответствующим образом изменённые ограничения доступа. Если модификации не появляются, вы можете попробовать валидацию файла и проверить на наличие ошибок.

























