Рубрика: Создание модов

Парочка вступительных слов

Как известно, Skylines не балует игроков разнообразием и качеством архитектуры. Если вас (так же, как и меня) расстраивает сей факт, и вы хотите привнести в игру нечто своё, данное руководство может подсказать вам, как сделать это правильно.
Покопавшись несколько дней в 3ds MAX и почитав разрозненные туториалы на просторах инета, я выработал собственный путь добавления моделей в игру, который ни в коем случае не претендует на звание "единственно верного". Для меня главным было то, что он РАБОТАЕТ . Итак, погнали...

Выдержки из спецификации

Прежде чем приступить к созданию своего творения в 3ds MAX, предлагаю ознакомиться с некоторыми требованиями, которые предъявляют разработчики игры к пользовательским моделям.
1. Одна системная единица используемого ПО должна быть равна 1 метру (мы настроим 3ds MAX соответствующим образом в следующем разделе).
2. Одна клетка игрового поля равна 8 метрам, из чего следует, что если вы создаёте, к примеру, жилое здание, - его площадь не должна превышать 32х32 метра (4х4 клетки). Для зданий городских служб допускается большая площадь - до 16х8 клеток (128х64 м).
3. Разработчики требуют, чтобы модель представляла собой один объект без какой-либо иерархии, и содержала всего лишь один материал.
4. Размер модели не должен превышать 65 000 вершин (vertex в 3ds MAX).
5. Размер карты текстур не должен превышать 2048x2048 пикселей, но для базовых зданий лучше всего использовать разрешение 1024х1024 (или меньше).
6. Материал модели в игре распознаёт 6 видов карт текстур (одинакового разрешения и формата *jpg), каждая из которых должна иметь такое же название, как и сам файл *FBX вашей модели. но с припиской нижнего подчёркивания и определённой буквы:
"_d" - основная карта текстур (3хканальное изображение со схемой RGB);
"_a" - карта прозрачности (1канальная маска);
"_c" - карта вариативности цвета (1канальная маска);
"_i" - карта самосвечения (1канальная маска);
"_n" - карта нормалей (3хканальное изображение со схемой RGB);
"_s" - карта отражений (1канальная маска).

Разумеется, создавать все 6 вариантов карт текстур для каждого объекта необязательно. Можно обойтись даже одной основной картой. Лично я использую помимо неё, карту самосвечения (позволяет создавать свет в окошках в ночное время) и карту отражений (для создания реалистичных стёкол). Такие карты представляют собой одноканальный вариант основной карты, в котором чем светлее область, тем, соответственно, выше значение параметра. Исключение составляет лишь карта самосвечения, для которой числовые значения таковы:
0 - нет свечения;
120 - полное свечение;
128-255 - случайные значения для свечения окон;
192 - нейтральное значение свечения.

Подготовка модели в 3ds MAX

Перед тем, как приступить к рисованию своего объекта в 3ds MAX, выставляем настройки метрики. Для этого идём в меню "Customize" - "Units Setup..." и выставляем в 2х окошках следующие параметры:

Затем можно настроить вид сетки для удобства использования программы. Кликаем правой кнопкой мыши по кнопке "Snaps Toggle" верхнего меню и переходим во вкладку "Home Grid", где лично я выставляю вот такие числа:
Тем самым мы задали шаг сетки в 1 м. Обратите внимание, что в поле "Perspective View Grid Extent" удобнее всего выставлять именно то количество метров, которое соответствует размеру будущего участка в игре (например, для игрового участка размером 4х4 клетки логично выставить значение 16, для участка 3х3 - 12 и т.д.). Это даст вам возможность более наглядно представить масштаб будущего строения.

Для контроля за количеством вершин (помним о лимите в 65 000) идём в меню "Views" - "Viewport Configuration" - вкладка "Statistics", где выставляем галочку напротив "Vertex Count", - теперь это значение выведено в левый верхний угол окна рендера.

После того, как вы создали желаемый объект (и наложили на него текстуры с использованием модификатора Unwrap UVW), он, скорее всего, будет представлять собой набор из множества различных полигонов и фигур. Чтобы объединить всё это месиво в 1 объект (напомню, игра "видит" лишь 1 объект и 1 материал), выделяем все компоненты в списке слева, вызываем контекстное меню на объекте и выбираем "Convert to Editable Poly":

После чего кликаем по любому полигону и в меню справа вызываем "Attach List":

В появившемся списке выделяем все объекты и жмём "Attach":

Подтверждаем:

Теперь осталось экспортировать полученный объект в *FBX формат (в открывшемся окне экспорта можно применить настройки по умолчанию):

И последнее, перемещаем полученный файл и файл текстуры в папку: C:\Users\<Имя пользователя>\AppData\Local\Colossal Order\Cities_Skylines\Addons\Import. Обязательно даём файлу текстуры такое же название, как у файла *FBХ, и приписываем в конце "_d":

Теперь можно смело заходить в игровой редактор и смотреть, что получилось. При выборе вашей модели в редакторе выставляем ей масштаб 100, активируем "Центральную нижнюю точку вращения" и крутим объект необходимое количество раз по разным осям, пока он не встанет так как нам нужно.

Заключение

Как видите, никаких манипуляций с началом координат и вращением вашей модели (о чём я читал не в одном туториале) в 3ds MAX производить не нужно. Всё гораздо проще, чем кажется на первый взгляд))

Всем привет с вами Naikoraptor.

Сегодня мы поговорим о

  • Создании своей технологии
  • Системе migrations
  • О слоях игры (Collision)

(я специально затягиваю и откладываю entities на потом, ибо свои постройки имеют столько свойств что я боюсь что-либо попросту забыть, под них я выделю отдельный урок)

И так начнем:

Создании своей технологии

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

вот вам коды из API .

  • reload() — Эта функция позволяет перезагрузить изученную технологию на картах, полезно если вы внесли правки, а новую карту вам создавать не хочется.
  • forse = LuaForse — Какая сила применяет эту технологию (Игрок, строение, поротивник) эту строку пропускаем всегда, пока еще никто не нашел ей применения, да и впрочем бесполезна она, но любезный разработчик на всякий случай дал нам её.
  • name = string — Имя технологии
  • localised_name = string — Локализованное имя (Но ведь мы помним, что мы все делаем через locale.cfg?)
  • enabled = bool — Строки блокировки на подобие строки в рецептах, в принципе ей не пользуются. Разве что разблокировать через скрипт
  • upgrade = bool — Является указание на то, улучшение это или нет
  • prerequisites = dictionary string → LuaTechnology — Таблица технологий которые должны быть исследованы чтобы эта технология стала доступной для исследования
  • research_unit_count = uint — Какие и сколько баночек на 1 исследование
  • research_unit_energy = double — Сколько времени на 1 исследование.
  • order = string строка сортировки технологий

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

