Так что же такое ESM, ESP, ESL на самом деле и какие у них ограничения?
22.03.2022 9327 Автор: nodtrial

Так что же такое ESM, ESP, ESL на самом деле и какие у них ограничения?

Прежде всего что же значат эти сокращения?

ESM - Elder Scrolls Master
ESP - Elder Scrolls Plugin
ESL - Elder Scrolls Light

Если Вам интересен вопрос влияния плагинов на игру - рекомендую так же ознакомиться с этой статьёй : Почему нельзя изменять порядок модов во время прохождения игры

Что же такое эти файлы на самом деле?

Плагин - это база данных всех данных игрового мира, включая данные объектов, диалоги, настройки игрового процесса, размещение объектов, настройки ИИ, ландшафт, ячейки и т. д. Существует несколько типов файлов, связанных с файлами данных. Мастера, Облегченные Мастера и Плагины. В основном идентичны по формату, но имеют некоторые важные отличия.
ESM и ESP - это базы данных имеющие записи с идентификаторами xxYYYYYY, где
xx - номер плагина в порядке загрузки в 16-ричной системе исчисления, в диапазоне от 00 до FF. Таким образом получается что максимально возможное количество подключенных файлов ESP + ESM - 256 шт, в десятичной системе исчисления от 0 до 255. Слот 00 это всегда либо fallout4.esm либо skyrim.esm, и всё что идёт за ними идёт строго по порядку, т.е. фиксируем, что максимально возможное количество подключенных файлов ESP + ESM - 256 шт. Забегая немножко вперёд - использование ESL плагинов отнимает 254 слот - FE, сокращая количество до 254 плагинов. А слот 255, т.е. FF навсегда зарезервирован под временные референсы игрового мира - т.е. игра использует его для того что бы хранить временно размещённые в мире игры объекты. Итого имеем следующее утверждение: пользователю доступно 255 слотов ESP-ESM от 0 до 254 в десятичных числах или в шестнадцатиричных - от 00 до FE.


YYYYYY - это номер каждой записи в плагине. Далее мои домыслы, т.к. информации об этом не видел: Если логика верна, то диапазон этих записей должен быть от 000000 до FFFFFF, то есть максимально возможное количество записей на один плагин - до 16777216. Однако, записи в Fallout4.esm начинаются с 000001, так же как и попытка создать нулевую запись всегда заканчивается безуспешно, предположу что 000000 - это всегда запись заголовка плагина.
Если посчитать максимально возможное количество записей в игре - то 255 х 16 777 216 = 4 278 190 080
Выглядит это вот так


Обратите внимание - все НОВЫЕ записи(красные стрелки) плагина DLCCoast.esm - имеют xx - 03, и свои собственные уникальные YYYYYY.
Однако в плагине так же присутствует запись 001536F2, где xx = 00 соответствует идентефикатору 00 плагина Fallout4.esm. Это значит что плагин DLCCoast.esm не добавляет новую запись в игру, но исправляет уже созданную плагином Fallout4.esm. Если несколько разных плагинов редактируют одну и ту же запись, то игровой движок будет работать ТОЛЬКО с той записью, которая загрузится последней.

Существует ещё одно правило для ESP и ESM: плагины ESM всегда загружаются ДО плагинов ESP. Вне зависимости от того как вы их разместили.

Файл Light Master (.esl) 

— это новый оптимизированный формат файла, появившийся в обновлении Fallout 4 v1.10. Использование файлов Light Master позволяет загружать больше плагинов, чем было возможно ранее, из-за ограничения 8-битного идентификатора плагина, равного 255. Light Master делает это, используя больше диапазона ID формы для порядка загрузки, при этом также жертвуя максимальной емкостью для записей форм.
Что это значит в переводе на русский язык: если упростить структуру идентификатора ESL плагина и сравнить с идентификатором ESM-ESP - то получится что для ESL плагина это выглядит так: xxxxxYYY, т.е. у нас увеличивается количество возможных плагинов за счёт расширения части идентификатора xxxxx - который отвечает за порядок загрузки и уменьшения той части идентификатора YYY - которая отвечает за количество возможных записей в плагине.
Но xxxxxYYY - это упрощенный вид. На самом деле структура ESL плагина выглядит следующим образом: xxzzzYYY, где
xx - это слот занимаемый ESL плагином в общем пуле идентификаторов. Это всегда слот FE (т.е. 254). Т.о. движок видит ВСЕ записи созданные в ESL плагине в одном слоте FE, т.к. все записи создаваемые в ESL плагинах фактически для игры и являются записями одного слота.
zzz - порядок загрузки внутри слота FE - это позволяет загружать большее количество плагинов, но с меньшим количеством записей. Диапазон значений для этого слота от 000 до FFF - то есть 4096. Это и есть то, о чём знают все - ESL плагинов можно загружать до 4 тысяч штук.
YYY - это уникальные НОВЫЕ записи, которые можно сделать в каждом моде. Их диапазон так же от 000 до FFF.

