Последние мои коммиты по проекту были в середине 2022, на текущий момент прошло полтора года. В целом это повод рарссказать о том, что это вообще такое было и для чего было нужно.

Скрин последних коммитов Скрин последних коммитов

Что это такое

С самого начала лиди я грезил автоматизацией процесса сборки воркшоп контента. В начале это было просто мечтой - недостижимой идеей, однако ближе к 2022 году я практически реализовал этот проект на продакшене. К сожалению шафт скоропостижно скончался, а с ним и сборщик.

Суть этого автосборщика автоматизировать процесс сборки контента для серверов, оптимизация ресурсов и удаление лишнего хлама. Про техническую часть будет ниже.

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

Этот парень был из тех, кто просто любит жизнь. Этот парень был из тех, кто просто любит жизнь.

Нюансы нашей работы с контентом на самом деле довольно хитрые, и это не только убрать луа файлы из контента… хотя, конечно, не совсем знаком с тем, как работали другие сервера в этом плане. Вся история в основном завязана на нашем опыте взаимодействия с воркшоп контентом, глубоким анализом работы движка Source и работы аддонов в гаррисе. У нас на учете стоял каждый контент с каждым весом, подсчитывали и вносили в таблицу учета. Раньше просто нельзя было загружать объемные файлы в воркшоп. Да и вся эта процедура была нужна в целом для того, чтобы контент не весил больше самой игры.

Тюф №1

Тюф №2

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

Коротко о том, как работает контент в гаррисе Коротко о том, как работает контент в гаррисе

По мере наполнения контента мы сталкивались с трудностями, в первую очередь в плане кода. Сервер можно легко взломать, так как связанные с коллекцией предметы, сами обновлялись и в одном из предметов мог затесаться lua файл, который точно бы исполнился. Также какой нибудь автор мог использовать 4К полотно чисто белого цвета и без альфа канала… Зачем, одному автору известно, ну и сами 4К текстуры на моделях… Ну, такое. Да, круто… но такое, учитывая что в гаррис в основном играли на достаточно слабом железе, а сама игра обрабатывала такие текстуры с трудом. Мы пришли к выводу, что лучший вариант на тот момент - ручная проверка всех текстур, чистка от луа файлов и своеобразная консервация в наших собственных сборках.

Такая рутина, я хз как он выдержал всю эту историю Такая рутина, я хз как он выдержал всю эту историю

Наша таблица ведения контента, было актуально до 2019 года Наша таблица ведения контента, было актуально до 2019 года

Наша таблица ведения контента, итоговые результаты Наша таблица ведения контента, итоговые результаты

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

Первый запуск приложения, скриншот с теста Первый запуск приложения, скриншот с теста

К сожалению никакого материала особо не осталось, а восстанавливать проект ради демонстрации работы как-то не очень не хочется. Я постарался собрать демо-версию сборщика, в которой только визуальная часть.

Демо-версия приложения для работы с сборщиком Демо-версия приложения для работы с сборщиком

Как это работает

В целом работоспособность логика приложения была сделана таким образом. Сервер > Коллекция > Воркшоп контейнер > Локальные контейнеры (сами модели, текстуры). Схема немного замудренная, в ней и разобраться на этапе проектирования было сложно.

Схема Схема

  • Сервер - это сервер, к которому принадлежит коллекция. Предполагалось, что коллекция будет иметь определенное напраление, к примеру - коллекция с оружием, коллекция с одеждой, коллекция с приватками и т.д.
  • Коллекция - это набор воркшоп контейнеров, которые в свою очередь содержат в себе локальные контейнеры. Сама коллекция принадлежит только одному серверу, и она имеет прямую связь с коллекциями в стиме. Создание коллекций было автоматическим, связь была по ID коллекции в стиме, взаимодействие с ним было через Puppeteer.
  • Воркшоп контейнер - это набор локальных контейнеров, которые в свою очередь содержат в себе модели и текстуры. Изначально была идея сделать контейнеры связанными с множеством коллекций, но в итоге было решено, что это будет не очень удобно. Воркшоп контейнеры тоже создавались автоматически, связь была по ID воркшоп контейнера в стиме, а взаимодействие происходило через gma, который в свою очередь был упакован через gmad_linux и загружался или обновлялся через gmpublish. Если контейнер был новый, то создавалась связь через puppeteer с родительской коллекцией.
  • Локальный контейнер - это виртуальная сущность, к которой были привязаны файлы. Это больше сущность, которая позволяла легко и быстро чистить воркшоп контейнеры. Да, локальный контейнер мог быть связан с несколькими воркшоп контейнерами. При подготовке файлов к загрузке все файлы вгружаются во временную папку и если есть materials или sound, то оригиналы из папок переносятся в новый невидимый для админа воркшоп контейнер, а из временной папки все файлы из этих папок сжимаются. Таким образом образуя одновременно на выходе две коллекции - HD и SD, высокого и низкого разрешения соответственно.

По поводу локального контейнера стоит подробнее рассказать, так как штука действительно заслуживает большего внимания, чем все остальное. На сервер мы загружали не .gma, а .zip архив с тем же содержанием. Из архива ZIP удалялись все файлы *.lua, папка models чистилась от файлов dx9 и другого мусора, а с текстурами проводилась отдельная работа - нюанс в том, что я решил ограничиться для оригинала текстур vtf до 1024 пикселей, а для сжатой версии 256. Однако в один момент вскрылась неожиданная проблема - vtf это еще и анимированные текстуры, и пришлось изучать каким образом я могу переконвертировать анимацию в 1024x1024 и 256x256. Я далеко не специалист по C++, пришлось изрядно изнасиловать мозг, чтобы получить рабочий скрипт. Мне помогли библиотеки VTFLib и Magick++, которые позволили мне конвертировать vtf в png, а затем уже png в vtf. Тоже самое происходило с папкой sound, благо формат wav и с ним легко работать.

После того, как все файлы были готовы к загрузке, они отправлялись во временную папку, а затем уже в воркшоп. Все это происходило через gmad_linux и gmpublish. После загрузки воркшоп контейнера, админ вручную перезагружает сервер через веб-панель, либо сервер сам перезагрузится, когда игроков не будет.

Что не так

В целом сборщик работал, но было несколько проблем, которые не давали ему работать на 100%.

  1. Очевидно, что стабильность зависит от работоспособности серверов стима. Если сервера стима не работают, то и сборщик не работает.
  2. На тот момент у меня не было опыта в работе с Puppeteer, поэтому я не мог быть уверен в том, что он будет работать стабильно.
  3. Не было никакой защиты от дурака. Если администратор не знает что делает, то он может легко сломать сервер. Например, если он загрузит воркшоп контейнер с моделями, которые уже есть на сервере, то он просто перезапишет их, а если он загрузит воркшоп контейнер с моделями, которые уже есть на сервере, но с другими текстурами, то он просто сломает контейнеры. Единственный кто успел потестить сборщик - это Женя, и он был в курсе всех этих нюансов. Но в целом, если бы я продолжил работу над проектом, то я бы добавил защиту от дурака, Женя тоже не вечный.
  4. По какой-то причине gmad_linux не мог работать с файлами, которые в названии содержали КАПС, а gmpublish ругался на это. Такие файлы просто не загружались. Я не знаю, как это исправить, но это было очень странно - редактировались такие файлы вручную.

Что дальше

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