Learn · concepts

Что такое посредник? Объяснение карт в Minecraft

Fabric использует стабильный слой именования для запутанного кода Minecraft. Моды продолжают работать в разных версиях, не ломаясь, даже когда переименовываются поля.

TRtrolPublished 4 min read

Что такое Intermediary?

Intermediary — это стабильный слой именования, который Fabric накладывает поверх запутаного кода Minecraft. Mojang распространяет игру с перепутанными именами классов, полей и методов, которые меняются при каждом выпуске. Intermediary даёт каждому из них фиксированное имя, которое остаётся неизменным между версиями, поэтому скомпилированный мод продолжает находить код, который он изменяет, даже после обновления игры.

Представьте это как контракт: Fabric обещает, что если что-то существует в игре, оно будет иметь одно и то же имя Intermediary во всех версиях. Этот контракт позволяет моду, распространяемому в виде скомпилированного jar-файла, продолжать работать в новых версиях без перекомпиляции.

Что такое Intermediary на самом деле

Intermediary — это набор отображений: таблица поиска, которая связывает каждый запутанный символ Minecraft со стабильным, машиногенерируемым именем. Класс, который игра вызывает a, может стать class_1234 в Intermediary. Имя может быть некрасивым, но оно остаётся постоянным для этого символа на протяжении всех выпусков.

Mojang запутывает игру при каждой сборке. Иначе имена менялись бы от релиза к релизу, поэтому мод, скомпилированный с использованием необfuscated имен, перестаёт работать сразу после обновления игры. Intermediary фиксирует эти имена, так что отображение, а не мод, поглощает изменения.

Почему Fabric mods это необходимо

Моды распространяются в скомпилированном виде, ориентированном на промежуточные имена, а не на читаемые имена, которые разработчик пишет. Именно это решение позволяет Fabric моду продолжать работу в новой сборке игры во многих случаях без перекомпиляции.

При запуске игры Fabric загружает промежуточное отображение для этой версии и переназначает обфусцированные классы игры в стабильные имена, которые ожидает мод. Мод и игра сходятся на одном наборе имен, который ни один из них не поставляет в исходном виде.

Промежуточные и разработческие отображения

Разработчики не читают и не пишут class_1234. Они работают с читаемым отображением, таким как Yarn или Mojmap, которые дают символам описательные имена. Во время сборки читаемые имена компилируются в промежуточные для распространения.

УровеньПример имениКто используетСтабилен между версиями
Обфусцированныйa, field_5678Никто вручнуюНет
Промежуточныйclass_1234, method_5678Распространяемые бинарные файлы модовДа
Yarn / MojmapMinecraftClient, isPlayerSpawned()Разработчики во время сборкиЧитаемый, отслеживаемый по версиям

Такое разделение позволяет разработчикам кодировать с использованием понятных имен, в то время как то, что фактически распространяется, остается стабильным по версии. Читаемые отображения можно заменять; промежуточные — это общий знаменатель, на котором все согласны.

Как это вписывается в жизненный цикл мода

  1. Разработчик пишет код, опираясь на понятную схему, например, Yarn или Mojmap.
  2. Процесс сборки преобразует эти имена в промежуточные.
  3. Мод распространяется в виде jar-файла, который ссылается на промежуточные символы.
  4. При запуске Fabric переназначает имена в работающей игре с обфусцированных в промежуточные, чтобы мод и игра были согласованы.

Именно поэтому схемы являются тихой, но несущей нагрузку частью моддинга Fabric: они представляют собой соглашение, которое гарантирует, что моды будут указывать на правильный код после каждого обновления.

Часто задаваемые вопросы