Перейти к содержанию

Перенос мода Project Zomboid с Build 41 на Build 42

Проверка структуры папок, типа предметов, значений base:, craftRecipe, переводов, списков добычи и Lua при переносе копии мода. Спорные common/ и Mods= отмечены как непроверенные утверждения источника.

Руководство Wenopal перечисляет изменения в структуре папок, предметах, рецептах, переводах, добыче и Lua и предлагает пройти их по порядку на копии мода. Автор пишет, что проверял материал по файлам игры Build 42.21; независимая проверка и запуск не проводились. Полного автоматического конвертера или гарантии совместимости источник не обещает.

До работы скопируйте мод. Если мод принадлежит другому автору, источник предлагает сначала получить разрешение на публикацию версии B42 либо выпускать patch, требующий оригинал. Это не подтверждает лицензию или право использовать чужие файлы: проверьте условия конкретного мода.

1. Структура папок

В Build 41 файлы лежали прямо в папке мода. Пример источника показывает перенос содержимого в каталог версии Build 42:

Схема B41 → B42 из источника: B41 B42 Contents/mods/MiMod/ Contents/mods/MiMod/ ├── mod.info ├── 42/ ├── poster.png │ ├── mod.info └── media/ │ ├── poster.png │ └── media/ └── common/ (optional)

  • Перенесите mod.info, изображения и media/ внутрь 42/.
  • Автор описывает common/ как место для файлов, работающих на любой версии, и помечает папку optional. Это утверждение спорит с другими руководствами; обнаружение файлов и включение мода через common/ здесь не проверялись, поэтому не считайте папку безусловно необязательной.
  • В mod.info добавьте versionMin=42.0.0 либо значение фактической минимальной версии.

2. Предметы: Type меняется на ItemType

В примерах стандартных предметов B42 автор не использует Type =; вместо него приводит ItemType с префиксом base:. Таблица передаёт именно примеры источника, они требуют сверки с целевым билдом:

Build 41Build 42 в примере
Type = Food,ItemType = base:food,
Type = Weapon,ItemType = base:weapon,
Type = Clothing,ItemType = base:clothing,
Type = Normal,ItemType = base:normal,
Type = Drainable,ItemType = base:drainable,

Автор перечисляет 15 типов в B42: base:normal, base:food, base:weapon, base:clothing, base:drainable, base:container, base:literature, base:moveable, base:radio, base:key, base:map, base:weaponpart, base:alarmclock, base:alarmclockclothing и base:animal. Для каждого он советует искать похожий стандартный предмет в справочнике; наличие списка и поля проверьте на версии проекта.

3. Префикс base: для тегов, BodyLocations и категорий

ПолеB41 в примереB42 в примере
TagsTags = Hammer,Tags = base:hammer,
Место ношения одеждыBodyLocation = Shoes,BodyLocation = base:shoes,
Категория оружияCategories = SmallBlunt,Categories = base:smallblunt,

Источник ссылается на справочники тегов и BodyLocations. Он отдельно предупреждает, что некоторые значения меняются не простым добавлением base:: примеры — base:tshirt, base:shortsleeveshirt и base:zeddmg. Сверяйте точные значения по справочнику и файлам текущей версии.

4. Рецепты: recipe заменяется на craftRecipe

Автор утверждает, что в файлах Build 42 не нашёл рецептов старого формата: в проверенной им выборке было почти тысяча craftRecipe и ни одного recipe. Формат, по его словам, существенно отличается. Ниже исходный пример из мода CompleteItaliano:

Пример craftRecipe из источника (идентификаторы и формат не менялись): craftRecipe MakeCompletoItaliano { timedAction = Making, time = 60, Tags = InHandCraft;Cooking, category = Cooking, inputs { item 1 [CompleteItaliano.PanCompleto;Base.BunsHotdog_single] flags[InheritFoodAge], item 1 tags[base:screwdriver] mode:keep, } outputs { item 1 CompleteItaliano.CompletoItaliano, } }

  • Старые рецепты, согласно автору, не конвертируются автоматически: их переписывают под craftRecipe.
  • Указывайте модуль перед каждым предметом мода, например MiMod.Item. Источник связывает отсутствие префикса с ошибкой загрузки мира; это нужно подтвердить на целевой версии.
  • Отображаемое имя рецепта помещается в Recipes.json; см. раздел о переводах.

