В данной статье я подробно разберу настройку и установку Ядро плагина - Ice RPG: Рассвет нового мира / Rise of a new world (CORE)
Решил вынести в отдельную статью, чтобы не мучиться с редактированием ресурсов. Поскольку мне в лс пришло сообщение, где плагин сыпет ошибками перевода прямо из коробки, я посчитал полезным более подробно показать все нюансы установки и настройки, чтобы при появлении новых модулей более не касаться файлов перевода и конфигов ядра, а у пользователя не составляло труда добавить нужный функционал.
В статье я по шагам буду настраивать конфиги плагина, касаясь файлов перевода.

Для начала скачаем все необходимые модули:

В модулях статов я указал, какая характеристика какое обозначение имеет (например "agi" - уворот, и так далее..)
В ice_rpg_core.ini мы находим 2 секции:
"stats_use_descriptions" - тут содержатся настройки описания статов (когда игрок нажимает на нужный стат, ему показывается дополнительная информация)
"stats_translate_mode" - тут указывается, будет ли указано значение стата (например, Защита: 2.5 - такое отображение будет при параметре 1. БанниХоп, Эффекты при выстрелах - так будет выглядеть стат при параметре 0. Это нужно для того, чтобы можно было добавлять статы, работающие просто при наличии у игрока).

Добавим все имеющиеся статы на момент написания статьи:
"stats_use_descriptions"        //имеет ли стат описание? (если 1, необходимо добавить его в stats_descriptions.phrases)
    {
        "hp"        "1"
        "def"        "1"
        "dmg"        "1"
        "crdmg"        "1"
        "acc"        "1"
        "agi"        "1"
        "defig"        "1"
        "crch"        "1"
        "acrch"        "1"
        "acrdmg"    "1"
    }
   
    "stats_translate_mode"        //отображается ли значение, например "защита 2.5" (указать 1), или будет просто "защита" (указать 0)? (необходимо корректно настроить stats.phrases)
    {
        "hp"        "1"
        "def"        "1"
        "dmg"        "1"
        "crdmg"        "1"
        "acc"        "1"
        "agi"        "1"
        "defig"        "1"
        "crch"        "1"
        "acrch"        "1"
        "acrdmg"    "1"
    }

Теперь, необходимо добавить статы в файлы перевода:
stats.phrases.txt:
"Phrases"
{
    "def"
    {
        "#format"        "{1:s}"
        "ru"    "Защита: +{1}%"
        "en"    "Defence: +{1}%"
    }
    "dmg"
    {
        "#format"        "{1:s}"
        "ru"    "Урон: +{1}%"
        "en"    "Damage: +{1}%"
    }
    "hp"
    {
        "#format"        "{1:s}"
        "ru"    "Здоровье: +{1}"
        "en"    "HP: +{1}"
    }
    "crdmg"
    {
        "#format"        "{1:s}"
        "ru"    "Крит. урон: +{1}%"
        "en"    "Crit. damage: +{1}%"
    }
    "acc"
    {
        "#format"        "{1:s}"
        "ru"    "Точность: {1}%"
        "en"    "Accuracy: {1}%"
    }
    "agi"
    {
        "#format"        "{1:s}"
        "ru"    "Уворот: {1}%"
        "en"    "Agility: {1}%"
    }
    "defig"
    {
        "#format"        "{1:s}"
        "ru"    "Игнор защиты: {1}%"
        "en"    "Defence Ignore: {1}%"
    }
    "crch"
    {
        "#format"        "{1:s}"
        "ru"    "Крит. шанс: {1}%"
        "en"    "Crit. chance: +{1}%"
    }
    "acrch"
    {
        "#format"        "{1:s}"
        "ru"    "Анти крит. шанс: {1}%"
        "en"    "Anti crit. chance: {1}%"
    }
    "acrdmg"
    {
        "#format"        "{1:s}"
        "ru"    "Анти крит. урон: {1}%"
        "en"    "Anti crit. damage: {1}%"
    }
}

