NoNameUltima

Статья
Создание фракций в ArmA. Часть 1. Серверная.

6 сообщений в этой теме

****************************************************************************************************************************************************************************************************
Небольшое вступление:
0.
    В данном гайде, реализуем скриптами, создание фракций в ArmA (моды и аддоны роли не играют, в примере - DayZ Epoch), на стороне сервера.
1.
    Для хранения фракций можно использовать SQL БД, как стандартные поля, используя стандартную HiveExt.dll(это может создать путаницу при подключении скриптов которые так же используют стандартные поля в БД), так и создать собственное поле в существующей таблице игроков, используя кастомную HiveExt.dll.
    Я буду использовать ini.dll, - проще в реализации.
    Ссылку на ini.dll я дам позже, как и API(если тема будет интересной).
    *У кого есть моя сборка, или скрипт нового года, могут использовать dll из сборки, как и БД.
2.
    Сразу скажу, что тут использован в скриптах не совсем правильный подход.

 


    *Если тема будет интересна, то возможно добавлю альтернативную часть, в которой покажу, как правильно реализовать систему фракций, без использования цикла while, и без setVariable\getVariable, а так же добавлю миссионные скрипты для пунктов меню - Вступление во фракцию, выход из фракции, смена фракции и т.п.
****************************************************************************************************************************************************************************************************
Создание папок и файлов:
В папке:
    [email protected]_Epoch_Server\addons\dayz_server\missions\ВАША_МИССИЯ\
    Создадим папку:
        Ultima_Custom_Scripts
    В папке:
        [email protected]_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         =    "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;

 

Вторая часть темы ждёт вас в приватном разделе, друзья  :smile:

Изменено пользователем DrTauren (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Забронировать это рекламное место


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Похожие публикации

    • Автор: NoNameUltima
      Автор: NoNameUltima
      v. 0.1.7
      Стоимость: 2500
       
      Мод предоставляется в двух частях:
      Клиентский мод(для игроков). Ключи и подписи, присутствуют(При необходимости изменения содержимого - ключ и подписи можно переделать). Серверный мод(только для сервера). *Моды связанны между собой.
       
      Что присутствует:
       
      Дебаг монитор *Есть настройка в конфигурации - отображать, или нет монитор при заходе на сервер.
      **Кнопка вкл\выкл настраивается в конфигурации
      За убийство зомби, повышается счетчик убийств зомби. За убийство зомби, начисляются наличные(кол-во настраивается в конфигурации). При смерти игрока, наличные остаются в трупе.(Забрать можно). За убийство игрока, повышается счетчик убийств людей. Метки на карте с указанием торговых зон. Стартовое приветствие игроков. ПНВ работающий от батарейки. Панель игрока Зараженные зоны. Стартовый инвентарь для игроков(по UID'ам, и общий). Стартовые позиции для игроков(по UID'ам, и случайные для тех кого нет в списке). Статичные постройки на карте(загрузка из класса). Создание коробок с содержимым. Команды чата:  
      Доп. статичные функции:  
      skype: hf-trade
       
      P.S. Обновления платные(для тех кто приобретал мод ранее: 25% от общей стоимости, до актуальной версии).
      P.S.P.S. Весь функционал является БЕТА-ВЕРСИЕЙ!
    • Автор: Alex39
      Инструмент администратора для DayZ Mod / Standalone Server
       

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      Особенности:
      Изменяемый размер и простота использования окна чата / журнала с 3 вкладками (все, чат и журнал) и функцией поиска.
      Изменяемый размер таблицы сортировки игроков.
      Отправить глобальное сообщение.
      Отправить личное сообщение игроку.
      Бан игрока с переменной длиной. (Работает, даже если они отключаются, пока вы печатаете причину)
      Удар игрока.
      Добавить бан.
      Перезагрузить запреты.
      Таблица запретов.
      Удалить бан.
      Избранное.
      Поддержка DNS.
      Неисправность.
      Запустить снова.
      Перезагрузить сценарии и события.
      Сохранение журнала.
      Метки времени с возможностью переключения
      Блокировка и разблокировка
      Получить и установить Макс Пинг.
      Глобальная база данных игроков.
      Локальная база данных игроков.
      Автоматическое сохранение журнала.
      Автоматическое обновление!
       
      https://drive.google.com/open?id=1-HcpYr64Qhxrtwr_i53sqD1BnBj4c-1C
    • Автор: Alex39
      Shadow Of Zone Map
       

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      https://steamcommunity.com/sharedfiles/filedetails/?id=1559123489
       
      License:
      This Content is shared under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0[creativecommons.org] license. You must give credits to authors if you include this modification as dependency. You must ask authors for permission if you want to include any content provided by authors in your mod pack or your own modification. You are not allowed to remix/transform/modify this content if you didn't get permission from authors.You are not allowed to use this content in any way for commercial usage. 

      All content that has been created by GSC Game World used to create port and included with this distribution, unless declared otherwise, 
      is commercial GSC Game World property.

      AUTHORS:

      MAP Author: MetallurG
      Stalker port Author: Ewok
      Author weather: EO
       

       
      Запустил эту карту,  начало ничего, но над ней работать еще и работать
       
       
    • Автор: NoNameUltima
      Еще одна тема, по которой возникают вопросы - как залить свой мод в steam
      Видео пару минут, надеюсь все понятно
       
    • Автор: NoNameUltima
      Тема не новая, но однообразные вопросы, возникают постоянно и у многих.
      Записал коротенькое, и надеюсь понятное видео по теме.