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

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

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

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

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

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

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

Примеры, по использованию 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 с офф сайта:
        

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


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





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

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

Советую

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


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

 

 

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

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

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

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


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

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

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


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

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

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

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


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

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

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

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

 

 

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

 

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

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


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

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

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

 

 

 

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

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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: Restplay
      В этой теме находятся подробные видео по установке и настройке сервера Dayz Epoch 1.0.7.1
      Видео будут дополняться установкой дополнительных скриптов, миссий и т.д.
       
      1. Программы для сервера Dayz Epoch 1.0.7.1: 
       
       
      2. Установка сервера Dayz Epoch 1.0.7.1:
       
       
      3. Открыть порты для сервера Dayz Epoch 1.0.7.1
       
       
    • Автор: 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
       
      Возможно имеются и другие методы и наработки в получении данных идентификаторов более простыми методами, на других языках, либо автоматически. Я описал лишь известные мне.
      Все желающие могут добавить в комментариях свои способы конвертаций, возможно это поможет кому-либо.
    • Автор: Restplay
      Здравствуйте, есть ли у кого-нибудь файлы сектора С для карты Napf? На острове, где находится обсерватория Зюренфельд.
    • Автор: 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" ]; Копать тут или где-то в другом месте?
  • Наш выбор

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

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

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