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

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

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

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

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

Использование ini файлов, с помощью DLL

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

Использование ini файлов, с помощью DLL, на пример используя новогоднюю DLL
Ultima_NewYear.dll
Из данной ветки:
http://s-platoon.ru/index.php?/topic/1740-dll-dlia-sviazki-skriptov-arma-2-i-ini-failov-skript-na-novog/
Или(вместе с API)
http://rnrportal.ru/forum/index.php?/topic/6-dll-%d0%b4%d0%bb%d1%8f-%d1%81%d0%b2%d1%8f%d0%b7%d0%ba%d0%b8-%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d0%be%d0%b2-arma-2-%d0%b8-ini-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2/

В данной статье, я расскажу, как использовать DLL, и ini файлы, для написания собственных скриптов.
Для примера, напишем скрипт, который будет хранить UID, и имя пользователя в ini файле, и запрещать менять имена игрокам, после того, как они хотя бы раз зашли на сервер.

Схема скрипта:
    
    1. При старте сервера, читаем ini секцию с игроками.
    2. Заносим прочитанные данные в массив.
    3. При подключении игрока, будем получать его UID, и имя, и искать его в массиве из п.2 по UID
    3.1 Если игрока нет в массиве(новый игрок, или Вы только, что поставили скрипт и файл пока пустой)
        3.1.1 Добавим игрока в массив
        3.1.2 Запишем его в ini
    3.2 Если игрок есть в массве из п.2
        3.2.1    Если имя отличается от того, которое запомнили в массиве - кикнем игрока.

    Сам ini файл(секция с игроками) в последствии, будет выглядеть так:

  [PLAYER NAMES]
    1111111111=["1111111111", "VASIA"]
    2222222222=["2222222222", "MASHA"]
    3333333333=["3333333333", "XXXXX"]

    *Где 11111...,2222...,333.... - UID'ы игроков, и через запятую их имена.
    
В итоге у нас должно получится два скрипта:

  1. Скрипт чтения из БД на старте сервера, и заполнение массива.
  2. Скрипт проверок при соединении игрока.

Начнем с первого скрипта, - буду комментировать, а после приведу полный скрипт.

Объявим локальные переменные, которые мы будем использовать

Private ["_records_count", "_i", "_key", "_record"];

Cоздадим массив, под данные(Глобальный).

Ultima_Server_Array_Players_Names    =    [];

Теперь подключаемся к ini файлу используя DLL, для этого используем 3 параметра -
0 - Ключ соединения - всегда равен нулю - 0
1 - Полный путь к файлу ini, и его имя
2 - 0 или 1 - сохранять сообщения об ошибках в файл debug.txt или нет - 0 не сохранять, 1 - сохранять.

"имя_dll" callExtension "0|путь_к_файлу\имя_файла.ini|1";

Теперь получим кол-во записей в ini файле, в секции PLAYER NAMES, для этого используем 2 параметра -
0 - Ключ запроса кол-ва записей в секции, по API он равен двум - 2
1 - Имя секции, в которой надо подсчитать записи, как мы и условились, секция будет называться PLAYER NAMES

_records_count    =    parseNumber("имя_dll" callExtension "2|PLAYER NAMES");

Теперь в переменной _records_count у нас будет кол-во записей(если файла еще не существует - первый раз запустили скрипт, то не страшно - будет ноль записей)

Теперь в цикле, от 0 до кол-ва записей, будем читать каждую запись, и получать ее значение -

