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
СЕРГЕЙ

Использование DLL в скриптах. Сохранение параметров персонажа без БД

Recommended Posts

Примеры, по использованию DLL, в своих скриптах.
Для примера, взята DLL от NoNameUltima, которая работает с ini файлами.
 
*API, примеры работы и т.п., Вы можете посмотреть на сайте автора. Ссылка дана в конце статьи.
 
Что же мы будем делать? - Мы рассмотрим, как можно без базы данных, хранить и использовать какие то данные. А конкретнее - напишем свою валюту.
Примеры будут простыми, с пояснениями, я их разбил на несколько частей.
 
Необходимые файлы:
  • Сама DLL - размещаем в папке с игрой.
Клиентские скрипты.
  •     Создание переменной для хранения баланса.
  •     Создание публичных событий.
  •     Запрос баланса с помощью публичных событий.
  •     Пополнение баланса, за убийство зомби.
    
Серверные скрипты.
  •     Подключение DLL.
  •     Создание публичных событий.
  •     Чтение из ini с помощью DLL
  •     Запись в ini с помощью DLL
Отображение баланса у игроков.
 
 
Начнем с клиентской части:
  • Создадим файл в нашей миссии, и назовем его: ultima_balance.sqf
  • Откроем файл init.sqf, в Вашей миссии, и допишем в самый низ:

 

[] ExecVM "ultima_balance.sqf";
 

 

 
  • Код данного файла с пояснениями:

 

//    Если это НЕ сервер
if !(isServer) then
    {
        //    Добавляем игроку, переменную ini_money, в ней будет баланс игрока.
        player setVariable ["ini_money", -1];
        
        //    Регистрация публичных событий - Что делать при приходе с сервера пакета Balance_Client
        "Balance_Client" addPublicVariableEventHandler
            {
                Private ["_packet_type"];
                //    Получаем первую переменную - она говорит нам, что необходимо сделать.
                _packet_type    =    (_this select 1) select 0;
                //    Разбираемся, что нам необходимо сделать
                switch (_packet_type) do
                    //    Если ноль, - нам пришел баланс. Сам баланс, во второй переменной. Кладем его в ini_money
                    {case "0"    : {player setVariable ["ini_money", (_this select 1) select 1];};};
            };


        //    Запрос на сервер о балансе, при подключении
        //    Ждем пока игрок не прогрузится.
        disableSerialization;
        waituntil {!isnull (finddisplay 46)};
        //    Отправляем пакет на сервер, с запросом о балансе. т.к. сервер мог не успеть прогрузить файл с балансами, будем отправлять данный пакет, пока не прийдет ответ, с интервалом в 5 секунд.
        while ( (player getVariable ["ini_money", -1]) == -1) do
            {
                //    Кладем в переменную Balance_Server, наш идентификатор - player, и второй переменной отправляем ноль. На сервере, будем смотреть - если пришел ноль, то игрок запросил баланс
                Balance_Server    =    [player, "0"];
                //    Отправляем Balance_Server на сервер
                publicVariableServer "Balance_Server";
                //    Ждем 5 секунд.
                sleep 5;
            };
    };
 

 

    
  • Открываем файл: local_eventKill.sqf
  • Перед последней скобочкой - }; , внизу файла, добавляем:

 

//    Если убийца - игрок
if (_killer    ==    player) then
    {
        //    Кладем в переменную Balance_Server, наш идентификатор - player, второй переменной отправляем - 1(говорим серверу, что надо пополнить баланс за убийство ЗМ.) третьей переменной - на сколько пополнить баланс.
        Balance_Server    =    [player, "1", 1];
        //    Отправляем Balance_Server на сервер
        publicVariableServer "Balance_Server";
    };
 

 

    
На этом все, с клиентскими скриптами.
 
Серверные скрипты:
 
  • Создаем файл на сервере, в папке Вашей миссии, с названием - ultima_balance.sqf
  • Код файла с пояснениями:
 

 