Поскольку выше мы указали, что все статы будут иметь описание, давайте добавим его
Формирование названия фразы работает по принципу: {stat}_description
stats_descriptions.phrases.txt:
"Phrases"
{
    "def_description"
    {
        "ru"    "Понижает получаемый урон"
        "en"    "Reduces damage taken"
    }
    "dmg_description"
    {
        "ru"    "Повышает наносимый урон"
        "en"    "Increases damage dealt"
    }
    "hp_description"
    {
        "ru"    "Повышает максимальное количество HP"
        "en"    "Increases maximum HP"
    }
    "crdmg_description"
    {
        "ru"    "Увеличивает урон при критическом попадании"
        "en"    "Increases damage on a critical hit"
    }
    "acc_description"
    {
        "ru"    "Повышает вероятность попадания по противнику"
        "en"    "Increases the chance of hitting an enemy"
    }
    "agi_description"
    {
        "ru"    "Повышает вероятность увернуться от атаки противника"
        "en"    "Increases the chance to dodge enemy attacks"
    }
    "defig_description"
    {
        "ru"    "Позволяет игнорировать защиту противника при нанесении урона"
        "en"    "Allows you to ignore enemy defense when dealing damage"
    }
    "crch_description"
    {
        "ru"    "Увеличивает шанс критического попадания"
        "en"    "Increases critical hit chance"
    }
    "acrch_description"
    {
        "ru"    "Понижает шанс критического попадания по вам"
        "en"    "Reduces your chance of a critical hit."
    }
    "acrdmg_description"
    {
        "ru"    "Понижает урон при критическом попадании по вам"
        "en"    "Reduces damage taken from critical hits on you."
    }
}

По желанию можем указать максимальные значения статов, которые может разогнать себе игрок:
C-подобный:
"stats_limit"    //макс. значения статов
{
    "0"
    {
        "def"    "70"
        "hp"    "45"
    }
}

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

Мы всё еще находимся в основном конфиге плагина. Давайте добавим группы, по которым будет разбита вся экипировка.
Делаем задел для будущего шмота:
"item_categories"        //можно менять местами, добавлять, удалять, не забывая про файл перевода
    {
        //ид категории            название категории
        "1"        "head"        //голова
        "2"        "upper"        //куртка
        "3"        "lower"        //штаны
        "4"        "hands"        //перчатки
        "5"        "boots"        //ботинки
        "6"        "amulet"    //амулет
        "7"        "ring"        //кольцо
        //"8"        "sword"
        //"9"        "wings"
    }

Обязательно добавим наши группы в item_types.phrases.txt
...:
"Phrases"
{
    "head"
    {
        "ru"    "Голова"
        "en"    "Head"
    }
    "upper"
    {
        "ru"    "Торс"
        "en"    "Body"
    }
    "lower"
    {
        "ru"    "Ноги"
        "en"    "Legs"
    }
    "hands"
    {
        "ru"    "Руки"
        "en"    "Hands"
    }
    "boots"
    {
        "ru"    "Обувь"
        "en"    "Boots"
    }
    "amulet"
    {
        "ru"    "Амулет"
        "en"    "Amulet"
    }
    "ring"
    {
        "ru"    "Кольцо"
        "en"    "Ring"
    }
    "sword"
    {
        "ru"    "Меч"
        "en"    "Sword"
    }
    "wings"
    {
        "ru"    "Крылья"
        "en"    "Wings"
    }
}

В целом, пока можем уйти из основного конфига плагина. Опционально можем сразу добавить в него команды, используемые модулями, например, отвечающие за выдачу рпг валюты
Настроим выдачу рпг валюты и количество покупаемых по фикс. ценам ресурсов:
"money_for_kill_chat"        "1"        //писать ли в чат при получении валюты за убийства
"money_for_round_chat"        "1"        //писать ли в чат при получении валюты за конец раунда
"money_for_kill"            "15"    //валюта за убийство
"money_for_kill_hs"            "10"    //доп. валюта за убийство в голову
"money_round_end"            "15"    //валюта за конец раунда
"money_round_win"            "10"    //доп. валюта за победу в раунде
"fix_price_positions"        "1,2,5,10"    //пункты с количеством в меню покупки по фикс ценам

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