for "_i" from 0 to _records_count do
    {

        По порядковому номеру, прочитаем ключ секции (напомню ключи внутри секции у нас такие - 1111111111...2222.333...), для этого используем 3 параметра
        0 - Ключ DLL который вернет нам КЛЮЧ внутри СЕКЦИИ, по порядковому номеру, - по API он равен 4
        1 - Имя СЕКЦИИ, как условились - PLAYER NAMES
        2 - Порядковый номер(в данном случае, т.к. мы в цикле это делаем, то это наш счетчик цикла - _i)

 _key    =    "имя_dll" callExtension format["4|PLAYER NAMES|%1", _i];

        Теперь зная КЛЮЧ, мы можем получить ЗНАЧЕНИЕ ключа( напомню - ["1111111111", "VASIA"]), для этого используем 3 параметра -
        0 - Ключ DLL, который вернет нам ЗНАЧЕНИЕ по имени КЛЮЧА, из указанной СЕКЦИИ, - по API он равен 10
        1 - Имя СЕКЦИИ, как условились - PLAYER NAMES
        2 - Имя КЛЮЧА

 _record    =    "имя_dll" callExtension format["10|PLAYER NAMES|%1", _key];

        Теперь в _record у нас лежит значение, - ["1111111111", "VASIA"], НО, лежит оно как строка, т.е. - "["1111111111", "VASIA"]", а нам нужен массив
        Теперь из строки, которую нам вернула DLL, переделаем значение в массив, используя функцию армы call compile

 _record    =    call compile _record;

        И теперь добавим полученую запись в наш созданный в самом верху массив

     Ultima_Server_Array_Players_Names set [(count Ultima_Server_Array_Players_Names), _record];
    };


Полный пример скрипта
*файл DLL будет называться ultima_dll_ini.dll

Private ["_records_count", "_i", "_key", "_record"];
"ultima_dll_ini" callExtension "0|D:\ArmA2OA\BD_Players_Names.ini|1";
_records_count    =    parseNumber("ultima_dll_ini" callExtension "2|PLAYER NAMES");
for "_i" from 0 to _records_count do
    {
        _key    =    "ultima_dll_ini" callExtension format["4|PLAYER NAMES|%1", _i];
        _record    =    "ultima_dll_ini" callExtension format["10|PLAYER NAMES|%1", _key];
        _record    =    call compile _record;
        Ultima_Server_Array_Players_Names set [(count Ultima_Server_Array_Players_Names), _record];
    };

Вот собственно и весь первый скрипт, который читает данные из ini БД.

Скрипт номер два - срабатывает при подключении игрока -
Тут совсем все просто -
Объявим локальные переменные, которые мы будем использовать

Private ["_player", "_uid", "_name", "_inArray"];

В первой строке скрипта, будем получать ссылку на соединившегося игрока

_player        =    (_this select 0); 

Получаем UID игрока

_uid        =    getPlayerUID _player; 

Получаем имя игрока

 

_name        =    name _player;
 

 


т.к. мы не еще не знаем, есть ли данный игрок в массиве, или он новенький, - поставим доп. переменную _inArray в false - не найден в массиве

 

_inArray    =    false;
 

 


Теперь ищем игрока в массиве, путем перебора forEach

{ 

    Если нашли игрока - выйдем из цикла перебора(дальше искать нет смысла - мы уже нашли искомое), выполнив код в скобках

  if ( (_x select 0) == _uid ) exitWith
        {

            Поставим нашу доп. переменную в true - игрок найден

   _inArray    =    true; 

            Теперь, когда игрок найден, сравним его текущее имя, и имя сохраненное, и если имена не совпадают - кикнем игрока

            if ( _name != (_x select 1) ) then
                {
                    ТУТ ПРОЦЕДУРА КИКА ИГРОКА С СЕРВЕРА. ЕЕ ОПИСЫВАТЬ Я НЕ СТАНУ, - МОЖНО ПОДСМОТРЕТЬ В ИНФИСТАРЕ, ИЛИ НАПИСАТЬ СОБСТВЕННУЮ.
                };
        };
} forEach Ultima_Server_Array_Players_Names;

Проверим чему равна доп переменная _inArray - если true - игрок был найден - выйдем полностью из скрипта - дальше его выполнять не надо

if (_inArray) exitWith {};

Данный код будет выполнен, если игрок новый, и мы его не нашли в массиве
Добавим его в массив

Ultima_Server_Array_Players_Names set [(count Ultima_Server_Array_Players_Names), [_uid, _name]];

Добавим его в ini файл, чтоб при следующей загрузке из ini БД, он был в массиве, для этого используем 4 параметра -
0 - Ключ DLL который позволит записать данные в ini файл, в указанную секцию, по API он равен 9
1 - Имя СЕКЦИИ, как условились - PLAYER NAMES
2 - КЛЮЧ секции (мы используем UID игрока в качестве ключа - он уникальный)
3 - ДАННЫЕ записанные по КЛЮЧУ - это простой массивчик - [uID, ИМЯ]