5. Переводы: JSON

Источник утверждает, что B42 читает только .json, а .txt-файлы из B41 игнорирует, показывая ключ вместо текста. При этом в Build 42.21 также могут появляться сообщения об отсутствующих переводах. Проверяйте формат и ошибки в целевой версии.

Пара примеров B41 и B42 из источника (оставлены дословно): B41: media/lua/shared/Translate/ES/ItemName_ES.txt ItemName_ES = { ItemName_MiMod.Sopaipilla = "Sopaipilla", } B42: media/lua/shared/Translate/ES/ItemName.json { "MiMod.Sopaipilla": "Sopaipilla" }

  • В примере меняется ключ: в B42 это Module.Item без префикса ItemName_.
  • По словам источника, тот же переход применяется к Tooltip, Recipes, IG_UI и Sandbox: отдельный .json для категории и языка. В примере используется испанский ES, английский помещается в EN. Подробности — в отдельном руководстве о переводах.

6. Добыча: проверьте имена списков

Источник говорит, что ProceduralDistributions и событие Events.OnPostDistributionMerge сохранились, поэтому старый Lua-код добычи часто продолжает работать. Однако списки могли поменяться или оказаться пустыми. Пример автора — GunStoreShelf: он утверждает, что список существует, помечен устаревшим и не содержит предметов. Если предмет не появляется, проверьте каждое имя списка по справочнику текущего билда.

Автор также советует использовать защитный шаблон, который сначала проверяет наличие списка; пример находится в его руководстве по loot. Перенос поведения без проверки не гарантируется.

7. Изменения Lua, которые могут ломать мод

ДоПример для B42 в источнике
getProperties():Is(IsoFlagType.water)getProperties():has(IsoFlagType.water), имя water в нижнем регистре; автор пишет, что :Is( не встречается в игровых файлах.
getCell():getVehicles():get(i)getVehicles() — Set без :get(i); для обхода объектов источник предлагает getCell():getObjectListForLua().
HaloTextHelper.addText(player, texto, color)Автор предлагает addGoodText (зелёный), addBadText (красный) или addText(player, texto).
table.insert(PrintMediaDefinitions.Fliers, ...)Источник говорит, что таблицы больше нет и указывает Registries.FLIER.
BodyLocations как строки: getOrCreateLocation("Hat")В источнике указан enum ItemBodyLocation.HAT и файл media/lua/shared/NPCs/BodyLocations.lua.
Timed actions в client/Автор советует shared/: по его объяснению, сервер B42 multiplayer тоже создаёт класс по имени.

Автор связывает такие изменения с tried to call nil, проявляющейся при загрузке сохранения, и ссылается на справочник событий Build 42. Все вызовы, enum, registries и момент проявления ошибки требуют проверки по целевым файлам и multiplayer.

8. Серверы и параметр Mods=

Источник рекомендует указать для серверов строку Mods=\MiMod, то есть обратную косую черту перед каждым ID мода, и ссылается на руководство по dedicated server. Это спорное утверждение: другой источник приводит несовпадающий синтаксис. Здесь оно сохранено только как цитируемый пример автора, не как рабочая универсальная инструкция. Не копируйте строку в конфигурацию без независимой проверки формата сервера и конкретного билда.

Непроверенная строка из источника (дословно): Mods=\MiMod

Контрольный список

  1. Файлы перенесены в 42/, а versionMin в mod.info задан.
  2. Каждый Type = заменён на ItemType = base:... по проверенному типу.
  3. Для тегов, BodyLocations и категорий сверены актуальные значения base:.
  4. Рецепты адаптированы под craftRecipe, а предметы мода снабжены префиксом модуля.
  5. Переводы перенесены в .json и используют новые ключи.
  6. Каждый список добычи проверен отдельно.
  7. В Lua проверены перечисленные в статье вызовы :Is(, getVehicles():get( и PrintMediaDefinitions.Fliers.
  8. Источник советует проверить мод с -debug на новом сохранении и просмотреть console.txt. Поскольку проверка не проводилась, это остаётся будущим тестовым шагом.