//    Чтение балансов пользователей, и составление массива, при старте сервера.
//    Создаем глобальный массив пользователей, в котором будут UID'ы игроков и их балансы.
Users_Balance    =    [];
Private ["_section_count","_i","_playerUID","_balance"];
//    Создаем глобальную переменную, в которой будет имя DLL
Ultima_ini    =    "ultima_ini";
//    Инициализируем DLL - см. API для работы с DLL в статье
Ultima_ini callExtension "0|test.ini|1";
//    Получаем кол-во секций в ini файле. - см. API для работы с DLL в статье
_section_count    =    parseNumber(Ultima_ini callExtension "1");
//    Цикл - от 0 и до кол-ва полученых секций
for "_i" from 0 to _section_count do
    {
        //    Читаем в ini секции, и получаем ее имя. - см. API для работы с DLL в статье
        _playerUID        =    Ultima_ini callExtension format["3|%1",_i];
        //    По имени секции, читаем в ini ключ с именем balance, и получаем его значение. - см. API для работы с DLL в статье
        _balance        =    Ultima_ini callExtension format["10|%1|balance",_playerUID];
        //    Кладем в массив, полученные - UID и баланс.
        Users_Balance set [count Users_Balance, [_playerUID, _balance]];
    };


//    Функция для поиска баланса игрока в массиве, если не найден, - нет в файле - добавим в массив, и в файл.
ini_Get_Balance    =
    {
        Private ["_playerUID","_result"];
        _result    =    -1;
        //    Получаем UID игрока, запросившего баланс.
        _playerUID    =    _this select 0;
        //    Перебираем игроков которые есть в массиве.
        {
            //    Если игрок найден, кладем в ответ баланс и выходим.
            if ( (_x select 0) == _playerUID) exitWith
                {_result    =    (_x select 1)};
        } forEach Users_Balance;
        //    Если игрок не был найден(новый игрок, и его нет ни в массиве, ни в файле)
        if (_result    ==    -1) then
            {
                //    Добавим в массив, запись о балансе игрока. - Баланс естественно у нового игрока 0.
                Users_Balance    =    set [count Users_Balance, [_playerUID, balance]];
                //    Добавим в ini файл, игрока и его баланс. - см. API для работы с DLL в статье
                Ultima_ini callExtension format["8|%1|balance|0",_playerUID];
                _result    =    0;
            };
        _result
    };


//    Процедура для обновления баланса игрока
ini_Update_Balance    =
    {
        Private ["_playerUID","_inc_balance","_i"];
        //    Получаем UID игрока, баланс которого надо обновить.
        _playerUID        =    _this select 0;
        //    Получаем число, на которое надо увеличить баланс.
        _inc_balance    =    _this select 1;
        //    Перебираем игроков, которые есть в массиве.
        _i    =    0;
        {
            //    Если игрок найден, кладем в ответ баланс и выходим.(Игрок 100% должен быть в массиве, т.к. при коннекте его должны были добавить в него, если он там отсутствовал).
            if ( (_x select 0) == _playerUID) exitWith
                {
                    //    Изменяем текущий баланс(Прибавляем к текущему, значение на которое надо увеличить баланс).
                    _balance    =    (_x select 1) + _inc_balance;
                    //    Изменяем данные в массиве.                    
                    Users_Balance set [_i,[_playerUID, _balance]];
                    //    Изменяем данные в файле. - см. API для работы с DLL в статье
                    Ultima_ini callExtension format["8|%1|balance|%2",_playerUID,_balance];
                };
            _i    =    _i + 1;
        } forEach Users_Balance;
    };


//    Создание пубичного события для сервера. (т.е. будем тут принимать от клиента его запросы, и отвечать, на них - запрос о балансе - при коннекте, убийстве зм)...
"Balance_Server" addPublicVariableEventHandler
    {
        Private ["_packet","_playerUID","_client"];
        _packet =  (_this select 1);
        _client = owner (_packet select 0);
        switch (_packet) do
            {
                case "0"    :                                                //    Игрок соединился, и запросил баланс.
                    {
                        Private ["_balance","_client"];
                        _player_UID    =    getPlayerUID(_packet select 0);        //    Получаем UID игрока.
                        _balance    =    [_playerUID] call ini_Get_Balance;    //    Получаем баланс игрока.
                        Balance_Client = ["0", _balance];                    //    Составляем ответ для игрока.
                        _client publicVariableClient "Balance_Client";        //    Отправляем игроку данные.
                    };
                case "1"    :                                                //    Если надо пополнить баланс.
                    {
                        Private    ["_inc_balance"];
                        _player_UID    =    getPlayerUID(_packet select 0);        //    Получаем UID игрока.
                        _inc_balance    =    ((_this select 1) select 2);    //    Получаем число, на которое надо увеличить баланс.
                        [_playerUID,_inc_balance] call ini_Update_Balance;    //    Заменяем баланс игрока, в массиве, и в файле ini.
                    };
            };
    };
 

 

    
Добавление отображения баланса в дебаг монитор:
    Если у Вас инфистар:
  •         Откройте файл AH.sqf
  •         Найдите такую строку:
       

 

 hintSilent parseText format [""
 

        

  •         Выше вставьте:

 

        _ultima_balance    =    player getVariable ['ini_money', -1];
 
  • Найдите строки:

 

        "",
        _txt,
 

 

  • Выше вставьте:

 

        <t size='1' font='Bitstream' align='Center' color='#CC0000'>%12</t>  
 

 

      
  •         Найдите строки:

 

        (player getVariable['humanKills', 0]),
        (player getVariable['banditKills', 0])
 

 

        
  •         Поставьте в конце данных строку, запятую, и ниже вставьте:
        

 

_ultima_balance
 

 

        
На всякий, случай - полный код дебаг монитора из инфистар, с добавлением:
 
 

 

       fnc_debugX = {
            admin_debug_run = false;
            _BottomDebug = "+(str _BottomDebug)+";
            while {debugMonitorX} do
            {
                _pic = (gettext (configFile >> 'CfgVehicles' >> (typeof vehicle player) >> 'picture'));
                if (player == vehicle player) then {_pic = (gettext (configFile >> 'cfgWeapons' >> (currentWeapon player) >> 'picture'));
                }else{_pic = (gettext (configFile >> 'CfgVehicles' >> (typeof vehicle player) >> 'picture'));};
                
                _txt = '';
                _txt = (gettext (configFile >> 'CfgVehicles' >> (typeof vehicle player) >> 'displayName'));
                
                _stime = 0;
                if(serverTime > 36000)then{_stime = time;}else{_stime = serverTime;};
                _hours = (_stime/60/60);
                _hours = toArray (str _hours);
                _hours resize 1;
                _hours = toString _hours;
                _hours = compile _hours;
                _hours = call  _hours;
                _minutes = floor(_stime/60);
                _minutes2 = _minutes - (_hours*60);
                _ultima_balance    =    player getVariable ['ini_money', -1];
                hintSilent parseText format [""
                <t size='1' font='Bitstream' align='Center' >[%1]</t><br/>
                <img size='4.75' image='%4'/><br/>
                <t size='1' font='Bitstream' align='left' color='#CC0000'>Blood: </t><t size='1' font='Bitstream' align='right'>%2</t><br/>
                <t size='1' font='Bitstream' align='left' color='#0066CC'>Humanity: </t><t size='1' font='Bitstream' align='right'>%3</t><br/>
                <br/>
                <t size='1' font='Bitstream' align='left' color='#FFBF00'>Zombie Kills: </t><t size='1' font='Bitstream' align='right'>%9</t><br/>
                <t size='1' font='Bitstream' align='left' color='#FFBF00'>Murders: </t><t size='1' font='Bitstream' align='right'>%10</t><br/>
                <t size='1' font='Bitstream' align='left' color='#FFBF00'>Bandits Killed: </t><t size='1' font='Bitstream' align='right'>%11</t><br/>
                <br/>
                <t size='1' font='Bitstream' align='left' color='#FFBF00'>UPTIME: </t><t size='1' font='Bitstream' align='right'>%5h %6min</t><br/>
                <t size='1' font='Bitstream' align='left' color='#FFBF00'>FPS: </t><t size='1' font='Bitstream' align='right'>%8</t><br/>
                <t size='1' font='Bitstream' align='Center' color='#CC0000'>%7</t>
                <t size='1' font='Bitstream' align='Center' color='#CC0000'>%12</t>
                "",
                _txt,
                (r_player_blood),
                round (player getVariable['humanity', 0]),
                _pic,
                _hours,
                _minutes2,
                _BottomDebug,
                (round diag_fps),
                (player getVariable['zombieKills', 0]),
                (player getVariable['humanKills', 0]),
                (player getVariable['banditKills', 0]),
                _ultima_balance
                ];
                sleep 1;
            };
        };
 

 

        
Это всего лишь пример, применения и работы с DLL в ARMA2, и в частности с эпохой. Как добавить обменник голды, на вашу валюту, как поставить предмет за валюту вместо голды и т.п. - Это уже другая тема. Однако, ничего сложного в этом нет.
Вы так же можете добавить, свои рейтинги, и другие значения в ini файл(ы), и работать с ними.
Разнообразьте свой сервер))
 
Ссылка на API с офф сайта:
        

Share this post


Link to post
Share on other sites







Вот спасибо вам Хороший вы человек, ждал ^^но не дождался, сам решил свои проблемы

Очень сладкая,стоит того что автор просит, 

Советую

Share this post


Link to post
Share on other sites

 

 

эх работала бы она с sql....

1. Так с SQL HiveExt есть. И ты же говорил, или кто то говорил, что исправленная, с 999 ключем.

2. Можно и для SQL сделать))) Только смысл?) Чем ini не устраивает?) Читать данные все равно надо, только при старте сервера. Ну а сохранять - да, когда надо внести изменения.

Share this post


Link to post
Share on other sites

Я говорил , Да исправленная с 999 ключем ^^ Использую, работает отлично.пока хватает.

Share this post


Link to post
Share on other sites

Я говорил , Да исправленная с 999 ключем ^^ Использую, работает отлично.пока хватает.

Но есть пара, "но" (вроде?) - разве hive позволяет создавать поле в БД? И в след. версии эпоча - кто гарантирует, что опять не выпилят 999?))

Share this post


Link to post
Share on other sites

Я говорил , Да исправленная с 999 ключем ^^ Использую, работает отлично.пока хватает.

Я нормально работающей с 999 не нашел. кинь сылку если действительно такая есть.

Вроде одна норм есть но работает только с мультиселектом персонажей.

 

 

Только смысл?) Чем ini не устраивает?)

 

Для роботы(мониторить у кого сколько когда и т.д.) с ини нужно софт писать(а это лениво) а для sql уже куча всего есть. плюсом sql оптимизирована для работы с большим обьемом данных в отличии от ини.

Share this post


Link to post
Share on other sites

Я нормально работающей с 999 не нашел. кинь сылку если действительно такая есть.

Вроде одна норм есть но работает только с мультиселектом персонажей.

 

 

 

Для роботы(мониторить у кого сколько когда и т.д.) с ини нужно софт писать(а это лениво) а для sql уже куча всего есть. плюсом sql оптимизирована для работы с большим обьемом данных в отличии от ини.

Разницы нет никакой по данным. Ограничение на кол-во символов передаваемые из длл и обратно никто не отменял, и для хайва оно так же действует, иначе вся прогрузка сервера, занимала бы пару секунд - нафига по1 записи хайв из бд дергает? - мог бы сразу талицу стянуть.

