Привет опять, и сразу к сути, сегодня мы поговорим про:
- Создание своего рецепта
- Систематизацию предметов внутри игры и свои группы
- Локализация игры
И в качестве бонуса (Решил опередить время ради одного человека, что написал в вк) :
- Как отключить элементы обычной игры либо изменить их
Создание своего рецепта
Начну пожалуй с интересной особенности фактории. Помните в инвентаре персонажа список крафтов? Этот список имеет спецефическую особенность: «Указывать Рецепты по ссылке на предмет».
Не понятно? (А я уверен что не понятно).
Давайте объясню на примере нашей бочки. Пока у неё нет рецепта, она не видна в списке, Однако если мы откроем список предметов (например в сундуке запроса), то там она будет.
Но как только мы добавим нашей бочке хотя-бы 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
Так как нет ни одной технологии которая его разблокирует, то его не станет.
Если же итем открывается с помощью технологии, то таким же способом лезем в технологию Меняем то что она разблокирует на все тоже самое, кроме нужного предмета, тем самым мы не дадим ему появиться.
На сегодня все