Шпаргалки для игры
Соотношения, пропорции, расчеты производственных цепочек
Читать полностью
Метка: гайд
I wana be a dev … часть 2
Всем привет с вами 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) Но думаю это уж желающие сами найдут
I wana be the dev… часть 1
Привет опять, и сразу к сути, сегодня мы поговорим про:
- Создание своего рецепта
- Систематизацию предметов внутри игры и свои группы
- Локализация игры
И в качестве бонуса (Решил опередить время ради одного человека, что написал в вк) :
- Как отключить элементы обычной игры либо изменить их
Создание своего рецепта
Начну пожалуй с интересной особенности фактории. Помните в инвентаре персонажа список крафтов? Этот список имеет спецефическую особенность: «Указывать Рецепты по ссылке на предмет».
Не понятно? (А я уверен что не понятно).
Давайте объясню на примере нашей бочки. Пока у неё нет рецепта, она не видна в списке, Однако если мы откроем список предметов (например в сундуке запроса), то там она будет.
Но как только мы добавим нашей бочке хотя-бы 1 рецепт её получения, то она сразу же появится в списке в инвентаре (За исключением пары моментов, про них я расскажу чуть позднее).
Теперь перейдем к структуре рецептов, прописываются они так-же как и итемы, то есть в data:extend({ })
и в отдельных { }, { }
Начинается рецепт с
type = "recipe",
А далее идут все так-же ключевые слова:
- 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 пишем:
[item-name] WaterB=Бочка для воды WaterBF=Заполненая бочка для воды [recipe-name] empty-barrel-M=Бочка для воды fill-barrel=Заполнить бочку empty-barrel=Опустошить бочку
То-есть в [скобках] прописана категория
До «=» пишется название в коде
После «=» перевод.
ВАЖНО: не ставьте пробелов до и после равно (вообще лучше без лишних пробелов) игра считывает их как символы и на выходе вы получаете пустые иконки предметов, вместо любого текста.
ТОЖЕ ВАЖНО: в ноутпаде есть кнопка смены кодировки, всегда устанавливайте 8-ми битную кодировку в UTF-8 без BOM
Более подробно название категорий можно найти в base.
А, вот еще фича:
[item-description] 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
Так как нет ни одной технологии которая его разблокирует, то его не станет.
Если же итем открывается с помощью технологии, то таким же способом лезем в технологию Меняем то что она разблокирует на все тоже самое, кроме нужного предмета, тем самым мы не дадим ему появиться.
На сегодня все
I wanna be a Dev… часть 0
Всем привет еще раз. Сегодня хотелось бы рассказать о базовом устройстве мода и о создании простейших предметов. Этот урок будет вступительным и некоторые сложные моменты будут описаны вкратце (в последующем мы рассмотрим их поподробнее).
Если точнее, то мы рассмотрим:
- Общую архитектуру модов
- Сортировку файлов в моде
- Подключение файлов
- Создание простейшего предмета
Общая архитектура модов
Для начала перейдем в папку mods в корневом каталоге игры. Именно тут будут содержаться все моды.
Помимо модов там же лежит файл mod-list.json — этот файл отвечает за то, какие моды включены на данный момент, через него также можно выбрать, какие моды будут включены или выключены (без необходимого входа и перезахода в игру).
Сами моды могут содержаться как в папках, так и в архивах (первое — удобнее для редактирования, второе — для распространения).
Важно то, что архив или папка мода должна иметь имя составленное из имени мода, подчеркивания, и версии мода. Это корневая папка мода.
Пример: MyMod_0.1.4
Версия мода всегда записывается как 3 числа через точки. Разработчики объясняют это так:
Первое — Крупные обновления, Кардинальные изменения.
Второе — мелкие обновы, добавление пары предметов,
Третье — багфиксы
Теперь перейдем к архитектуре самого мода:
Существуют «зарезервированные» и «свободные» файлы и имена, а также единственный обязательный файл.
Давайте, наверное, сразу создадим его, и не будем к этому возвращаться:
создаем папку нашего мода, а в ней создаем файл «info.json».
Этот файл — лицо мода. Он отвечает за его отображение в списке модов в игре.
В файле прописываем операторные скобки { } .
Внутри пишем названия строк (на картинке указаны обязательные) и их значения в кавычках. Не забываем, что название папки соответствует версии и названию мода.
- name — имя мода
- version — версия
- title — имя мода в списке
- dependencies — зависимости (например в серии Боб-модов есть зависимости от других модов)
- author — имя создателя
- descriprion — описание мода
Вы можете добавить и свои строки, но не забываем: «краткость — сестра таланта».
Теперь можно разобраться со «свободными» и «зарезервированными» именами.
Существует несколько специальных папок, которые игра будет воспринимать по своему, и, если там будут не те файлы, вы получите ошибку.
Например, вы хотите чтобы все иконки предметов лежали в определённом месте и создаете папку с названием 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 и запоминаем новую команду:
require( )
Команда прописываеться в начале файла.
Внутри скобок указывается путь к подключаемому 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 и заходим в игру (проверяем на ошибки). Если их нет и игра запустилась, то все «ок». Однако, предмет пока что мы сможем видеть только, например, в сундуке запроса, так как он не имеет рецепта.
Ну, вот и все. Мы создали наш первый предмет (и, хотя он не имеет рецепта, его можно найти в списке предметов). О том, как добавлять рецепты раскажу в след раз, иначе будет слишком много информации (и слишком много придётся кому-то редактировать текста… 😥 ).