Создадим первый предмет:
Лёгкий шлем новичка:
"91"            //ид предмета
{
    "category"                    "1"                        //категория
    "level"                        "1"                    //требуемый уровень
    "item_name"                    "lite_newbie_head"    //название предмета (фраза в файле перевода)
    "rarity_class"                "basic"                //класс редкости предмета
    "description"                "91_descr"    //краткое описание (фраза в файле перевода)
    "detal_description"            ""    //детальное описание отдельным пунктом, если пусто - не появится
    "avaliable_upgrades"        "dmg,def,hp,hp_reg,agi"    //улучшения, совместимые с данным предметом
}

Ид предмета (в нашем случае 91 должен быть уникальным). Именно это число будет храниться в базе, именно оно будет фигурировать при любых взаимодействиях с предметом.
Категория ("category") - группа предмета. Выше мы указали, что группа 1 - head, то есть голова/шлем
Название предмета должно как-то показываться игроку, для этого укажем фразу перевода с названием и добавим его в equipment.phrases.txt
equipment.phrases.txt:
"lite_newbie_head"
{
    "ru"    "Лёгкий шлем новичка"
    "en"    "Light beginner's helmet"
}
Класс редкости предмета используется при настройке шансов улучшения в конфиге ядра.
Раз выше мы не создали классы, давайте добавим нужный класс редкости предмета в конфиг ядра и файл перевода
core.phrases.txt:
"basic"
{
    "ru"    "Обыкновенный"
    "en"    "Basic"
}
"strong"
{
    "ru"    "Усиленный"
    "en"    "Strong"
}
"powerful"
{
    "ru"    "Необычайно сильный"
    "en"    "Powerful"
}
"relict"
{
    "ru"    "Реликвия"
    "en"    "Relic"
}
Описание. Для красоты и атмосферы давайте укажем описание предмета (это по желанию..)
"description" "91_descr" - укажем фразу, содержащую описание
Добавим ее в descriptions.phrases.txt:
"91_descr"
{
    "ru"    "Ничем не примечательный шлем"
    "en"    "An unremarkable helmet"
}

"detal_description" - параметр с подробным описанием, на стадии разработки, можем его не касаться
"avaliable_upgrades" - Совместимые с предметом улучшения. Этот параметр отвечает за то, улучшение с каким статом может вставить в предмет игрок. Например, если это строка не содержит "hp", игрок не сможет улучшить данную шмотку никаким улучшением, влияющим на увеличение здоровья.

Перейдем к статам, которые будут в каждом предмете данного айди, то есть базовым статам предмета
Укажем их в секции stats:
"stats"                //основные свойства предмета
{
    "dmg"        "1.5"    // +1.5% урона
    "def"        "0.7"    // +0.7% зашиты
}

Настроим получение предмета при убийстве (дроп). Думаю, что оставил достаточно подробные комментарии, не вижу необходимости расписывать всё.
Чуть подробнее лишь коснусь параметров max_lvl_attacker и min_lvl_target. Они предназначены для двух целей:
1. max_lvl_attacker - Чтобы прокаченным игрокам не выпадали неактуальные шмотки (например, инвентарь игрока 50 уровня не забивался мусорными для него предметами 5 уровня).
2. min_lvl_target - Чтобы за убийство игроков низкого уровня топовому игроку не давались никакие шмотки. Это может побудить топовых игроков заходить друг против друга, чтобы получать дроп. Иными словами, небольшое движение в сторону баланса.