То есть в абсолютных числах в плагине ESL можно сделать 4096 новых уникальных записей.
Итого - 4096(количество возможных плагинов ESL) х  4096(количество максимально возможных записей в одном плагине ESL) = 16777216. Где-то это число ведь уже было, верно? Точно такое же максимальное количество записей можно сделать в ОДНОМ плагине ESP-ESM.
Иными словами - механизм следующий - один из 255 слотов ESP-ESM дробится на 4096 маленьких кусков, что можно было невероятно увеличить количество плагинов. И в итоге мы вместо 255 слотов имеем 254 слота для ESP-ESM и 4096 слотов для ESL.
При этом абсолютное максимально возможное количество записей остаётся тем же:
255 х 16777216 = 4 278 190 080
Однако теперь это выглядит так:
254(ESP+ESM) x 16777216(макс. кол-во записей в ESP-ESM плагине) + 1(слот 254 или FE) x 4096(количество возможных плагинов ESL) х 4096(количество максимально возможных записей ESL) = 4 278 190 080

Особенности использования ESL файлов:

1. Можно загрузить не более 331 плагина имеющего до 2048 (КАЖДЫЙ) записей ALCH - как я понимаю это объекты типа ЗЕЛЬЕ(POTION). Не знаю почему это ограничение, но их объединяет то, что они не имеют постоянно закрепленного референса в игровом мире. Как я понимаю речь не о самих объектах категории ALCH - а о их размещении непосредственно в мире игры, т.е. того случая когда под них резервируется временный референс. Но, честно говоря, мне не понятно это утверждение - возможно имеется в виду что-то абсолютно другое.
2. Можно загрузить более 970 плагинов, каждый из которых содержит одну запись CELL и 2047 записей REFR(референс в игровом мире - иными словами предмет лежащий непосредственно в игровом мире, а не в сундуках и инвентарях)
3. Обновление файлов ESL имеет больше ограничений, чем обновление файлов ESP, но их немного. Из-за ограничения в 2048 идентификаторов форм (я так понимаю речь о предметах размещенных в мире с референсными значениями, но не уверен) важно соблюдать осторожность при удалении форм, чтобы не использовать идентификаторы форм удалённых предметов повторно. Игровой движок может неадекватно воспринять ситуацию когда, например, удалена форма оружия с определенным идентификатором, а после с таким же идентификатором загружена форма брони.  
Личное мнение: Полагаю что бы гарантированно безопасно отключить ESL плагин во время прохождения - нужно отключить плагин, и поставить на его место в порядке пустой плагин ESL, после чего загрузить сохраненную игру и пересохраниться - это действие должно удалить все идентефикаторы отключаемого плагина из текущего прохождения. Всё равно, если отключить пустой плагин даже после этой операции - есть возможность некорректного смещения по идентификаторам ZZZ при совпадении YYY в нескольких разных модах.  По этому, получается, что перемещение в порядке загрузки ESL плагина создающего НОВЫЕ записи в процессе прохождения игры - всегда рискованная процедура. Иногда вы сможете заметить разницу, иногда это будет не заметно, но существуют так же случаи, когда это никак не повлияет.
Приведу пример: допустим у нас есть лайт плагины с идентификаторами
A - FE000 и B - FE001. 
1) В плагине A есть броня с идентификатором 001, т.е. полная запись брони для игры выглядит так: FE000001.
2) В плагине В - есть пистолет с идентификатором 001, т.е. FE001001
3) Удаляя плагин А - FE000 - мы смещаем плагин B - и теперь он будет иметь идентификатор FE000, а предмет FE000001 - станет бронёй. 
Разработчик утверждает что из-за того что для игры это всё один слот - FE, могут возникнуть проблемы из-за такого смещения, игровой движок может некорректно обрабатывать такую подмену информации.
4) В то же время, если мы подставим ПУСТОЙ ESL плагин вместо FE000, то смещения FE001 не произойдёт. Т.о. предмет FE000001 - пропадёт из игры, как и его запись, а предмет FE001001 - останется в игре под тем же идентификатором, т.к. смещения адресов не произойдёт.

Light Plugin