"имя_dll" callExtension format["9|PLAYER NAMES|%1|%2", _uid, [_uid, _name]];

Полный пример скрипта:

Private ["_player", "_uid", "_name", "_inArray"];
_player        =    (_this select 0);
_uid        =    getPlayerUID _player;
_name        =    name _player;
_inArray    =    false;
{
    if ( (_x select 0) == _uid ) exitWith
        {
            _inArray    =    true;
            if ( _name != (_x select 1) ) then
                {[_player, format["На сервере запрещена смена имен! Ваше имя: %1", (_x select 1)]] call Ultima_Kick_Player;};
        };
} forEach Ultima_Server_Array_Players_Names;
if (_inArray) exitWith {};
Ultima_Server_Array_Players_Names set [(count Ultima_Server_Array_Players_Names), [_uid, _name]];
"ultima_dll_ini" callExtension format["9|PLAYER NAMES|%1|%2", _uid, [_uid, _name]];

Оба скрипта компилируются на старте сервера, в файле
server_functions.sqf
Скрипт чтения из БД так:

[] call compile preprocessFileLineNumbers "\z\addons\dayz_server\missions\ВАША_МИССИЯ\ПУТЬ_К_СКРИПТУ\Ultima_Server_Procedure_Load_INI_BD_Players_Names.sqf";

Второй таким образом:

Ultima_Server_Procedure_Player_Test_Name    =    compile preprocessFileLineNumbers "\z\addons\dayz_server\compile\Ultima_Server_Procedure_Player_Test_Name.sqf";

*Пути к скриптам, и названия скриптов, Вы можете поменять по своему усмотрению.

И осталось добавить вызов скрипта проверки, при соединении игрока, сделать это можно в файле:
server_playerSetup.sqf
после строки:

_playerObj setVariable ["lastTime", time];

Таким образом:

[_playerObj] call Ultima_Server_Procedure_Player_Test_Name;

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


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





В очередной раз спасибо! Остаётся только DLL купить :wink:

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

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


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

В очередной раз спасибо! Остаётся только DLL купить :wink:

Человек работал над этим продуктом - и как автор в праве решать по какой цене и продавать ли вообще свой продукт... 

Поверь, эта цена более чем адекватная.

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


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

Данную систему давно сделал сам... По поводу dll так в паблике есть хороший вариант(iniDB) Я гляжу тут любят рубить деньги с воздуха)

Кстати, можно и самому такую длку написать на сях/шарпе. Ах да. iniDB с исходным кодом.

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


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

Человек работал над этим продуктом - и как автор в праве решать по какой цене и продавать ли вообще свой продукт... 

Поверь, эта цена более чем адекватная.

А я собственно что-то говорил об неадекватной цене или о том, что неуместно отдавай свой продукт за деньги?

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


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

Данную систему давно сделал сам... По поводу dll так в паблике есть хороший вариант(iniDB) Я гляжу тут любят рубить деньги с воздуха)

Кстати, можно и самому такую длку написать на сях/шарпе. Ах да. iniDB с исходным кодом.

Так чО ты тут сидишь? Беги в соседнюю ветку, там чуваку за 200р скрипт нужен - помоги ему.

Напиши статью, - как ты все сделал сам.

Выложи ДЛЛку, с исходниками.

Расскажи, - как пользоваться.

 

А то я гляжу - тут любят языком молоть.

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


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

Привет как можно сделать выполнение скрипта если uid не совпадает Пробовал так не получается

 

if ( (_x select 0) == _uid ) exitWith

{

_inArray = true ;

}

else

{

Скрипт

} ;

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


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

Привет как можно сделать выполнение скрипта если uid не совпадает Пробовал так не получается

 

if ( (_x select 0) == _uid ) exitWith

{

_inArray = true ;

}

else

{

Скрипт

} ;

1.

if ( (_x select 0) == _uid )  THEN

 

2.

_uids = ["xxx", "yyy"];

if (_uid in _uids) then

{

};

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


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

Спасибо помог и у меня еще вопрос как можно использовать массив из сервера в миссии более конкретно в стартовом луте

Ну или можно ли перенести стартовый лут в сервер

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: 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, в противном случае мы будем считать, что вы согласны с этим.