Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной
NoNameUltima

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

Рекомендованные сообщения

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

 


    *Если тема будет интересна, то возможно добавлю альтернативную часть, в которой покажу, как правильно реализовать систему фракций, без использования цикла 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         =    "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 (история изменений)

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


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





Интересная тема,надеюсь не уйдёт в приватный раздел.

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


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

Годный материальчик!  :good:

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


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

Спасибо! Ждём продолжения темы.

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


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

Круто! :good:  как всегда..

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: 123new
      Вижу крайне много любопытных вопросов по поводу идентификаторов игрока в игре. Что же, разжую для не знающих немного.
       
      В игре есть следующие типы идентификаторов:
      1. Steam64ID идентификатор профиля игрока (на пиратках его UID называют), примерно такой: 765475....65 (17 цифр).
      2. Так называемый мною, BIS ID - uid из окна (консоли) сервера игры и ADM-файлов логов сервера, который пишется самой игрой
      3. Battleye GUID игрока.
       
      Первый идентификатор (Steam64ID) на ПК является прямым идентификатором стим-профиля игрока, уникальным у каждого игрока. Т.е. публичным идентификатором вашего профиля для большинства стим-игр (например, Counter-Strike).
      Второй идентификатор (BIS ID) является определенной хеш-суммой, полученной из Steam64ID посредством конвертации сначала в sha256, а затем в base64. Спасибо за это разъяснение и пример кода-конвертации авторам игры на своем официальном форуме.
      Третий идентификатор (Battleye GUID) является публичным идентификатором Battleye античита, получаемый также из Steam64ID поcредством получения его хеш-суммы MD5. Этот же идентификатор есть в логах сервера от Battleye, в любых RCON-приложениях (DART, BEC и т.п.), также его можно конвертировать самим.
       
      Так вот, как же получить Steam64ID:
      1. Зайти на любой ресурс, предназначенный для сбора таких данных. например на: https://steamid.io/
      2. Ввести ссылку на ваш стим-профиль
      3. Получить результат из кучи данных, одно поле из которых и будет содержать ваш Steam64ID
       
      Как получить BIS ID:
      1. Открыть любой Phyton v2.7 -конвертер в интернете, например: https://onecompiler.com/python2/3ycz55xew
      2. Ввести в него следующий код:
      # Hello World program in Python from hashlib import sha256 from base64 import b64encode def construct_bi_uid(steam_id): hashed = sha256() hashed.update(str(steam_id)) return b64encode(hashed.digest()) print construct_bi_uid(76514925976798981) 3. заменить 76514925976798981 на ваш Steam64ID
      4. Отправить код в исполнение, нажав Execute.
      5. Получить результат
       

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
      [Альтернатива] Метод на основе PHP:
      <?php /** * This is how you get user id (bohemia id) like you see in .ADM files from steam id. */ $steam_id = "76514925976798981"; $user_id = base64url_encode(hash('sha256', $steam_id, true)); function base64url_encode($data) { $b64 = base64_encode($data); if ($b64 === false) { return false; } $url = strtr($b64, '+/', '-_'); return $url; } echo $user_id; [Альтернатива] Метод для javascript - node.js:
      var crypto = require('crypto'); var body = "76514925976798981"; var hash = crypto.createHash("sha256"); var hash_result = hash.update(body, 'utf8').digest('base64'); console.log(hash_result);  
      Как получить Battleye GUID:
      1. Открыть любой ресурс с готовой формой конвертирования, например:
      https://armstalker.com/guid/
      https://dayzrussia.com/f/index.php?pages/dayzguid/
      либо написать свою, на основе данных, предложенных на странице Github
      https://gist.github.com/chris579/53053b6d6438df9a9718c23c0d6bbd69
      Оставлю ниже код для Phyton:
      # Thanks to gunlinux import md5 steamid=76514925976798981 temp = "" for i in range(8): temp += chr((steamid & 0xFF)) steamid >>= 8 m = md5.new("BE"+temp) print m.hexdigest() Код для PHP:
      var crypto = require('crypto'); var body = "76514925976798981"; var hash = crypto.createHash("sha256"); var hash_result = hash.update(body, 'utf8').digest('base64'); console.log(hash_result); '2. Вставить в поле ввода UID(Steam64ID) ваш Steam64ID
      3. Нажать кнопку конвертирования или исполнить код, и получить в готовом виде Battleye GUID
       
      Возможно имеются и другие методы и наработки в получении данных идентификаторов более простыми методами, на других языках, либо автоматически. Я описал лишь известные мне.
      Все желающие могут добавить в комментариях свои способы конвертаций, возможно это поможет кому-либо.
    • Автор: vitacite
      Бесплатные проекты - "пацаны собрались и замутили сервачок" долго не живут.  В этом я убеждался много раз. Нет сначала на интузиазме эффективность неплохая, но затем все это затухает управляемость команды падает.  Начинаются вопросы - "а почему это должен делать я?",  отмазки "да я на даче сегодня", "да у меня командировка" и тд...  + кто-то должен спонсировать оплату сервера, антидудосов и прочей лобуды, а такого человека интерес тоже может пропасть в любой момент. А чтобы проект был хороший - кому-то надо реально "въебывать", как на второй работе, и  кому-то постоянно вливать туда бабло.
      Поэтому, лично я, считаю любой некоммерческий проект заранее проваленным!  Побегать недельку другую с друзьями это да. Что-то более серьезное, не тратьте свои силы и время! Как минимум на  тему сталкера я таких проектов видел 10 штук и в некоторых даже сам поучаствовал. Начиналось все амбициозно и даже набирало онлайн до 100 человек. Но заканчивалось все одинаково 3-4 месяца и с десято скучающих тел, на безлюдном сервере.  С точки зрения администации, игроки ведут себя как проститутки, бегая с сервера на сервер, друзья перешли, или потому что на том добавили новый прикольный скрип, или прикольную тачку, или тут плохой пинг, а там хороший, или админ козел забанил за читы и тд.  а все эти приколюхи требуют денег, а игровое сообщество не очень расположено их платить за некачественный контент. Да и сама администрация достаточно быстро забивает и расслабляется.
      (я сейчас не говорю о конкретном проекте, скорее это собирательный образ халявы).
       
      А теперь по-существу.  Так сколько должен стоить контент с хотя бы приемлемым качеством?  

      Свое мнение я написал ниже.
       
       
      Спасибо за внимание.
       
      А что думаете Вы напишите ниже в комментариях!
       
       
    • Автор: DrTauren
      Как всем известно, сегодня, 19 сентября разработчики DayZ Standalone официально опубликовали документацию серверов Dayz, а также предоставили возможность скачать файлы для запуска сервера DayZ. Ниже прилагается перевод официальной документации этих самых файлов с форума DayZ, а также документация касательно других файлов, которых нет в официальной документации. Пользуйтесь на здоровье 
       
      Скачать серверные файлы через Steam: steam://rungameid/223350
      На данный момент присутствует ошибка с невозможностью скачать файлы сервера, если на вашем аккаунте Steam отсутствует купленная DayZ.
       
      P.S. Если у вас есть чем заполнить эту статью, обязательно пишите мне в лс 
    • Автор: Serdce
      Ссылка на первоисточник - https://github.com/BrettNordin/Exile
      Я всего лишь перевёл
      Собственно переходим по ссылке, и скачиваем архив.
      Для тех, кто не знает как качать с хаба скрин 
      И так, едем дальше
      Скачанный архив распаковываем в удобное место для работы,
      Идём в ваш @ExileServer, там нас интересуют файлы - extDB2.dll , extDB2.so , extDB2-conf.ini , XM8.dll , XM8.so Удаляем эти файлы
      Далее идём в @ExileServer которую мы скачали, всё её содержимое копируем в аналогичную папку на сервере.
      Теперь идём в вашу MPmissions и там распаковываем вашу миссию "Exile.название карты",
      Туда мы копируем содержимое папки Exile.MapName из архива,
      Далее открываем ваш config.cpp и ищем там class CfgExileCustomCode 
      В него мы добавляем - #include "CfgExileCustomCode.cpp"
      Должно получится так
      Запаковываем обратно)
      Ну и теперь из архива мы копируем tbbmalloc.dll, tbbmalloc_x64.dll в папку расположения вашего Arma3_server.exe
      Не забываем поменять в вашем файле запуска сервера с arma3server.exe на arma3server_x64.exe 
      Ну и финишная прямая, открываем вашу базу данных ( желательно с название exile ) и добавляем файл Exile_Database_Update_64x.sql
      Далее настройте под себя ваш extdb3-conf.ini
       
  • Наш выбор

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.