Лайт плагины - также известные как «ESP с флагом ESL» или «ESPFE», это комбинация ESL и ESP. Это файл с расширением .esp, но с флагом заголовка ESL.
Как и легкие мастера, легкие плагины имеют максимальное количество записей не более 4096 форм, между 0x000 и 0xFFF, и во время выполнения объединяются в слот 0xFE.
Легкие плагины загружаются вместе с обычными плагинами. Это означает, что они могут как переопределять другие плагины, так и требовать плагины в качестве мастеров без негативного влияния на порядок загрузки.
Что это значит - фактически это ESL плагин, загружающий все НОВЫЕ записи так же как ESL в 254 слоте, НО игровой движок может различать НОВЫЕ записи от исправления существующих.
Т.о. имеем следующее:
1. ESP плагины грузятся в строгом порядке со своими идентификаторами т.е. 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 10, 11 ... FF
2. При этом ESL плагины имея 254 слот FE - загружаются вне этого порядка, и вероятно каким-то образом занимают всегда место в загрузке между плагинами ESM и ESP.
3. Вместе с тем ESPFE обходят эти ограничения в тех случаях когда не создают НОВЫХ записей, а редактируют уже существующие.
4. Если ESPFE и создаёт новые записи и редактирует записи других модов - существующие, то новые записи будут загружены в 254 слот FE, который загружается между ESM и ESP, а отредактированные существующие записи будут загружены в соответствии с текущим порядком загрузки.

В этом ESP-ESL плагине зелёная стрелка - это новая форма, создаваемая плагином, а красные стрелки это изменение уже существующих форм. Новая форма будет создана в слоте FE, изменение существующих форм будет принято согласно листу загрузки плагинов. Плагин будет занимать пространство в 254 слоте - ESL. Это оптимальный вариант для создания патчей между модами.
Надеюсь помог разобраться в вопросе, а не запутаться еще больше)))

На последок, отвечу ещё на несколько вопросов:

Что такое Compact FormID?
Это процедура переделывания формата записей плагина из формата для ESM-ESP xxYYYYYY в формат для ESL-ESPFE - xxzzzYYY. При этой процедуре необратимо изменяются ID записей. Эта процедура может быть опасна, в случае если плагин является мастером для других плагинов.

В каких случаях нельзя переделывать из ESP в ESL или ESPFE?
1. В плагине более 2047 записей о размещенных непосредственно в игровом мире предметах (ALCH или REFR).
прим. - теоретически это ограничение можно обойти размещая записи с помощью скриптов - но это достаточно трудозатратно - и самое главное: надо ли?
2. В плагине более новых 4096 записей.
3. В плагине содержащие данные о цветах (сигнатура CLFM) - лично у меня возникала проблема, что в игре они отсутствуют, несмотря на то, что эдит не ругается при сохранении.
4. В плагине содержаться изменения сцен СУЩЕСТВУЮЩИХ(не новых) диалогов - лично у меня возникала проблема, что в этих случаях диалоги происходят молча, без возможности их пропустить.
5. Плагин является очевидным мастерплагином для других плагинов.
6. Плагин является неочевидным мастерплагином для других плагинов, иными словами не имеет очевидных ссылок, но имеет взаимосвязи построенные с помощью скриптов Papyrus. Формат представления ссылок на ESL-ESPFE файлы отличается от формата представления ссылок на ESM-ESP.
Вероятно что есть ещё какие-то случаи ограничений, о которых мне пока не известно.

Резюме:

Действительно ли можно подключить 4096 плагинов ESL? И да и нет.
Есть некоторые ограничения, к которым всё равно невероятно сложно подобраться. Вполне себе можно подключить условных 1000-1500 модов что бы они работали нормально, с точки зрения их обработки игровым движком. Что касается содержимого модов и их общей внутриигровой работоспособности - такое будет невероятно сложно сделать, но возможно и зависит исключительно от навыков и понимания делающего.

UPD.: Ещё одно важное ограничение, о котором стоит знать - максимально с помощью ESM, ESL и ESP можно загрузить архивы BSA не более чем 256 раз. То есть одним плагином Вы можете загрузить несколько архивов - например архив текстур, архив звуков и архив моделей и это будет считаться за 1 использованную возможность загрузить архив с помощью плагина. При попытке загрузить больше - игра не запустится.

