Разработка торгового мода для Avorion: от интерфейса и Lua до скрытых проблем
Находка в воркшопе Стима
❯ Что это за игра?
Этот проект ближе всего к серии игр X: разработчики черпали вдохновение в её системе интерфейсов и механике взаимодействия между кораблями и станциями. Однако здесь есть существенное преимущество — возможность проектировать корабли из блоков, варьируя их размеры и создавая уникальные конструкции. По сути, это своеобразный «Майнкрафт» в космосе, где добыча ресурсов из астероидов также является неотъемлемой частью геймплея.
Игра тесно интегрирована со Steam, что позволяет сообществу активно делиться своими наработками: модами, чертежами кораблей и станций. Любое судно требует определенных затрат ресурсов. Наличие мультиплеера позволяет бороздить просторы галактики, заниматься торговлей и противостоять пиратам вместе с друзьями, а процедурная генерация гарантирует уникальность каждого мира.

Игровая карта поистине огромна — 1000×1000 секторов. Перемещение между секторами занимает около 10 секунд и напрямую зависит от технических характеристик вашего корабля.

Основная цель — добраться до центра галактики. Чем ближе к цели, тем более редкие и прочные материалы становятся доступны для строительства. Однако будьте осторожны: корабли врагов в этих зонах также выполнены из самых совершенных и устойчивых к повреждениям сплавов.
Я давно искал космосим, напоминающий Freelancer образца 2003 года. Ключевыми требованиями для меня были наличие вида от третьего лица и развитая экономическая модель.
Идея для мода возникла из простой потребности: в игре представлено более 100 товаров, и я постоянно забывал, по какой цене приобрел тот или иной груз. Моя цель — создать интерфейс для автоматического учета торговых сделок, где цена за единицу товара фиксировалась бы автоматически.
❯ Технические особенности
Ядро игры реализовано на C++, однако скриптовая часть написана на Lua. Поддержка модификаций предусмотрена разработчиками. Документация по API местами оставляет желать лучшего — порой примеры ограничиваются перечислением функций без какой-либо демонстрации их работы.
Полноценных руководств по созданию модов практически нет, поэтому пришлось разбираться, изучая чужой код. Структура размещения скриптов также поначалу казалась не совсем очевидной.
❯ Создание модификации
Первым делом нужно понять, как игра подгружает моды. Avorion позволяет расширять существующие игровые скрипты. Исследуя папку data/scripts, я пришел к выводу, что файл data/scripts/entity/init.lua является оптимальной точкой входа для инициализации пользовательских дополнений.
D:\SteamLibrary\steamapps\common\Avorion\data\scripts>tree /F
Folder PATH listing for volume Data
Volume serial number is D03D-733D
D:.
│ scripts.db
│ sectorspecifics.lua
│ startsector.lua
│
├───alliance
│ init.lua
│
├───client
│ crafticons.lua
│ silhouettes.lua
...
Чтобы игра «увидела» мод, необходимо создать определенную структуру в директории AppData:
C:\Users\User\AppData\Roaming\Avorion\mods\MyMod>tree /F
Folder PATH listing for volume Windows
Volume serial number is 483C-589B
C:.
│ modinfo.lua
│ thumbnail.png
│
└───data
└───scripts
└───entity
init.lua
tradinghistory.lua
Краткий обзор файлов:
modinfo.lua— манифест с метаданными;init.lua— расширение стандартной точки входа;tradinghistory.lua— основная логика мода;thumbnail.png— иконка для Steam Workshop.
В modinfo.lua задаются основные параметры: имя, версия и зависимости. Важным моментом является поле saveGameAltering — если установка мода может изменить структуру сохранений, это необходимо указать, чтобы предупредить игрока.
Подключение скрипта к Entity() в init.lua выполняется с проверкой на наличие уже загруженного экземпляра, чтобы избежать дублирования:
local entity = Entity()
if valid(entity) then
if not entity:hasScript("data/scripts/entity/tradinghistory.lua") then
entity:addScript("data/scripts/entity/tradinghistory.lua")
end
end
Следует помнить о клиент-серверной архитектуре игры: скрипты должны корректно исполняться на обеих сторонах, поэтому мы используем условия if onServer() или if onClient().
При реализации интерфейса важно использовать комментарий -- namespace, чтобы движок правильно подгрузил наш код в свое пространство имен.
❯ Результат
На текущем этапе мод успешно интегрирован в интерфейс игры: иконка пазла в верхнем правом углу открывает окно с историей совершенных сделок. Весь функционал (запись цен, расчеты и очистка истории) работает исправно.

Полный исходный код скрипта tradinghistory.lua доступен под спойлером ниже, а саму модификацию можно найти в Steam Workshop.
tradinghistory.lua
... (Код мода из оригинального сообщения) ...
В заключение скажу, что игра полностью оправдала мои ожидания. Единственный минус — некоторая ограниченность рынков сбыта, что иногда заставляет подолгу искать покупателя для определенных товаров. В остальном — это глубокий и увлекательный проект для всех любителей жанра.
Capcom портировала Monster Hunter Wilds на Switch 2
Издатель War Thunder привлек композитора Silent Hill к работе над extraction-шутером Active Matter
Remedy опубликовала системные требования Control Resonant для ПК
Bloober Team анонсировала необычный хоррор Onyx: The Dark Grip для Nintendo Switch 2
Bandai Namco самостоятельно убрала Denuvo из Code Vein II спустя семь месяцев после релиза
Компания MagicX может выпустить портативную консоль Pocket Dream в вертикальном форм-факторе Mini Dream
Инсайдер рассказал о планах Rockstar выпустить Red Dead Redemption 2 на Switch 2
EA Sports задействовала клонирование голоса для комментатора в NHL 27 при согласии самого диктора