C-подобный:
"drop"
{
    "drop_chance"                "5"                        //шанс дропа при убийстве противника
    "max_lvl_attacker"            "5"                        //уровень, до которого игроку может выпасть предмет при убийстве
    "min_lvl_target"            "1"                        //мин. уровень жертвы, за убийство которой может выпасть предмет
    //в данном примере шанс дропа предмета со свойствами при убийстве не 10%, а 10% от 5%, то есть 10% из общего числа выпавших предметов данного вида
    "ability_chance"            "10"                    //шанс того, что дропнувшийся предмет будет с доп. св-вами
    //работает по схеме: прокает шанс, получается одно св-во, для второго свойства должен по новой прокнуть этот шанс
    "max_abilities"                "2"                        //максимум возможных доп. свойств

    //дополнительное свойство предмета (пример записи: vamp:1-5,crdmg:2-4 - вампиризм от 1 до 5, крит урон от 2 до 4)
    "abilities"                    "vamp:1-2,crdmg:1-2"    //рандом из доступных в данной строке вариантов (можно float, 1 цифра после запятой)
    "min_upgrades"                "0"                        //минимальное кол-во слотов для улучшений
    "max_upgrades"                "4"                        //максимальное кол-во слотов для улучшений
    "time"                        "0"                        //на какое время предмет (0 - навсегда)
}

По итогу наш созданный предмет выглядит так:
Итем:
"91"            //ид предмета
{
    "category"                    "1"                        //категория

    "level"                        "1"                    //требуемый уровень

    "item_name"                    "lite_newbie_head"    //название предмета (фраза в файле перевода)
    "rarity_class"                "basic"                //класс редкости предмета

    "description"                "91_descr"    //краткое описание (фраза в файле перевода)
    "detal_description"            ""    //детальное описание отдельным пунктом, если пусто - не появится

    "avaliable_upgrades"        "dmg,def,hp,hp_reg,vamp,agi"    //улучшения, совместимые с данным предметом

    "stats"                //основные свойства предмета
    {
        "dmg"        "1.5"    // +1.5% урона
        "def"        "0.7"    // +0.7% зашиты
    }

    "drop"
    {
        "drop_chance"                "5"                        //шанс дропа при убийстве противника
        "max_lvl_attacker"            "5"                        //уровень, до которого игроку может выпасть предмет при убийстве
        "min_lvl_target"            "1"                        //мин. уровень жертвы, за убийство которой может выпасть предмет
        //в данном примере шанс дропа предмета со свойствами при убийстве не 10%, а 10% от 5%, то есть 10% из общего числа выпавших предметов данного вида
        "ability_chance"            "10"                    //шанс того, что дропнувшийся предмет будет с доп. св-вами
        //работает по схеме: прокает шанс, получается одно св-во, для второго свойства должен по новой прокнуть этот шанс
        "max_abilities"                "2"                        //максимум возможных доп. свойств

        //дополнительное свойство предмета (пример записи: vamp:1-5,crdmg:2-4 - вампиризм от 1 до 5, крит урон от 2 до 4)
        "abilities"                    "vamp:1-2,crdmg:1-2"    //рандом из доступных в данной строке вариантов (можно float, 1 цифра после запятой)
        "min_upgrades"                "0"                        //минимальное кол-во слотов для улучшений
        "max_upgrades"                "4"                        //максимальное кол-во слотов для улучшений
        "time"                        "0"                        //на какое время предмет (0 - навсегда)
    }

}
Для начала, определимся с группами наших расходников, по которым они, в том числе, будет отсортированы во всех меню.
Вы можете создать сколько угодно (в пределах разумного!) категорий и размещать предметы в них как душе угодно, однако, должны создать минимум 3:
1. Категория, в которой находятся предметы улучшения экипировки
2. Категория, в которой находятся предметы, увеличивающие шансы на удачное улучшение (дрогоценности)
3. Категория, в которой будут все остальные предметы (поскольку не должно быть предметов без категория)Оффтоп
В примере я добавил 4 категории: улучшения, драгоценности, кейсы, прочие. Мог бы добавить категорию с лечилками или иными зельями, но заленился.