Для тех, кто хочет активно подискутировать на эту и другие темы в голосе, приглашаю в дискорд канал. По выходным я часто провожу голосовые стримы.

 
Аватар timonush
timonush в 22:02:57, 23.12.2023
Нравится
что делать если после установки morrowind и morrowind code patcher файлы esm,esp стали какимито morrowind master data file и morrowind plugin data file?
Аватар Uncleb
Uncleb в 22:43:35, 07.02.2023
Нравится (1)
Крутая статья, спасибо.
Посчитал свою сборку - 36 (игра) + 352 (моды) = 388 файлов .ba2, то есть архивов.
Перестает запускаться где-то после 600 (добьюсь искомого количества - напишу), а не после 256.
Аватар nodtrial
nodtrial в 15:25:58, 09.02.2023
Нравится
Я как-то запарился и посчитал, 256 не архивов как таковых, а 256 плагинов, которые могут загружать больше одного архива каждый. К этому количеству не относятся архивы, которые грузятся ини-файлами. По этим двум причинам подсчёт просто по количеству BA2 не даст правильный результат.
Судя по постам авторов бафаута (мод для движка F4) имеет значение количество MAIN архивов. Именно их не может быть более 256.
Аватар 1ex0
1ex0 в 18:56:55, 16.04.2022
Нравится (1)
Прочитал половину, но многое стало ясно. Спасибо большое. Потом дочитаю и буду стараться пользоваться.
Аватар perchik71
perchik71 в 15:04:23, 26.03.2022
Нравится (1)
00 - всегда Fallout4.esm Всего 254 мода можно иметь (включая сам Fallout4.esm). Все изменения в игре идут с FF 256 позиция от 0 (там же объекты постройки), временные также идут с FF, однако, с флагом Temporary, в консоли они с припиской [T]. Во время сейва временные не сохраняются (исключение в пределах видимости ГГ). От чего можно перегрузиться и не увидеть случайной встречи, где вас убили ранее. Удалённые помечаются как [D], при сейве гарантировано не будут сохранены. Если мод ESL исключить повреждения будут такие же как при удаления обычного мода (в сейве сохраняется мод и в каком он был порядке). ESLs раздел фактически .ESM для движка игры. Причины почему нельзя загрузить 4096 ESL впринципе, из-за объёма памяти (одна форма весть 180 байт по памяти говорю), ещё чуть больше ссылка на него. По итогу это 2 гига памяти. Так же есть так называемый TESData, который содержит в себе массивы всех объектов со всех модов и на мой взгляд BSTArray в джике игры, так и CK имеет ошибку и не может быть более 0x7FFFFFFF значений. Как только в одно из массивов такое происходит неизбежно получите crash.

АПД: Добавлю, что BSTArray имеет сплошную память и если система не может выделить память под 2 млн форм, вы получите краш. На мой взгляд выделение памяти сразу куском в 1ГБ система имеющая только 16 гигов, не в состоянии.
Аватар nodtrial
nodtrial в 11:00:51, 29.03.2022
Нравится
Спасибо. Добавлю эту информацию чуть попозже!
Аватар Lyrfox
Lyrfox в 18:07:27, 22.03.2022
Нравится
NMM (0.83.5) - Total plagins: 334 , Active plagins: 188 (329) , Total mods: 198 , Installed mods: 193 , Active mods: 188 , большинство с расширением esp. , но есть и лайт файлы esl. и esm. . Я так понял , что esp. + esm. = 256 ( это активные моды ) и в моём случае лимит активных не превысил 256 т е можно ещё моды добавлять до 256 - я правильно понял посыл выше опубликованной информации ???  meeting
Аватар nodtrial
nodtrial в 19:07:09, 22.03.2022
Нравится
255, даже 254, т.к. слот FE занят плагинами ESL и ESPFE. Все 4096 плагинов ESP-ESL помещаются в один слот ESP. Магия цифр и математика в чистом виде.
Информация о 255 взята с сайта Creation Kit, но, как вариант - они имеют в виду что основной мастер плагин по любому будет подключен. Т.е. Fallout4.esm(Skyrim.esm) + 255 других. Но глобально это на расчёты и общую суть написанного не влияет.
Так же не совсем понятно почему под лайты взят слот 254 (FE), а не последний, 255 (FF).
Аватар ADrobkov
ADrobkov в 00:18:38, 23.03.2022
Нравится
Так исчисление с 0 до 254 = 255, и + 1 FE. Итого 256. Или я не верно понял?
Аватар nodtrial
nodtrial в 10:33:22, 23.03.2022
Нравится (1)
C 0 до 255 = 256. слот № 254 или FE или предпоследний - занят ESL/ESPFE плагинами. Слот № 255 или FF очевидно не достижим в принципе - т.к. мне тут вспомнилось, что вещи в игре, не имеющие постоянно закрепелённого референса, которые размещены непосредственно в игровом мире игроком в процессе прохождения, если не имеют своего уникального референса, то получают референс с идентификатором FF. Т.е. 255 слот FF скорее всего навсегда занят под эти референсы.
upd. Добавил это в статью.
avatar
Gamer-mods.ru © 2012 - 2024. Все права защищены. Копирование материалов без указанной активной ссылки на данный сайт запрещено.