В данной теме я распишу возможность создания серверного мода для сервера на собственном примере и объясню как его собрать.Работающий на момент публикации статьи на версии сервера игры 1.04.152050.
Темы к ознакомлению, связанные с данным материалом:
https://s-platoon.ru/topic/8701-enscript-uchimsya-osnovam-skriptinga/
https://s-platoon.ru/topic/8622-enscript-delaem-skript-dlya-moda-i-osnovnye-principy-skriptinga-modov/
Нам понадобятся:
1. Сервер игры актуальной версии, не ниже патча 1.04. Как установить можно узнать тут:
До версии 1.04 параметра servermod у сервера игры не существовало!!!
2. Программа 'PBO manager' с состава инструментария армы из сети: https://www.armaholic.com/page.php?id=16369
Зеркало: https://yadi.sk/d/_gmzoNSDpNJTt
Еще зеркало: Pbo manager.rar
3. Скрипты для упаковки в наш мод, сформированные и подготовленные нами вручную. Как - смотрите тему
4. Notepad++ https://notepad-plus-plus.org/download
P.S. Вместо 'PBO manager' можно использовать DayZ Tools, но как им пользоваться разбираемся сами ?
И так, приступим:
1. Предположим, что у нас имеется свой некий набор скриптов (если нет - читаем выше), который необходимо добавить серверу, но не на уровне миссии сервера, а на более ранних уровнях его загрузки. Например, добавить свой killfeed, модифицировать или изменить какой-либо из родных скриптов сервера игры, либо вовсе модификации, подключенной у вас.
Для примера в этой теме и данного гайда я взял вот этот набор скриптов, собранный непосредственно для данной темы за 5 минут, и не изменяющий в сервере ровным счетом ничего. Он может послужить базой для создания своих модов, функций, переменных или классов. Данный гайд будем описывать, исходя из этого архива.
Архив: MyScripts.rar
Подробнее о создании скриптов для своих целей - читайте вот эту тему!
2. Создаем папку с нашим модом. Для примера, это будет папка '@My_Server_Mod'. В созданной нами папке создаем папку 'Addons', а в ней папку 'My_Server_Mod'.
3. Помещаем содержимое распакованного архива в папку 'My_Server_Mod'. Должно получиться так:
4. В папке 'My_Server_Mod' создаем файлик 'config.cpp' и заполняем его следующими данными (советую использовать Notepad++ для этого):
class CfgPatches // требуется обязательно
{
class My_Server_Mod // требуется обязательно, совпадает с именем мода
{
units[]={}; // may be not worked
weapons[]={}; // may be not worked
requiredVersion=0.1; // may be not worked
requiredAddons[]={};
/*
requiredAddons[]=
{
"DZ_Data", // Перечисляем требуемые и используемые модом аддоны (pbo-файлы игры и модов по их внутренним скриптовым именам)
};
*/
};
};
class CfgMods // // требуется обязательно, совпадает с именем мода
{
// https://community.bistudio.com/wiki/DayZ:Modding_Structure#Mod_presentation
class My_Server_Mod
{
dir = "My_Server_Mod"; // Имя папки мода, совпадает с именем мода
picture = ""; // Картинка в описании мода
action = ""; // Ссылка, например вот так: action = "https://dayz.com/";
hideName = 1; // Не уверен, что этот параметр работает
hidePicture = 1; // Не уверен, что этот параметр работает
name = "My_Server_Mod"; // Имя мода (а также его внутреннее скриптовое имя)
logoSmall = "Mods/TestMod/modlogosmall.tga"; // значок рядом с именем мода, если описание не развернуто
logo = "Mods/TestMod/modlogo.tga"; // логотип под меню игры
logoOver = "Mods/TestMod/modlogohover.tga"; // при наведении курсора мыши на логотип
tooltip = "tooltip"; // подсказка при наведении курсора мыши
overview = "My Server Mod"; // Описание
credits = "123new"; // credits
author = "123new"; // author
authorID = "0"; // author steam ID
version = "1.0"; // version
extra = 0; // Не уверен, что этот параметр работает
type = "mod"; // требуется обязательно, остается неизменным
// inputs = "mods\testmod\inputs\my_new_inputs.xml"; // необязательно, при использовании пользовательских inputs
dependencies[]={"Core","GameLib","Game","World","Mission"}; // необязательно, если необходимо установить зависимость класса
class defs
{
class engineScriptModule
{
value=""; // если значение пустое, используется функция ввода по умолчанию
files[]={"My_Server_Mod/scripts/1_Core"}; // вы можете добавить любое количество файлов или каталогов, и они будут скомпилированы вместе с оригинальными скриптами игрового модуля
};
class gameLibScriptModule
{
value="";
files[]={"My_Server_Mod/scripts/2_GameLib"};
};
class gameScriptModule
{
//value="CreateGameMod"; // когда значение заполнено, имя функции ввода модуля скрипта по умолчанию перезаписывается им
value = "";
files[]={"My_Server_Mod/scripts/3_Game"};
};
class worldScriptModule
{
value="";
files[]={"My_Server_Mod/scripts/4_World"};
};
class missionScriptModule
{
value="";
files[]={"My_Server_Mod/scripts/5_Mission"};
};
};
// Если какой-то из разделов скриптинга вам не нужен и вы не сибираетесь его паковать, сотрите необходимый блок с ним выше и в массиве dependencies
};
};
Пояснения в файле оставил. Файл готовый: config.cpp
Как видите, в 'deffs' названия классов и путей соответствуют родным из 'scripts.pbo', но с допиской имени мода. Имя мода в данном случае и есть идентификатор для обращения к своему моду извне. А в 'dependencies' перечисляются используемые классы оригинальных скриптов без дописки номера секции. Количество используемых 'dependencies' и блоков 'deffs' должно быть идентично.
Пояснения есть также и в официальной документации от разработчика: https://community.bistudio.com/wiki/DayZ:Modding_Structure#Mod_presentation
5. Запаковываем нашу папку 'My_Server_Mod' в pbo-файл 'My_Server_Mod.pbo' через 'PBO manager', как на скриншоте ниже:
Можно использовать и другие способы запаковки, если знаете их или привычны вам.
6. Добавляем в параметры запуска сервера параметр:
"-servermod=@My_Server_Mod;" -FilePatching
7. Радуемся, наш серверный мод готов. Пример готового серверного мода: @My_Server_Mod.rar
P.S. Создавать bikey файл для мода и bisign подписи для него не требуется, иначе это может привести к неработоспособности серверной модификации (возможно, недоработка сервера игры разработчиком)
Отмечу сразу, что данный способ подходит для модификации и переписывания оригинальных классов скриптов сервера от разработчиков и модификации чужих модов с помощью моддинга, применяется исключительно на стороне сервера игры и клиент игры не затрагивает. Распространять такой мод игрокам НЕ НУЖНО!
Изменение оригинальных скриптов, для которых не предусмотрена операция 'modded class' в движке игры, а также классов и функций, которые защищены языком и движком игры от такого рода действий через серверные моды не получится. Если вы столкнулись с этим, вам проще распаковать scripts.pbo и поместить папку scripts в корень сервера игры, добавить в параметры запуска сервера параметр -FilePatching и изменять напрямую в папке необходимые вам файлы.Запаковывать назад в pbo папку и размещать в dta в таком случае не нужно!
P.P.S. Процедура создания своего собственного клиент-серверного мода на основе скриптов работает таким же образом. В случае создания такого мода, файл 'config.cpp' может быть для стандартного мода более разнообразным, а также после требуется обязательная подпись такого мода в bisign и создание bikey файлов. Более подробно это освещать требуется отдельно!