Как таковые, категории создаются в ice_rpg_resources, но улучшения и драгоценности обязательно добавить в конфиг ядра
ice_rpg_core.ini:
"upgrades_category"            "upgrades"    //название категории, в которой содержатся ресурсы улучшения экипировки (должно совпадать с ice_rpg_resources.ini)
"jewels_category"            "jewels"    //название категории, в которой содержатся драгоценные камни. Если отсутствует строка или значение, режим шансов и драгоценностей при улучшении будет отключен.

Также обязательно добавим созданные нами категории в файл перевода
resources.phrases.txt:
"upgrades"
{
    "ru"    "Улучшения экипировки"
    "en"    "Equipment upgrades"
}
"jewels"
{
    "ru"    "Драгоценности"
    "en"    "Jewels"
}
"res_other"
{
    "ru"    "Прочие"
    "en"    "Other"
}
"cases_resources"
{
    "ru"    "Кейсы"
    "en"    "Cases"
}

Создадим предмет улучшения экипировки:
ice_rpg_resources.ini:
"upgrades"
{
    "1"                //id
    {
        "name"        "base_defense_stone"
        "description"    "1"
        "stats"
        {
            "def"        "1.5"
        }

        "drop"
        {
            "drop_chance"    "7"
        }
    }
}
Мы создали предмет, добавляющий 1.5% защиты при его вставке в снаряжение.
Поскольку задали имя base_defense_stone, обязательно добавим его в файл перевода
resources.phrases.txt:
"base_defense_stone"
{
    "ru"    "Обычный защитный камень"
    "en"    "Base defense stone"
}

Также параметром description мы указали, что у предмета есть описание
Давайте добавим его. Принцип формирования фразы отличный от предметов экипировки и такой же, как у статов (сам не знаю, почему я так сделал, но можно принять это)
resources_descriptions.phrases.txt - добавим _description в имя предмета:
"base_defense_stone_description"
{
    "ru"    "Обычное улучшение экипировки, повышающее защиту"
    "en"    "Basic equipment upgrade to increase defence"
}

По аналогии добавим один кейс и одну лечилку в соответствующие категории
В категорию "cases_resources":
"25"
{
    "name"        "beginner_case"

    "usability"        "1"                    //ресурс можно использовать
    "usability_group"    "63"            //номер группы используемых предметов (0-63)
    "usability_cooldown"    "-1"        //кулдаун, в который уйдёт вся группа (-1 - отключить кулдаун, например если при использовании открывается другое меню)
    "usability_category"    "case"        //категория (или несколько через ";", максимум 8) используемого предмета (указывается в модуле)
    "usability_item_take"    "0"            //использование ресурса тратит его количество в инвентаре игрока?
}

В категорию res_other:
"337"
{
    "name"                    "small_heal_potion"        //название предмета в файле перевода
    "description"            "0"                        //можете выставить 1 и указать описание
    "usability"                "1"
    "usability_group"        "10"                    //группа, предметы в которой уйдут в кулдаун вместе с текущим предметом
    "usability_cooldown"    "25"                    //кулдаун
    "usability_item_take"    "1"                        //забрать предмет при использовании
    "usability_category"    "heal"                    //категория предметов лечения
    "step_count"            "5"                        //количество "шагов" лечения
    "hp_by_step"            "2"                        //восстанавливаемое хп за шаг
    "step_interval"            "0.5"                    //интервал между шагами (не меньше 0.1 и не больше 60.0)

    "fix_price"                "150"

    "drop"
    {
        "drop_chance"    "10"
    }
}
Не забываем указать имена предметов и их описания в файлах перевода!

Можно заметить, что у созданного кейса нет секции "drop", однако, мы можем спокойно ее добавить, указав шансы.
Шансы дропа работают следующим образом:
Складываются шансы дропа всех предметов (допустим, сумма получилась 250)
Если у предмета small_heal_potion шанс указан 10, то он может выпасть с вероятностью 10/250.
В конфиге ядра можно более детально настроить шансы дропа и количество одновременно получаемых предметов.

Будет дополняться...
  • Мне нравится
Реакции: VeNoM`1K =))