Для начала нужно «заблокирвоать» все наши рецепты у бочек, тоесть каждому рецепту добавляем строку: enabled = false либо enabled = "false" разницы никакой.

После этого создаем файл Tehnology.lua

В нем прописываем data:extend({ })

Технологии как и все остальное прописываются в отдельных { },{ }, { }.

Type = "technology", name = "Bochka", icon = "__base__/graphics/icons/fluid/empty-crude-oil-barrel.png", --[[ картинка технологии, и хоть в api про них ничего не сказано, но в игре их обязательно нужно указывать ]] icon_size = 32, --[[ НЕ обязательно, но если картинку обрезает, указываем её размер (картинка всегда квадрат) ]] effects = --[[Что будет делать Технология после исследования]] { { type = "unlock-recipe", recipe = "empty-barrel-M" }, { type = "unlock-recipe", recipe = "fill-barrel" }, { type = "unlock-recipe", recipe = "empty-barrel" }, }, prerequisites = {}, unit = { count = 35, --Количество исследований ingredients = { {"science-pack-1", 1} --[[ ресурс и количество, кстати чтобы не было ошибок я вам напомню что есть: science-pack-1, science-pack-2,science-pack-3, alien-science-pack]] }, time = 30 -- время одного исследования }

И заходим в игру.

Технология работает, рецепты за ранее не доступны.

Migrations

По другому этот раздел можно назвать: «Обновления мода».

Ведь с первого раза не возможно сделать так, как хочется в итоге, верно? Поэтому часто может получаться так, что рецепты предметов будут меняться. Но как быть с теми картами где рецепты уже исследованы? Ведь там они останутся прежними хоть ты тресни (Игра исследованные технологии и рецепты сохраняет отдельно, для упрощения загрузки и экономии памяти).

Рассмотрим вполне реальную ситуацию: Когда мы поняли что баланс нарушен.

Допустим крафтить бочку для воды из 10 железа это дорого. Поэтому мы меняем в её рецепте на 9. Но зайдя на нашу карту на которой мы играем уже несколько Зилионов или бромилионов часов мы обнаруживаем что бочка все так-же крафтится из 10 железа. Мы думаем может мы что-то не так увидели, и открываем список технологий. Но там тоже указано то рецепт будет давать из 10 листов. Что-же нам делать?

Создаем в корне мода папку migrations.

Там создаем файл с «именем новой версии мода»

К примеру у меня сейчас он называется MyMod_0.1.1 Значит я создаю в папке файл MyMod_0.1.2.lua

Этот файл подключать не нужно!

Этот файл активируется тогда, и только тогда когда вы заходите на карту старой версии. Он Переписывает Эту карту под версию нашего мода и активирует файл.

Чаще всего в нем будем прописывать вот это:

For i, player in ipairs(game.players) do player.force.reset_technologies() player.force.reset_recipes() end

Это обновляет все рецепты и все технологии.

Теперь заходим в info.json и там меняем с 0.1.1 на 0.1.2 и переименовываем папку мода таким же образом

Готово! Мод обновлен!

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

Слои игры (Collision)

Вся игра хоть и выглядит единой, на самом деле она разбита на контактирующие слои.

Например Слой воды и слой Строений. Ведь ни одно здание не может быть поставлено на воду верно?

Вот список слоев:

  • "ground-tile" - Слой перемещения персонажа (1-й слой)
  • "water-tile" - Слой не доступный ля перемещения персонажа (0-й слой)
  • "resource-layer" - Слой Руд (3-й слой)
  • "floor-layer" - Слой Бетона либо кирпичей (2-й слой)
  • "object-layer" - Слой объектов (Высший 4-тый слой)
  • "player-layer" - Слой персонажа (Высший 4-тый слой)

Заметили что 2 слоя находятся на 1-м уровне? Слой персонажа не используется ничем кроме персонажа, Хотя он и эквивалентен слоям объектов.

Все это хотя и не особо важно, но дает простор для создания интересных штук для некоторых. Например когда я баловался с этими параметрами я создал нечто вроде Блоков «моста» которые ставяться на воду, но позволяют ставить поверх них что угодно. Или напрмиер я создал » рыбную ферму» которая ставиться только на воду.

Строки слоев есть у всех объектов и поверхностей (entities и tiles) Но думаю это уж желающие сами найдут

Привет опять, и сразу к сути, сегодня мы поговорим про:

  • Создание своего рецепта
  • Систематизацию предметов внутри игры и свои группы
  • Локализация игры

И в качестве бонуса (Решил опередить время ради одного человека, что написал в вк) :

Создание своего рецепта

Начну пожалуй с интересной особенности фактории. Помните в инвентаре персонажа список крафтов? Этот список имеет спецефическую особенность: «Указывать Рецепты по ссылке на предмет».

Не понятно? (А я уверен что не понятно).

Давайте объясню на примере нашей бочки. Пока у неё нет рецепта, она не видна в списке, Однако если мы откроем список предметов (например в сундуке запроса), то там она будет.

Но как только мы добавим нашей бочке хотя-бы 1 рецепт её получения, то она сразу же появится в списке в инвентаре (За исключением пары моментов, про них я расскажу чуть позднее).

Теперь перейдем к структуре рецептов, прописываются они так-же как и итемы, то есть в data:extend({ }) и в отдельных { }, { }

Начинается рецепт с

  • name = string — Имя рецепта (Лучше создавать имя рецепта идентичное с именем предмета,так проще)
  • category = string — Категории рецептов. Есть некоторые категории которые ограничивают возможность доступа машин или игрока к крафтам (это может быть категория «smelting» , которая разрешает обработку предмета в печи, но запрещает его сборку, либо «oil-processing» которая разрешает крафт только в Нефте-перерабатывающем заводе, остальные стандартные категории можно найти в самих рецептах в base, либо создать их самому но об этом в другой раз)
  • energy_required = float — Время в секундах, необходимое для крафта (если пропустить сроку то автоматически будет указано 0,5)
  • ingredients = array of ingredients — Указать ингредиенты можно 2-мя способами, кратким и полным.

