Небольшое вступление:
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


Тема закрыта