А про софт уже писал... мониторить там не особо что то надо. Да и в ини отличный мониторинг по гуидам. В игре можно в админку как угодно вывести.

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 Restplay
      Здравствуйте, есть ли у кого-нибудь файлы сектора С для карты Napf? На острове, где находится обсерватория Зюренфельд.
    • By MrMiBl
      Всем привет! С наступающим!  
      Проблема такая: безсознанка очень долгая (от двух минут и больше от рандомной пульки...)
      Собственно вопрос: как её отключить либо сократить время?  
      покопавшись в файлах нашел такую тему: fn_unconscious.sqf
      // (c) facoptere@gmail.com, licensed to DayZMod for the community private ["_count","_anim","_weapon","_sprint","_stance","_transmove","_start","_timeout","_short","_sandLevel","_speed"]; if (r_player_unconsciousInProgress) exitWith {}; r_player_unconsciousInProgress = true; r_player_unconsciousInputDisabled = true; //this is like this in order to release the current user input disableUserInput true; disableUserInput true; disableUserInput false; disableUserInput false; disableUserInput true; disableUserInput true; _start = diag_tickTime; _timeout = abs r_player_timeout; _short = _timeout < 4; if (!_short) then { 4 cutRsc ["playerStatusWaiting", "PLAIN",1]; playSound "heartbeat_1"; }; _count = 0; // can be set to false by medEPI.sqf, during the 'while' loop r_player_unconscious = true; player setVariable ["NORRN_unconscious", r_player_unconscious, true]; _sandLevel = ctrlPosition ((uiNamespace getVariable 'DAYZ_GUI_waiting') displayCtrl 1400); //diag_log [(diag_tickTime - _start) < _timeout , !r_player_unconscious , alive player ]; dayz_autoRun = false; if (player == vehicle player) then { player playAction "CanNotMove"; }; "dynamicBlur" ppEffectEnable true;"dynamicBlur" ppEffectAdjust [2]; "dynamicBlur" ppEffectCommit 0; "colorCorrections" ppEffectEnable true;"colorCorrections" ppEffectEnable true;"colorCorrections" ppEffectAdjust [1, 1, 0, [1, 1, 1, 0.0], [1, 1, 1, 0.1], [1, 1, 1, 0.0]];"colorCorrections" ppEffectCommit 0; if (dayz_soundMuted) then {call player_toggleSoundMute;}; // hide icon before fadeSound 0 fadeSound 0.05; while { (diag_tickTime - _start) < _timeout and r_player_unconscious and alive player } do { player setVariable ["unconsciousTime", _timeout - diag_tickTime + _start, (_count % 10) == 0]; if (!_short) then { _sandLevel set [ 3, 0.136829 * safezoneH * (diag_tickTime - _start) / _timeout ]; ((uiNamespace getVariable 'DAYZ_GUI_waiting') displayCtrl 1400) ctrlSetPosition _sandLevel; ((uiNamespace getVariable 'DAYZ_GUI_waiting') displayCtrl 1400) ctrlCommit 0.05; }; /*_veh = vehicle player; if ((player != _veh) and {(_veh iskindOf "LandVehicle")}) then { _speed = [0,0,0] distance velocity _veh; if (_speed > 10) then { _veh engineOn false; } else { player action ["eject", _veh]; player leaveVehicle _veh; [] spawn { uiSleep 0.1; player playMoveNow "amovppnemstpsnonwnondnon"; }; // instant prone }; }; if (player == _veh) then { player setVelocity [0,0,0]; }; */ uiSleep 0.1; _count = _count + 1; }; if (!_short) then{ 4 cutRsc ["default", "PLAIN",0]; }; r_player_unconscious = false; player setVariable ["NORRN_unconscious", r_player_unconscious, true]; r_player_timeout = 0; player setVariable ["unconsciousTime", r_player_timeout, true]; r_player_cardiac = false; player setVariable ["USEC_isCardiac",r_player_cardiac, true]; r_player_unconsciousInProgress = false; 4 cutRsc ["default", "PLAIN",1]; if (player == vehicle player) then { // "AinjPpneMstpSnonWnonDnon" rolls from back first (jarring transition if player was knocked out prone or fell to stomach) [nil, player, rSWITCHMOVE, "AmovPpneMstpSnonWnonDnon_healed"] call RE; player SWITCHMOVE "AmovPpneMstpSnonWnonDnon_healed"; PVDZ_plr_SwitchMove = [player,"AmovPpneMstpSnonWnonDnon_healed"]; publicVariableServer "PVDZ_plr_SwitchMove"; //Needed to execute switchMove on server machine. rSwitchMove only executes on other clients player playMoveNow "AmovPpneMstpSnonWnonDnon_healed"; }; 10 fadeSound 1; "dynamicBlur" ppEffectAdjust [0]; "dynamicBlur" ppEffectCommit 5; "colorCorrections" ppEffectAdjust [1, 1, 0, [1, 1, 1, 0.0], [1, 1, 1, 1], [1, 1, 1, 1]];"colorCorrections" ppEffectCommit 5; if ({getNumber (configFile >> "CfgWeapons" >> _x >> "type") in [1,2]} count (weapons player) > 0) then { //Prevent firing while weapon is still shown on back or holstered. AmovPpneMstpSnonWnonDnon_healed has disableWeapons=0 in config (should be 1) waitUntil {uiSleep 1; !(animationState player in ["ainjppnemstpsnonwnondnon_rolltofront","amovppnemstpsnonwnondnon_healed","amovppnemstpsnonwnondnon"])}; }; //once more to be safe disableUserInput false; disableUserInput false; disableUserInput true; disableUserInput true; disableUserInput false; disableUserInput false; r_player_unconsciousInputDisabled = false; //diag_log [ __FILE__, diag_tickTime, "done" ]; Копать тут или где-то в другом месте?
    • By vitacite
      Бесплатные проекты - "пацаны собрались и замутили сервачок" долго не живут.  В этом я убеждался много раз. Нет сначала на интузиазме эффективность неплохая, но затем все это затухает управляемость команды падает.  Начинаются вопросы - "а почему это должен делать я?",  отмазки "да я на даче сегодня", "да у меня командировка" и тд...  + кто-то должен спонсировать оплату сервера, антидудосов и прочей лобуды, а такого человека интерес тоже может пропасть в любой момент. А чтобы проект был хороший - кому-то надо реально "въебывать", как на второй работе, и  кому-то постоянно вливать туда бабло.
      Поэтому, лично я, считаю любой некоммерческий проект заранее проваленным!  Побегать недельку другую с друзьями это да. Что-то более серьезное, не тратьте свои силы и время! Как минимум на  тему сталкера я таких проектов видел 10 штук и в некоторых даже сам поучаствовал. Начиналось все амбициозно и даже набирало онлайн до 100 человек. Но заканчивалось все одинаково 3-4 месяца и с десято скучающих тел, на безлюдном сервере.  С точки зрения администации, игроки ведут себя как проститутки, бегая с сервера на сервер, друзья перешли, или потому что на том добавили новый прикольный скрип, или прикольную тачку, или тут плохой пинг, а там хороший, или админ козел забанил за читы и тд.  а все эти приколюхи требуют денег, а игровое сообщество не очень расположено их платить за некачественный контент. Да и сама администрация достаточно быстро забивает и расслабляется.
      (я сейчас не говорю о конкретном проекте, скорее это собирательный образ халявы).
       
      А теперь по-существу.  Так сколько должен стоить контент с хотя бы приемлемым качеством?  

      Свое мнение я написал ниже.
       
       
      Спасибо за внимание.
       
      А что думаете Вы напишите ниже в комментариях!
       
       
    • 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-конвертер в интернете, например: https://www.tutorialspoint.com/execute_python_online.php
      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. Получить результат

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
       
      Как получить 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() 2. Вставить в поле ввода UID(Steam64ID) ваш Steam64ID
      3. Нажать кнопку конвертирования или исполнить код, и получить в готовом виде Battleye GUID
       
      Возможно имеются и другие методы и наработки в получении данных идентификаторов более простыми методами, на других языках, либо автоматически. Я описал лишь известные мне.
      Все желающие могут добавить в комментариях свои способы конвертаций, возможно это поможет кому-либо.
  • 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.