При кратком способе достаточно указать список предметов и их количество. Например

Ingredients = { {"iron_plate",5}, {"wood",10} } --Тоесть тут мы требуем 5 Железа и 10 дерева на крафт.

Однако при кратком способе нельзя указывать жидкости (к тому-же для этого нужна специальная категория)

Полный способ требует еще объявление типа ингредиента, то есть наша запись из прошлого примера будет выглядеть так:

Ingredients = { {type="item", name="iron_plate", amount=5}, {type="item", name="wood", amount=10} },

  • enabled = bool — Если эту строку не указывать, то рецепт будет доступен всем и сразу, если указать false ,то тогда потребуется его разблокировать (например исследование либо скрипт).
  • result = string — Указывает результат после крафта (пример result = "iron_chest")
  • result_count = int — указывает сколько итемов получится после крафта

Следующие строки работают как на итемы так и на рецепты, но о том зачем рецептам картинки я расскажу позже.

  • icon = string
  • group = string
  • subgroup = string
  • order = string

Теперь перейдем к специальным строкам которые доступны только для жидкостных крафтов:

Строки result и result_count заменяются единой строкой схожей с полной записью ингредиентов,

Results= { {type="fluid", name="heavy-oil", amount=3}, {type="fluid", name="light-oil", amount=3}, {type="fluid", name="petroleum-gas", amount=4} },

А теперь я поделюсь с вами одной фишкой: Если вы хотите делать несколько предметов но устройство позволяет вам делать только 1 на выходе, то можете делать его через категорию oil-procesing, но в ингредиенты и в выход указывать предметы не являющиеся жидкими.

А теперь давайте все проверим на практике:

Помните нашу бочку? Все что мы успели, так это создать её, но по
идее она должна переносить воду в более удобное место. Делать это мы будем так-же, как и разработчики поступали с бочками нефти (2 предмета и 2 крафта).

По этому Быстренько переходим в наш мод и создаем там вторую бочку (к примеру с капелькой на иконке)

Теперь В папке с бочкой создадим файл recipes.lua (Хотя при желании вы можете прям тут прописывать рецепты, как и итемы, но лучше все держать раздельным, это упросит вам ориентирование в моде)

Для начала создадим рецепт самой бочке. Не будем выдумывать велосипедов и укажем ей просто 10 железных листов

Data:extend({ { type = "recipe", name = "empty-barrel-M", ingredients ={{"iron-plate",10}}, result="WaterB", --[[ Вобщето я советал вам создавать предмет и рецепт с одинаковым именем, но кто я такой, что-бы свои советы слушать?]] }, })

Кстати после появления рецепта наша бочка появилась в списке

Теперь дадим Бочке возможность брать в себя воду и отдавать назад, добавив 2 рецепта:

{ type = "recipe", name = "fill-barrel", category = "crafting-with-fluid", subgroup = "barrel", order = "b", ingredients = { {type="fluid", name="water", amount=30}, {type="item", name="WaterB", amount=1}, }, results= { {type="item", name="WaterBF", amount=1} } }, { type = "recipe", name = "empty-barrel", category = "crafting-with-fluid", subgroup = "barrel", order = "c", icon = "__base__/graphics/icons/fluid/empty-crude-oil-barrel.png", ingredients = { {type="item", name="WaterBF", amount=1} }, results= { {type="fluid", name=water", amount=30}, {type="item", name="WaterB", amount=1} } },

Заходим в игру и проверяем

Систематизация (Order, Group, Subgroup)

Чтобы проще представить о чем идет речь, вспомните сетку крафтов, Именно там отмечаются все предметы и их рецепты. Теперь давайте разберемся что и как работает.

У рецептов и предметов есть 3 строки систематизации, Это group, subgroup, order.

Теперь конкретика:

group отвечает за то в какой вкладке находится итем\рецепт.

subgroup говорит в какой строке будет находиться предмет

order отвечает какой он будет по порядку.

Удобно то что group никто и никогда не использует, так как subgroup уже содержится в некоторой группе (Формально subgroup решает не номер строки а просто подгруппу, но на деле выходит просто разбиение на строки), сортировка выполняется по алфавиту — то есть с начало будет стоять предметы с order’ом » a » потом «aa» потом например «ab» потом «b», и даже если буква пропущена, то ничего страшного, он просто поставит их по алфавиту из возможных.

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

Именно этим сейчас и займемся:

Создаем файл group.lua

Пишем data:extend ({ })

И сразу запоминаем: type = "item-group" и type = "item-subgroup"

Первый создаст вкладку, второй строку.

Давайте начнем с Группы:

{ type = "item-group", name = "MyModItems", --Название для кода icon = "__base__/graphics/icons/big-biter.png", -- Картинка (можете свою сделать) inventory_order = "a", -- Сортировка в инвентаре (Будут первыми так как А первая буква:] order = "d", -- номер вкладки (4-тая) },

И теперь под группа:

{ type = "item-subgroup", name = "MyModItems-resourses", -- Имя для кода group = "MyModItems", -- номер вкладки order = "c", -- номер строки (3-тья) },

Теперь давайте поменяем сортировку в наших бочках

в саб группу рецептов и предметов вписываем

MyModItems-resourses

а в Ордер его порядок (там уж сами как удобнее)

И конечно проверяем в игре (не забудьте подключить этот файл)

Локализация игры

Теперь осталось только добавить языков и наш мод фактически будет считаться готовым (хоть и добавляет он всего 1 бочку для переноса воды, но ведь это тоже мод)

Переходим в корневую папку Мода и Добавляем там папку locale

В ней создаем папку языка: для русского — ru , для английского — en , более подробно можете посмотреть в папке игры, там много вариантов. В папке создаем locale.cfg

и открываем его нашим ноутпадом.

ВАЖНО: этот файл не нужно подключать, потому-что как мы помним, папка языков зарезервирована под именем locale .

сам же перевод интуитивно понятен, я просто покажу как мы переименуем наши бочки:

в фаил locale.cfg пишем:

WaterB=Бочка для воды WaterBF=Заполненая бочка для воды empty-barrel-M=Бочка для воды fill-barrel=Заполнить бочку empty-barrel=Опустошить бочку

До «=» пишется название в коде

После «=» перевод.

ВАЖНО: не ставьте пробелов до и после равно (вообще лучше без лишних пробелов) игра считывает их как символы и на выходе вы получаете пустые иконки предметов, вместо любого текста.

ТОЖЕ ВАЖНО: в ноутпаде есть кнопка смены кодировки, всегда устанавливайте 8-ми битную кодировку в UTF-8 без BOM

Более подробно название категорий можно найти в base.

А, вот еще фича:

WaterBF=На моем рисунке - Капля!!!

Таким образом можно делать подпись для Предметов\рецептов и прочего.

БОНУСНАЯ СЕКЦИЯ

По поводу смены Файлов других модов или базовой игры. Это осуществляется через одну специальную луа команду, я не буду вдоватся в детали так как это и так секция по просьбам (Аля для продвинутых)

Создаем любой Lua фаqл (я предпочитаю changes.lua )

туда вписываем без всяких скобок

data.raw["string"]["string"].параметр =

В первые скобки вносим type объекта, во второй его имя в коде, в паремтр строку которую хотим изменить, и собственно её новое значение.

data.raw["ammo"]["flame-thrower-ammo"].magazine_size = 500 Эта строка сделает Обьем магазина для огнемета равным 500 едениц. Или например нам нужно чтобы огнемет лежал в нашей вкладке мода. Тогда делаем так

Data.raw["ammo"]["flame-thrower-ammo"].subgroup = data.raw["ammo"]["flame-thrower-ammo"].order =

Теперь по поводу того как можно отключать вообще Итемы.

Если этот итем изначален (например пистолет)

data.raw["gun"]["pistol"].enabled = false Так как нет ни одной технологии которая его разблокирует, то его не станет.

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

На сегодня все

Всем привет еще раз. Сегодня хотелось бы рассказать о базовом устройстве мода и о создании простейших предметов. Этот урок будет вступительным и некоторые сложные моменты будут описаны вкратце (в последующем мы рассмотрим их поподробнее).

Если точнее, то мы рассмотрим:

  • Общую архитектуру модов
  • Сортировку файлов в моде
  • Подключение файлов
  • Создание простейшего предмета

Общая архитектура модов

Для начала перейдем в папку mods в корневом каталоге игры. Именно тут будут содержаться все моды.

Помимо модов там же лежит файл mod-list.json — этот файл отвечает за то, какие моды включены на данный момент, через него также можно выбрать, какие моды будут включены или выключены (без необходимого входа и перезахода в игру).


Сами моды могут содержаться как в папках, так и в архивах (первое — удобнее для редактирования, второе — для распространения).

Важно то, что архив или папка мода должна иметь имя составленное из имени мода, подчеркивания, и версии мода. Это корневая папка мода.

Пример: MyMod_0.1.4

Версия мода всегда записывается как 3 числа через точки. Разработчики объясняют это так:

Первое Крупные обновления, Кардинальные изменения.

Второе — мелкие обновы, добавление пары предметов,

Третье — багфиксы

Теперь перейдем к архитектуре самого мода:

Существуют «зарезервированные» и «свободные» файлы и имена, а также единственный обязательный файл.

Давайте, наверное, сразу создадим его, и не будем к этому возвращаться:

создаем папку нашего мода, а в ней создаем файл «info.json» .

Этот файл — лицо мода. Он отвечает за его отображение в списке модов в игре.

В файле прописываем операторные скобки { } .

Внутри пишем названия строк (на картинке указаны обязательные) и их значения в кавычках. Не забываем, что название папки соответствует версии и названию мода.



Вы можете добавить и свои строки, но не забываем: «краткость — сестра таланта».

Теперь можно разобраться со «свободными» и «зарезервированными» именами.

Существует несколько специальных папок, которые игра будет воспринимать по своему, и, если там будут не те файлы, вы получите ошибку.

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

Дабы этого не случилось, вот вам список всех зарезервированных имен для корневой папки мода:

  • campaigns
  • locale
  • Scenarios
  • migration

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

Сортировка файлов в моде

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

Метод разработчиков

:

В оригинальной игре все предметы, рецепты, и файлы содержаться в папке Prototypes . Графика — в папке Graphics . Звуки — в Sounds . Тем самым разработчики разбивают все файлы по типу.

Внутри папок же они проводят разбиение по подтипу: например, в Prototypes идет рабиение на папки Recipes , Entity , Items , Technologies . Это гарантирует вам быстрое нахождение предмета в папках, но, если у вас будет много всего, будет довольно трудно найти конкретный предмет.

Метод Naikoraptor’a (что ник нечитаемый, что текст до правок …) (re: это читается как: Найко раптор) (Нарко Йаптор?..)

Мне кажется, что при создании предмета все его компоненты проще держать рядом, поэтому я создаю папку всех «объектов», а в ней под папки для каждого «явления»

Например, в папке Prototypes лежит папка Carbon , в ней лежат файлы: Item.lua , recipe.lua , technology.lua , Carbon.png , Carbon_Tech.png .

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

Подключение файлов.

Первым делом в корне нашего мода создадим файл data.lua

.

Этот файл будет автоматически запускаться при включении мода.

Любые другие файлы lua будут игнорироваться.

Давайте, для примера, создадим в нашем моде папку Items а в ней создадим Items.lua .

Теперь открываем вновь наш корневой файл data.lua и запоминаем новую команду:

Команда прописываеться в начале файла.

Внутри скобок указывается путь к подключаемому lua файлу в кавычках, (!!!)который начинается из корня мода.

Названия папок пишутся с учетом регистра и разделяются точками. Сам файл пишется без расширения «.lua» .

Файлы можно подключать где угодно (то есть я могу создавать технологию, а в ней подключить список рецептов, и т.д.).

Таким образом осуществляется подключение всех файлов lua (звуки и графику рассмотрим позже).

Теперь немного от себя: как это можно выгодно использовать?

Помните, я советовал вам объеденять файлы в некоторые объекты и делать сортировку по принадлежности к тому или иному предмету? Так вот, именно тут это очень пригодится.

В каждой папке предмета(тот же « Carbon» из примера) создаем data.lua , а в ней подключаем все компоненты.

А в главном файле подключаем именно этот data.lua файл. Таким образом, объект со своим рецептом будет представлен одним единственным файлом, который можно легко включить или выключить при желании

.

Создание своего предмета

И вот, мы плавно перешли к тому, чтобы создавать уже нечто свое.

Самое главное в создании мода — это идея. Если вы не знаете что делаете — результат будет ущербным. Вам нужна задумка (желательно оригинальная) чтобы что-то написать.

Для примера, я создам бочки полные воды (по аналогии с бочками нефти). Зачем? А помните, при создании карты можно указать чтобы вода была только в центре карты? А вдруг, нам понадобится вода на нашей «станции» за три-девять земель, и, тянуть туда трубу — не выгодно, а возить поездом — самое то.

Создадим папку отведенную под этот объект (да, я буду использовать свою сортировку, но вы можете делать как считаете нужным), там создаем data.lua и item.lua

Окрываем Фаил item.lua и прописываем туда: data:extend({ })

Внутри таких двойных скобок будет идти перечисление всех объектов. Тем самым мы описываем их базовые свойства.

Каждый объект внутри «data:extend» прописывается в своих собственных скобках { }, { }, { } .

И не забывайте ставить запятые между скобками, иначе вас ждет ошибка.

Сейчас я дам вам список и описание ВСЕХ возможных строк предмета, а после — пример создания нашей «бочки».

  • type = string — Эта строка сообщает игре что перед ней предмет (другие типы будем изучать по мере выхода гайдов, тут сразу не раскажешь).
  • icon = string — Указывает путь к картинке файла (и к файлу картинки. ага) .
  • name = string — Задает этому предмету имя ВНТУРИ МОДА , а не в самой игре. Имено по этому имени мы будем сообщать другим частям кода что мы хотим, но чтобы не запутаться пишите так, как оно есть (только латиницей).
  • localised_name = string — Дает локализованое имя предмету (его видно в игре). Но мы не будем никогда использовать эту строку потому, что есть простой и правильный способ локализации (об этом в след. раз).
  • stack_size = uint — Наверняка, некоторое испугались типа «Uint» ? Не пугайтесь, это просто длинный 32-bit unsigned integer (32-битный беззнаковый целочисленный тип. числа в пределах от 0 до 4 294 967 295. неплохо, да?) . Данный параметр отвечает за размер стака.
  • fuel_value = float — Если вы укажете эту строку, то сообщите игре что этот обьект — топливо, и его нужно совать в слот для топлива (в печи тоже). Здесь можно указывать сколько объект дает энергии при сжигании. Например, уголь дает 4.0, а твердое топливо — 25.0 Можно писать и дробью. (float — знаковое число с плавающей точкой. минусовое значение — бессмысленно, а число может изменяться в пределах 1.40129846432481707e-45 .. 3.40282346638528860e+38) .
  • order = string — Строка, указывающая в каком порядке сортировать предметы. Об этом в следующем гайде. Пока ставьте «aaa» (латиница).
  • group = string — Строка сортировки по группе. Также оставим на потом (не заполняйте её).
  • subgroup = string — Строка сортировке по полосе. И её оставим на потом (указывайте raw-material )
  • place_result = string — Это указание на то, что будет, если поставить объект на землю. О постройках мы также будем говорить.
  • speed = float — Указывает на скорость предмета, если это оружие или инструмент.
  • magazine_size = float — Указывает количество патронов в обойме, если это оружие.
  • resistance = Resistance — Еще один «волшебный» тип данных. О нем также позже. Эта строка отвечает за сопротивления брони к урону, если предмет — броня.
  • item_to_clear = LuaItemPrototype — Эта строка указывает необходимый ресурс, с помощью которого можно отчистить Чертеж от содержимого.
  • stackable = bool — Если стоит false, то это запрещает предмету стакаться. Однако, проще это делать указывая stack_size = 1 .
  • module_effects — Эта строка вовсе не имеет типа. Она отвечает за эффекты если создаваемый предмет — модуль эффектов.
  • flags = string — самая интересная строка. Наделяет предмет свойствами(флагами). Об этом, как и практически о бо всем, я раскажу, но не сейчас.

А теперь создадим нашу бочку:

Data:extend({ { type = "item", name = "WaterB", icon = "__MyMod__/Prototypes/WaterT/empty-barrel.png", flags = { "goes-to-main-inventory" }, subgroup = "raw-material", order = "aaa", stack_size= 10, }, })

Теперь расскажу вам о двух пропущенных вещах: флаги и картинка.

Для создания простого предмета нужно всего 1 из 2 флагов: «goes-to-main-inventory» или «goes-to-quickbar» .

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

Теперь по поводу картинок: картинка должна иметь формат png и размер 32×32 . Иначе игра выдаст ошибку. Если вам лень придумывать и рисовать картинку (или если не умеете рисовать) — вы можете подключить уже готовую из игры.

Идем в папку base , и там в графике в иконках ищем нашу бочку.

вот вам на всякий случай её путь: __base__/graphics/icons/fluid/empty-barrel.png

Копируем себе такую в папку с файлом (можете подрисовать туда что-либо) и прописываем вот так icon = "__MyMod__/Prototypes/WaterT/empty-barrel.png",

Расскажу поподробнее про то, как подключать картинки:

сначала указываем имя мода с двойным подчеркиванием: _ _ Имя мода _ _ (без пробелов, можно подключать и базовую игру и чужие моды 😉),

после, через «/» указываются названия папок, а после и сам файл с раширением.

Теперь подключаем наш итем в data.lua и заходим в игру (проверяем на ошибки). Если их нет и игра запустилась, то все «ок». Однако, предмет пока что мы сможем видеть только, например, в сундуке запроса, так как он не имеет рецепта.

Ну, вот и все. Мы создали наш первый предмет (и, хотя он не имеет рецепта, его можно найти в списке предметов). О том, как добавлять рецепты раскажу в след раз, иначе будет слишком много информации (и слишком много придётся кому-то редактировать текста… 😥) .

Всем привет с вами Naikoraptor, и это первый Урок по созданию своего мода.

Этот урок будет посвящен ПОДГОТОВКЕ к созданию мода. Тут, пока-что, не будет ни сногсшибательных секретов, ни чего либо, что может оказаться в игре, однако, это именно та часть, которая решит, будете ли вы обливаться потом, создавая очередной однотипный предмет, либо, приятно попивая чаек под музычку, клепать очередное произведение искусства.

(и да, в названии не ошибка, это действительно Минус первая часть)

Итак, начнем:

Шаг первый «Подготовка рабочего места»

Уберите со стола все ненужные предметы, и налейте себе кружку элитного чая.

Как мы знаем фактория при установке создает 2 папки. Одна — это «Движок» и Базовая игра, а вторая — это «Библиотеки». Библиотеки — это папки с Сохранениями, Модами, Конфигами, и Записями ошибок, Именно в папке модов мы будем Т ВО Р И Т Ь.

Если точнее, то движок находиться в папке data в корне игры. Там есть 2 подпапки:


Base (файлы игры)

Core (Движок,ядро,система)

А это Библиотеки

Первое, что нам нужно сделать, — это создать «ярлык» на рабочем столе на папку Mods

Существует 2 возможных её расположения. В zip-версии папка Mods (впрочем, как и всё остальное) находится в папке с самой игрой.

Если же папки Mods нет в папке с игрой, то копируем любой ярлык на рабочем столе и в копии пишем в оба поля %appdata%\factorio

Либо идем по этому пути и создаем ярлык

Мой компьютер >> C\ >> Пользователи >> Имя вашего пользователя >> AppData >> Roaming >> Factorio

Теперь переходим в папку самой игры и находим «Base», и кидаем туда Копию ярлыка Библиотек, А в Библиотеки кидаем Ярлык на Base. Тем самым даем себе двух сторонний коридор, Нам придется много бегать туда и обратно, так сделаем это приятнее.

Теперь перейдем к Софту

Шаг Второй: Софт

И прямые руки

Теперь проведем некоторую манипуляцию. Создайте на рабочем столе Любой txt файл. Задайте ему имя как *НаборБукв*.lua (Пример: jdjdfvdugfwuhvhf.lua)

Теперь нажмите лкм, и выберите свойства. Установите notepad++ как приложение для просмотра

Вам нужно установить стандартную Программу как Notepad++. Иначе каждый раз открывать файлы Lua через «ЛКМ —> Открыть с помощью Notepad++» сильно задалбывает

Кстати файл можете удалить, нам нужно было только программу сменить

Пожалуй, на этом подготовка рабочего места закончена.


Скачать учебник "S.T.A.L.K.E.R. - Создание модов" для игры Сталкер

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

Вступление:
Как вы наверно заметили, в папке с игрой содержатся несколько файлов типа gamedata.dbN , где N – это число или буква. Это игровые архивы, в которые запакованы все файлы конфигураций, видеоролики, музыка, звуки, скрипты и прочее. Можно их править HEX-editor’ом, но лучше скачать специальную утилитку STALKER_Data_Unpacker и распаковать в отдельную папку(с именем gamedata, позже поймёте почему) их содержимое. Вот после этого можно начать разгребать весь тот мусор, который вы извлекли.

Структура файлов и папок:
Рассмотрим, что-же содержится в папке gamedata:
Папка ai – в ней содержатся файлы типа *.efd, через которые очевидно управляется искусственный интеллект тех же npc например.
Папка anims – здесь и так всё понятно, игровая анимация, а также эффекты камеры.
Папка config содержит в себе многие игровые параметры, к ней мы ещё вернёмся.
Папка levels – это игровые уровни, ака локации, на которые поделена игра (как карты в CS)
Папка meshes – игровые модели, в формате.ogf
Папка scripts – скрипты
Папка shaders – шейдеры, для двух рендеров(DX8 и 9)
Папка sounds – звуки и музыка, кот. используются в игре. Формат.ogg*
Папка spawns – отвечает за самую ужасную вещь в игре – респаун противников и др. людей, животных.
Папка textures – в ней содержаться текстуры домов, оружия, монстров и др. Формат - .dds(DirectDraw Surface Image)
Файлы:
game.graph, gamemtl.xr, lanims.xr, particles.xr, resource.h, senvironment.xr, shaders.xr, shaders_xrlc.xr, stalkergame.inf.

Введение в моддинг:
Именно с папкой config придётся работать для редактирования многих параметров игры.
Но начнём сначала:
Перед тем, как начать редактирование файлов игры, нужно в каталог Сталкера поместить ту самую папку gamedata, в которую были извлечены игровые файлы.
*Все файлы нам не понадобятся, поэтому можно оставить только папки config, scripts(а конкретно файл se_respawn*****ipt), textures, sounds, а всё остальное удалить(а можно и не удалять)
Также хочу заметить, что если распаковать все архивы.dbN в папку с игрой, то это может дать несколько дополнительных FPS.

Текстуры:
В папке textures лежат файлы формата.dds, которые можно открыть программой Adobe Photoshop с установленным DDS-плагином.
Плагин.
Скрин с корректными настройками.

Скрипты:
se_respawn.sсript – файл, отвечающий за респаун. Время респауна можно уменьшить, путём небольших изменений в этом файле. Он открывается обычным блокнотом(notepad). Ищем в нём строку
idle_time:setHMSms(0, 0, 0, math.random(self.idle_spawn_min, self.idle_spawn_max)*1000)
и меняем её на
idle_time:setHMSms(math.random(X, Y), 0, 0, math.random(self.idle_spawn_min, self.idle_spawn_max)*1000)
где X и Y - числа, задают диапазон случайной переменной в часах отвечающей за респаун.

Звуки и музыка:
Любой файл в папке sounds можно заменить на другой, но при этом нужно сохранить все параметры звукового файла, который был использован в игре. Например, чтобы заменить музыку в приёмнике у Сидоровича, нужно файл sounds\scripts\magnitofon\magnitofon_2.ogg, заменить на любой другой.(У оригинального файла винамп мне выдал свойства:
Average bitrate: 60 kbps
Nominal bitrate: 80 kbps
Channels: 1
Sampling rate: 44100 Hz.

Config/Weapons:
Параметры оружия вы можете найти в папке config\weapons, файлы типа w_ak74.ltx открываются тоже блокнотом. Разберём содержимое файла например w_groza.ltx
Во первых стоит обратить внимание на значение пременной(буду их так называть) cost, это цена оружия, т.е. сколько гроза будет стоить у продавца.
Переменная weapon_class означает, к какому классу относится оружие, в данном случае - assault_rifle.
ammo_limit – лимит боеприпасов(в игре не используется)
ammo_mag_size – размер магазина. Можно поставить например 900, тогда о перезарядке можно совсем не вспоминать.
ammo_class – класс патронов, используемых оружием. Здесь ammo_9x39_pab9, ammo_9x39_sp5, ammo_9x39_ap.
hit_power – сила оружия. Чем больше, тем лучше
silencer_hit_power - сила оружия, когда на него одет глушитель.
misfire_probability - вероятность осечки при максимальном износе.
condition_shot_dec - увеличение износа при каждом выстреле.
visual – модель оружия.
zoom_enabled - поддерживается ли оптика.

Config/Сreatures:
actor.ltx – параметры главного героя. В этой же папке находятся файлы с параметрами npc, монстров и пр.
Рассмотрим некоторые переменные на примере actor.ltx
visual – модель персонажа.
max_walk_weight - максимальный вес, при достижении которого игрок перестает двигаться.
pickup_info_radius – радиус от ГГ, в котром над предметами выводятся их названия.
camera_height_factor – высота ГГ. По умолчанию стоит 0.85, но можно увеличить рост ГГ до 0.95 например.
disp_base – разброс. Если уменьшать, то и разлёт уменьшается соответственно.
wound_incarnation_v - скорость заживления раны.
cant_sprint_power_begin - порог силы меньше которого актер не может бежать в спринте.
hit_probability_gd_novice
hit_probability_gd_stalker
hit_probability_gd_veteran
hit_probability_gd_master
Эти строчки отвечают за вероятность попадания по вам, при разных уровнях сложности. Хотите чтобы враги стреляли не очень метко, уменьшайте значения.
Также в файле присутсвуют комментарии на русском языке, так что разобраться в остальных переменных не составит труда.

Config/System.ltx:
start_blood_size - размер раны чтоб начала капать кровь.
stop_blood_size - размер раны чтоб кровь остановилась.
max_weight – вес, с которым ГГ может бежать.

Config/Misc:
В дополнение к конфигам оружия:
cвойства патронов находятся в файле weapons.ltx, а бронежилетов – в outfit.ltx.
Свойства артефактов находятся в файле artefacts.ltx и файлах zone_ART.ltx, предметов – items. ltx,
где ART – название артефакта(например zone_gravi.ltx).
Параметры артефактов:
health_restore_speed - скорость восстановления здоровья (0.0001 = +100%)
radiation_restore_speed - скорость накопления радиации (0.0004 = 4). Если поставить отрицательное число, то артефакт будет ускорять выведение радиации.

idle_particles – если закоментить её символами «--« -, то аномалия исчезнет. Чтобы отключить звуковое оповещение, то находим строку visible_by_detector и меняем on на off.

Иммунитеты:

Strike_immunity - удар.
shock_immunity - электрошок.
chemical_burn_immunity - химический ожог.
telepatic_immunity - телепатия.
radiation_immunity - радиация.
wound_immunity - разрыв.
explosion_immunity - взрыв.
fire_wound_immunity - огнестрел.

items.ltx:
Параметры предметов:
В этом файле в квадратных скобках написан тот предмет, чьи параметры идут ниже, за квадр. скобками. Например: :identity_immunities.
Параметры на примере колбасы:
class – к какому классу принадлежит предмет.
visual – модель.
cost – цена.
eat_health – сколько восстанавливает здоровья.(если будет 0, то колбаса лечить не будет.)
eat_power - сколько восстанавливает силы.
eat_radiation - сколько выводит/или добавляет радиации. (Насчёт этого не уверен, надо тестить.)
inv_weight – вес предмета.

Outfit.ltx:
Параметры костюмов:
actor_visual – модель костюма.
inv_weight – вес костюма.
cost – цена костюма.
коэффициенты иммунитета самого костюма:
burn_immunity см. коэффиц.
...
fire_wound_immunity
; NO RESISTANCE
burn_protection - коэффициент защиты от огня
strike_protection - коэффициент защиты от пуль
shock_protection - коэффициент защиты от молний
wound_protection - коэффициент защиты от кровотечений (?)
radiation_protection - коэффициент защиты от радиации
telepatic_protection - коэффициент защиты от телепатии
chemical_burn_protection - коэффициент защиты от хим. ожогов.
explosion_protection - коэффициент защиты от взрыва
fire_wound_protection - коэффициент защиты от кровотечений(от огня)
nightvision_sect – тип ночного видения(плохой/хороший). Если ПНВ нету, то строку добавить, если его нужно убрать, строку закомментируйте(--).

Торговцы:
Вещи, которые продают торговцы можно отредактировать(добавить/убрать) в файлах с именем [b]trade_YYY.ltx[.B], где [b]YYY[.B] – это имя торговца(например [b]trade_barman.ltx[.B])
Итак, поехали:
Структура файла на самом деле очень проста, под зачком; прописаны сами предметы, а после него – комментарий(чтоб понятно было). Например;Аммуниция.
В квадратные скобки заключены(), как бы сказать, "условия”. Лучше показать на примере:
В самом начале(практически) файла trade_barman.ltx идёт строка содержания , т.е. она означает, что ниже прописанные предметы торговец может купить.
Сами предметы например:
;Артефакты
af_medusa = 1, 0.3
af_cristall_flower = 1, 0.3
af_night_star = 1, 0.3
af_vyvert = 1, 0.3
af_gravi = 1, 0.3
af_gold_fish = 1, 0.3
af_blood = 1, 0.3
af_mincer_meat = 1, 0.3
или
;ADDONS
wpn_addon_scope = 0.7, 0.2
wpn_addon_scope_susat = 0.7, 0.2
Посмотрим какие ещё "условия” содержит этот файл и их значение:
- начальный ассортимент
- ассортимент, после выполнения квеста в тёмной долине
- ассортимент, после "выжигателя мозгов”
- цены по которым торговец(бармен в данн. сл.) продает в начале
- аналогично
Итак: чтобы добавить предмет к торговцу, после строки , находим интересующую нас категорию(а это может быть: ;Аммуниция/;Оружие/;Броники/;Медикаменты/;Еда и др.) и после всех прописанных в данной категории предметов добавляем ещё одну строчку для своего предмета(а именно название модели(т.к. оно совпадает с названием самого предмета) и после знака = параметры(о них чуть ниже)). Ну я так и знал что вы ничего не поймёте, поэтому пример:
Чтобы добавить бармену винтовку Гаусса, находим строки после условия -
;Оружие
wpn_pb = 3, 0.6
wpn_walther = 3, 0.6
wpn_mp5 = 3, 0.6
wpn_ak74u = 3, 0.5
и внизу прописываем wpn_gauss = N, n.n
*о значениях после знака = см. ниже.
Все имена оружия, амуниции, снаряжения и т.п. можно найти в папках gamedata\meshes\equipments,
gamedata\meshes\weapons, gamedata\meshes\food.
Заметьте, что wpn_gauss нужно писать без расширения.ogf
Значения:
После знака = у вальтера например стоит цифра 3, а после запятой – 0,6.
Первое, для гаусса у нас стоит N, это количество(в штуках) предметов. Т.е. если поставить значение 999, то у бармена будет 999 гауссов.
А второе:
1. В разделах supplies вторая цифра это вероятность появления данного предмета (от 0.1 до 1).
2. В разделе buy - первая цифра максимальная цена покупки, вторая минимальная (зависит от отношения торговца к Меченному - рейтинг, репутация)[Предположительно. – прим.]
3. Соответственно в разделах sell - первая цифра минимальная цена продажи, вторая - максимальная (точнее множитель на "истинную цену" предмета).
В итоге должно получиться:
;Оружие
wpn_pb = 3, 0.6
wpn_walther = 3, 0.6
wpn_mp5 = 3, 0.6
wpn_ak74u = 3, 0.5
wpn_gauss = 6, 1
И тогда у торговца мы получим ровно 6 винтовок Гаусса.

Создание рандомного выбора муз. заставки главного меню:
При заходе на экран главного меня муз. заставка будет выбираться случайно из добавленных вами.
1. В директорию gamedata\sounds\music\ положить два канальных ogg-файла с нужной музыкой, например: my_music_l.ogg (левый канал) и my_music_r.ogg (правый канал)
2. В текстовом редакторе открыть файл gamedata\config\ui\ui_mm_main.xml, найти в нем строку:

и заменить на:

3. В этом же файле найти строку:
music\wasteland2
и ниже нее выставить следующую строку:
music\my_music
4. Сохранить файл.
5. Если требуется вставить больше муз. заставок, то в параметре random укажите их количество.
Автор идеи - VM

NPC покупают оружие:
Чтобы обычные сталкеры и др. npc могли покупать у ГГ оружие, нужно править файл gamedata\config\misc\trade_generic.ltx. Его структура точно такая же, как и у любого другого торговца.
После строки находим строку;Оружие и после неё у каждого вида ставим зачения N и n.n.
Можно например так:
;Оружие
wpn_pm = 0.08, 0.12
wpn_pb ;NO TRADE
wpn_fort = 0.08, 0.12
wpn_hpsa = 0.08, 0.12
wpn_beretta = 0.08, 0.12
wpn_walther = 0.08, 0.12
wpn_sig220 ;NO TRADE


А чтобы у npc продавалось оружие, нужно проделать тоже самое, только после строки
Метод я проверял, вроде как работает.
Чтобы после покупки персонаж не выкидывал купленное оружие(а также чтобы подбирал его с земли), в файле gamedata\config\creatures\m_stalker.ltx строку can_select_items = off меняем на can_select_items = on
и строку use_single_item_rule = on меняем на use_single_item_rule = off .

Объекты, которые можно перемещать:
В файле system.ltx в конце есть строка , после неё идёт список перетаскиваемых вещей. Например чтобы можно было таскать монстров, в конец добавляем:
//Monsters
monsters\mutant_boar\mutant_boar
monsters\krovosos\krovosos
monsters\kontroler\kontroler
monsters\dog\dog
monsters\flesh\flesh
monsters\dog\dog_cmn_1
monsters\flesh\flesh
monsters\poltergeist\poltergeist
monsters\pseudodog\pseudodog
monsters\snork\snork
monste rs\burer\burer
monsters\chimera\chimera
monsters\cat\cat
monsters\zombi\zombi_1
monsters\rat\rat_1
monsters\tushkano\tushkano

Как сделать так, чтоб не убиралось из рук оружие в некоторых локациях?:
В файле gamedata\scripts\sr_no_weapon*****ipt найти и закомментировать (поставить перед ними --) строки
bind_stalker.hide_weapon()
bind_stalker.restore_weapon()
и в файле zone_no_weapon*****ipt ищем строки hide_weapon() и заменяем их на restore_weapon()
Способ подходит и для предыдущего файла.

Как приделать к оружию оптику, глушитель, подствольник?:
Находим в файле оружия строку;addons и пишем после(без комментарие естественно(или перед ними ставьте + значения после знака = можно менять):
;addons
scope_status = 2 0 - нет,1 - несъемный, 2 - можно ставить прицел
silencer_status = 0 0 - нет,1 - несъемный, 2 - можно ставить глушитель
grenade_launcher_status= 0 0 - нет,1 - несъемный, 2 - можно ставить подствольник
zoom_enabled = true Вкл/выкл возможность зума
scope_zoom_factor = 50 значение зума
scope_name = wpn_addon_scope название прицепляемого прицела
scope_x = 47 положение прицела на картинке, x
scope_y = 0 положение прицела на картинке, y
silencer_name = wpn_addon_silencer название глушителя
silencer_x = 218 положение глушителя на картинке, x
silencer_y = 9 положение глушителя на картинке, y
grenade_launcher_name= wpn_addon_grenade_launcher название подствольника
grenade_launcher_x = 126 положение подствольника на картинке, x
grenade_launcher_y = 24 положение подствольника на картинке, y

КАК ИЗМЕНИТЬ НОСИМЫЙ ВЕС?

В файле \gamedata\config\creatures\actor.ltx находим переменную max_item_mass – это максимальный вес при достижении которго игрок перестает двигаться
max_walk_weight - максимальный вес, до достижения которого можно передвигаться
В файле \gamedata\config\ system.ltx изменяем переменную max_weight – это вес который игрок несет не напрягаясь.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: