Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe
NoNameUltima

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

Recommended Posts

Использование 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;

Share this post


Link to post
Share on other sites



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

Edited by anap (see edit history)

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

 

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

{

_inArray = true ;

}

else

{

Скрипт

} ;

Share this post


Link to post
Share on other sites

Привет как можно сделать выполнение скрипта если 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

{

};

Share this post


Link to post
Share on other sites

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

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

Edited by KING98 (see edit history)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By 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
       
      Возможно имеются и другие методы и наработки в получении данных идентификаторов более простыми методами, на других языках, либо автоматически. Я описал лишь известные мне.
      Все желающие могут добавить в комментариях свои способы конвертаций, возможно это поможет кому-либо.
    • By vitacite
      Бесплатные проекты - "пацаны собрались и замутили сервачок" долго не живут.  В этом я убеждался много раз. Нет сначала на интузиазме эффективность неплохая, но затем все это затухает управляемость команды падает.  Начинаются вопросы - "а почему это должен делать я?",  отмазки "да я на даче сегодня", "да у меня командировка" и тд...  + кто-то должен спонсировать оплату сервера, антидудосов и прочей лобуды, а такого человека интерес тоже может пропасть в любой момент. А чтобы проект был хороший - кому-то надо реально "въебывать", как на второй работе, и  кому-то постоянно вливать туда бабло.
      Поэтому, лично я, считаю любой некоммерческий проект заранее проваленным!  Побегать недельку другую с друзьями это да. Что-то более серьезное, не тратьте свои силы и время! Как минимум на  тему сталкера я таких проектов видел 10 штук и в некоторых даже сам поучаствовал. Начиналось все амбициозно и даже набирало онлайн до 100 человек. Но заканчивалось все одинаково 3-4 месяца и с десято скучающих тел, на безлюдном сервере.  С точки зрения администации, игроки ведут себя как проститутки, бегая с сервера на сервер, друзья перешли, или потому что на том добавили новый прикольный скрип, или прикольную тачку, или тут плохой пинг, а там хороший, или админ козел забанил за читы и тд.  а все эти приколюхи требуют денег, а игровое сообщество не очень расположено их платить за некачественный контент. Да и сама администрация достаточно быстро забивает и расслабляется.
      (я сейчас не говорю о конкретном проекте, скорее это собирательный образ халявы).
       
      А теперь по-существу.  Так сколько должен стоить контент с хотя бы приемлемым качеством?  

      Свое мнение я написал ниже.
       
       
      Спасибо за внимание.
       
      А что думаете Вы напишите ниже в комментариях!
       
       
    • By DrTauren
      Как всем известно, сегодня, 19 сентября разработчики DayZ Standalone официально опубликовали документацию серверов Dayz, а также предоставили возможность скачать файлы для запуска сервера DayZ. Ниже прилагается перевод официальной документации этих самых файлов с форума DayZ, а также документация касательно других файлов, которых нет в официальной документации. Пользуйтесь на здоровье 
       
      Скачать серверные файлы через Steam: steam://rungameid/223350
      На данный момент присутствует ошибка с невозможностью скачать файлы сервера, если на вашем аккаунте Steam отсутствует купленная DayZ.
       
      P.S. Если у вас есть чем заполнить эту статью, обязательно пишите мне в лс 
    • By 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
       
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.