Небольшое вступление:
0.
В данном гайде, реализуем скриптами, создание фракций в Dayz Epoch, на стороне сервера.
1.
Добавление пунктов меню для игрока в миссию:
Вступить во фракцию XXX
Вступить во фракцию YYY
Выйти из фракции
Сменить фракцию
и т.п.
Будет позже.
2.
Для хранения фракций можно использовать SQL БД, как стандартные поля, используя стандартную HiveExt.dll(это может создать путаницу при подключении скриптов которые так же используют стандартные поля в БД), так и создать собственное поле в существующей таблице игроков, используя кастомную HiveExt.dll.
Я буду использовать ini.dll, - проще в реализации.
Ссылку на ini.dll я дам позже, как и API(если тема будет интересной).
*У кого есть моя сборка, или скрипт нового года, могут использовать dll из сборки, как и БД.
3.
Сразу скажу, что тут использован в скриптах не совсем правильный подход.
Если тема будет интересна, то возможно альтернативную часть, в которой покажу, как правильно реализовать систему фракций, без использования цикла while, и без setVariable\getVariable
****************************************************************************************************************************************************************************************************
Создание папок и файлов:
В папке:
...\@DayZ_Epoch_Server\addons\dayz_server\missions\ВАША_МИССИЯ\
Создадим папку:
Ultima_Custom_Scripts
В папке:
...\@DayZ_Epoch_Server\addons\dayz_server\missions\ВАША_МИССИЯ\Ultima_Custom_Scripts\
Создадим файлы:
*Для глобальных переменных, которые мы будем использовать в наших скриптах
Ultima_Server_Variables.sqf
Создадим папку для наших скриптов:
Ultima_Server_Fractions
В папке Ultima_Server_Fractions создадим файлы:
*Для инициализации - подключения скриптов фракций
Ultima_Server_Fractions_Init.sqf
*Для загрузки данных из БД, при старте сервера
Ultima_Server_Fractions_Load_BD.sqf
*Для установки фракции игроку зашедшему на сервер
Ultima_Server_Fractions_Setup.sqf
*Для обновления фракции игрокам - вышел из фракции, или сменил фракцию, или вступил во фракцию
Ultima_Server_Fractions_Update.sqf
Разбираем файлы:
Файл Ultima_Server_Variables.sqf:
Добавим в него следующий код:
// Путь к нашим скриптам Ultima_Server_String_Scripts_Path = "\z\addons\dayz_server\missions\DayZ_Epoch_11.Chernarus\Ultima_Custom_Scripts\"; // Путь к папке с ini файлами (БД) Ultima_Server_String_INI_DLL_Name_Path = "C:\Steam\SteamApps\common\arma 2 operation arrowhead\ini\Chernarus\#1Ultima\"; // Имя файла DLL который мы будем использовать Ultima_Server_String_INI_DLL_Name_Name = "ultima_ini";
Файл Ultima_Server_Fractions_Init.sqf:
Добавим в него следующий код:
// Создадим серверный массив который будет содержать данные о принадлежности игроков к фракциям. Записи типа - ["UID", "Название фракции"] Ultima_Server_Array_Fractions = []; // Загрузим данные из БД в ранее созданный серверный массив - Ultima_Server_Array_Fractions [] call compile preprocessFileLineNumbers (Ultima_Server_String_Scripts_Path + "Ultima_Server_Fractions\Ultima_Server_Fractions_Load_BD.sqf"); // Скомпилируем процедуру, которая будет срабатывать при входе игрока на сервер, для установки фракции данному игроку Ultima_Server_Procedure_Fractions_Setup = compile preprocessFileLineNumbers (Ultima_Server_String_Scripts_Path + "Ultima_Server_Fractions\Ultima_Server_Fractions_Setup.sqf"); // Запустим скрипт, который будет обновлять данные в БД, и массиве Ultima_Server_Array_Fractions, если игрок вышел из фракции, сменил фракцию, или вступил во фракцию [] execVM (Ultima_Server_String_Scripts_Path + "\Ultima_Server_Fractions\Ultima_Server_Fractions_Update.sqf");
Файл Ultima_Server_Fractions_Load_BD.sqf:
Добавим в него следующий код:
Private ["_uid_count", "_i", "_tmp"]; // Инициализируем DLL, и подключаемся к файлу BD.ini Ultima_Server_String_INI_DLL_Name callExtension format["0|%1BD.ini|1", Ultima_Server_String_INI_DLL_Name_Path]; // Получаем кол-во записей в ini файле, в секции fractions _uid_count = parseNumber(Ultima_Server_String_INI_DLL_Name callExtension "2|fractions"); // Цикл от 0 до кол-ва записей, в секции fractions for "_i" from 0 to _uid_count do { // Получаем ключ ini - UID _tmp = Ultima_Server_String_INI_DLL_Name callExtension format["4|fractions|%1", _i]; // Получаем по ключу, массив "['UID', 'Фракция']" _tmp = Ultima_Server_String_INI_DLL_Name callExtension format["10|fractions|%1", _tmp]; // Переделываем строку в массив ["UID", "Фракция"] _tmp = call compile _tmp; // Добавляем массив в массив Ultima_Server_Array_Fractions Ultima_Server_Array_Fractions set [count Ultima_Server_Array_Fractions, _tmp]; };
Файл Ultima_Server_Fractions_Setup.sqf:
Добавим в него следующий код:
Private ["_uid", "_player", "_find_player", "_uid_and_fraction"]; // Будем передавать в данный скрипт ссылку на зашедшего игрока _player = (_this select 0); // Получаем UID игрока _uid = getPlayerUID _player; // Вспомогательная переменная, для определения нового игрока(если игрока не было в БД) _find_player = false; // В цикле ищем игрока в серверном массиве фраций - Ultima_Server_Array_Fractions { // Если нашли игрока - выходим из цикла выполнив код ниже if ( _uid == (_x select 0) ) exitWith { // Устанавливаем вспомогательной переменной значение true - игрок найден _find_player = true; // Повесим на игрока переменную содержащую его фракцию _player setVariable ["Ultima_Fraction", (_x select 1), true]; }; } forEach Ultima_Server_Array_Fractions; // Если не нашли игрока - игрок новый и его еще нет в БД фракций if !(_find_player) then { // Повесим на игрока переменную фракций, содержащую NO - игрок не состоит во фракции _player setVariable ["Ultima_Fraction", "NO", true]; // Подготовим массив с его данными для добавления в БД - ["UID", "Фракция"] _uid_and_fraction = [_uid, "NO"]; // Запишем в INI файл (в БД), данные об этом игроке Ultima_Server_String_INI_DLL_Name callExtension format["9|fractions|%1|%2", _uid, _uid_and_fraction]; // т.к. ранее его не было в серверном массиве фракций(не было в БД) - добавим его туда Ultima_Server_Array_Fractions set [(count Ultima_Server_Array_Fractions), _uid_and_fraction]; };
Файл Ultima_Server_Fractions_Update.sqf
Добавим в него следующий код:
Private ["_i", "_uid", "_fraction", "_array_fraction", "_new_fraction"]; // Каждые 10 секунд будем на сервере крутить цикл, для обновления данных о фракции игроков. while {true} do { // Цикл по игрокам на сервере { // Если это игрок, а не бот, или НПЦ if (isPlayer) then { // Получаем UID игрока _uid = getPlayerUID _x; // Получаем фракцию игрока _fraction = _x getVariable ["Ultima_Fraction", "NO"]; // Цикл по серверному массиву фракций for "_i" from 0 to ((count Ultima_Server_Array_Fractions) - 1) do { // Если нашли игрока в серверном массиве фракций по его UID'у - выходим из цикла, выполнив код ниже if ( ((Ultima_Server_Array_Fractions select _i) select 0) == _uid ) exitWith { // Получаем фракцию игрока которая была записана в массиве фракций _array_fraction = ((Ultima_Server_Array_Fractions select _i) select 1); // Если записанная в массиве фракция не совпадает с текущей фракцией игрока(игрок сменил фракцию, или вступил во фракцию, или вышел из фракции) ( _array_fraction != _fraction ) then { // Создадим массив для обновления записи в БД, и серверном массиве фракций _new_fraction = [_uid, _fraction]; // Обновим данные в БД, о текущей фракции игрока Ultima_Server_String_INI_DLL_Name callExtension format["9|fractions|%1|%2", _uid, _new_fraction]; // Обновим данные в серверном массиве фракций Ultima_Server_Array_Fractions set [_i, _new_fraction]; }; }; }; }; } forEach playableUnits; // Пауза 10 секунд uiSleep 10; };
Подключение данных скриптов на сервере:
В папке:
...\@DayZ_Epoch_Server\addons\dayz_server\init\
Откроем файл:
server_functions.sqf
В верх данного файла добавим:
// Инициализация глобальных переменных для наших скриптов [] call compile preprocessFileLineNumbers "\z\addons\dayz_server\missions\ВАША_МИССИЯ\Ultima_Custom_Scripts\Ultima_Variables.sqf"; // Подключение скриптов фракций: [] call compile preprocessFileLineNumbers (Ultima_Server_String_Scripts_Path + "\Ultima_Server_Fractions\Ultima_Server_Fractions_Init.sqf");В папке:
...\@DayZ_Epoch_Server\addons\dayz_server\compile\
Откроем файл:
server_playerSetup.sqf
После строки:
_playerObj setVariable ["lastTime", time];Добавим:
// Установка переменной фракции для зашедшего игрока [_playerObj] call Ultima_Server_Procedure_Fractions_Setup;
© rnrportal.ru