NoNameUltima

DLL для связки скриптов ARMA 2, и ini файлов. + Скрипт на новогодние подарки от снеговика + елка)))

6 сообщений в этой теме

1) Название программы

ultima.dll
2) Описание функционала и особенностей

Полное описание, дано в низу
3) Наличие лицензии (только для ПО)

Отсутствует.(но если будет в паблике на шару, - добавим))))
4) Цена ПО

150 в данный момент.
5) Контактная информация

В подписи
6) Скриншоты функционала

эмм, у dll отсутствуют)

 

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

Клиент-Серверный скрипт, для выдачи подарков от снеговика, игрокам Вашего сервера.))))

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

 

Подбегая к снеговику, у игрока появляется пункт - ПОДАРОК

 

Сам подарок, вы можете изменить, в скрипте) - Достаточно вписать другой предмет.

 

Помимо скриптов на выдачу подарка, вы получаете скрипт с елкой, с шариками)) снеговиком в Старом Соборе(для карты Чернорусь).

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

 

Помимо этого Вы получаете DLL, для использования в своих целях.

Полное АПИ, вы вы можете посмотреть у меня на сайте(или где то тут так же выкладывал).

С помощью нее, вы можете из скриптов, без всяких БД, хранить свои переменные и т.п. в ini файлах.

 

Предновогодняя стоимость 150р, за все вместе))

 

Порадуйте своих игроков)))

 

P.S. Скопирую тему в скрипты так же, т.к. вроде не только DLL...

 

Что умеет DLL:

  • Писать в ini файл.
  • Читать из ini файла.
  • Протоколировать события, - ошибки(опционально).

Что есть ini файл:

ini это простые файлы, обычно используемые для хранения конфигураций, и настроек.
В ini файлах, есть секции, ключи, и значения ключей.

Пример файла:

*****************************************************************************************************************************************

[секция 1]
ключ секции 1=значение ключа
еще ключ секции 1=значение ключа

[секция 2]
ключ секции 2=значение ключа
еще ключ секции 2=значение ключа
еще один ключ секции 2=

*****************************************************************************************************************************************


*Секции не должны иметь одинаковые имена.
Ключи внутри своей секции, так же не должны иметь одинаковые имена.
Значения заполняете вы. Можно оставить значение пустым.


Пример файла, с UID'ами игроков в качестве секций, и для каждого игрока, храним баланс и рейтинг:

*****************************************************************************************************************************************

//    Секция игрока с юидом 1123324234
[1123324234]
balance=999
rating=1

//    Секция игрока с юидом 2342342344
[2342342344]
balance=123
rating=2

*****************************************************************************************************************************************

Что такое API:
    Это набор команд, для использования DLL в своих проектах.

API:(Как использовать DLL в скриптах)

   Ограничения:

  •        Вы не можете использовать символ | в названиях секций, или ключей, или значений ключей. Он используется как разделитель.
  •        Все что вы передаете в DLL, прийдет туда в виде текста.
  •        Все что вы получаете из DLL, приходит в виде текста.

        *Кто не понял, уловите разницу:
            [_xxx[0,1,2]
            и
            "[_xxx[0,1,2]"

        Так что если Вы вздумаете пихать туда массивы, объекты и т.п. то учтите:
           При чтении из файла, вам вернут их как текст, и Вам придется преобразовывать этот текст функциями ARMA2.

           Примерно так:

 

            _result_array  =       call compile format ["%1", _result_array];
 

 

  •  Есть ограничения на длину передаваемой
    строки, от DLL, и в DLL. Так что не пытайтесь передать туда, или обратно 100500 символов.

API с описанием и примерами:

 

 

*****************************************************************************************************************************************

Ключи команд для отправки в DLL:

*****************************************************************************************************************************************

    0      :    Инициализация, или переинициализация для DLL.
                Перед началом работы с каким либо ini файлом, Вам необходимо отправить в DLL пакет инициализации, в котором указать, с каким файлом, вы хотите работать.
                Если Вы не планируете в ходе работы переключатся на другой ini файл, то данный скрипт, должен отправить данные ОДИН раз. Т.е. - нет необходимости перед каждым запросом его выполнять!
    1      :    Запросить кол-во секций.
    2      :    Запросить кол-во ключей в секции.
    3      :    Запросить имя секции по порядковому номеру.
    4      :    Запросить имя ключа, в указанной секции, по порядковому номеру.
    5      :    Проверить наличие секции в ini файле. (Если секция есть, в ответе прийдет - "SECTION_TRUE", если нет, в ответе прийдет, - "SECTION_FALSE").
    6      :    Проверить наличие ключа в секции, ini файла. (Если ключ есть, в ответе прийдет - "KEY_TRUE", если нет, в ответе прийдет, - "KEY_FALSE").
    7      :    Удалить секцию.
    8      :    Удалить ключ в секции.
    9      :    Записать ключ и значение в секцию(Если секции не существует, - она будет создана. Если не существует ключ, - он будет создан).
    10    :    Запросить значение по имени секции и ключу.
    *Во всех ответах, так же может прийти "DLL_ERROR", если что то пошло не так. Смотрите debug.txt

*****************************************************************************************************************************************

Пример переменных, которые мы будем использовать:

*****************************************************************************************************************************************

  •     _DLL_name          -    Имя dll. Должна быть в папке с игрой.
  •     _DLL_command    -    Команда которую мы будем отправлять в DLL
  •     _ini_file                  -    Полный путь и имя ini файла.
  •     _section_count      -    Кол-во секций в файле.
  •     _key_count            -    Кол-во ключей в секции.
  •     _ini_section            -    Секция.
  •     _ini_key                  -    Ключ.
  •     _ini_value               -    Данные которые будут записаны по ключу секции.
  •     _ini_log                   -    Надо ли протоколировать запись в файл debug.txt. 0 - Нет. 1 - Да.
  •     _answer                  -    Переменная в которой будет ответ, после запроса к DLL.

*****************************************************************************************************************************************

Скрипты:

*****************************************************************************************************************************************

Инициализация DLL:

*****************************************************************************************************************************************
 

 

Private ["_DLL_name","_DLL_command","_ini_file","_ini_log"];
_DLL_name = "ultima"; //        Указываем имя dll файла(Должен быть в папке с игрой - ultima.dll).
_DLL_command = "0"; //  Указываем, что это пакет инициализации.
_ini_file = "C:\test\test.ini"; //      Указываем путь и имя ini файла.
_ini_log = "0" // Указываем, - будем ли протоколировать события в debug.txt при запросах.
_DLL_name callExtension format["%1|%2|%3",_DLL_command,_ini_file,_ini_log];
 

 



или так:

*****************************************************************************************************************************************
 

 

"ultima" callExtension "0|C:\test\test.ini|0";
 




*После данной инструкции,
DLL откроет файл по указанному пути, и будет работать только с ним, при
поступающих запросах из скриптов.

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


*****************************************************************************************************************************************

При обращении к DLL вы
можете получать ответ в Вашу переменную, назовем ее: _answer. Если ответ
не нужен, можно использовать прямой запрос.

т.е. :

*****************************************************************************************************************************************

    В DLL будет отправлена инструкция. Ответ будет помещен в переменную _answer

 

_answer = _DLL_name callExtension format["%1|%2",_DLL_command,_section];
 

 


       

    В DLL будет отправлена инструкция. В ответе нет необходимости.
 

 

_DLL_name callExtension format["%1|%2",_DLL_command,_section];
 

 




    Получить кол-во секции:

*****************************************************************************************************************************************
 

 

_section_count = parseNumber(_DLL_name callExtension format["%1",_DLL_command]);
 

 




    Получить кол-во ключей в секции:

*****************************************************************************************************************************************

 

_key_count = parseNumber(_DLL_name callExtension format["%1|%2",_DLL_command,_section]);   
 

 



    Получить все секции:    

    *Из-за ограничения на кол-во символов, при передаче из DLL в ARMA2, изначально вам следует запросить кол-во, а потом в цикле запросить  каждую секцию по отдельности. Так же с ключами).

*****************************************************************************************************************************************
 

 

for "_i" from 0 to _section_count do
{
_answer = _DLL_name callExtension format["%1|%2",_DLL_command,_i];
//В _answer будет имя текущей секции, куда его девать решайте сами(Массив, или объеденить в строку...).
};  
 

 



    Чтение ключей всей секции:  

*****************************************************************************************************************************************

 

for "_i" from 0 to _key_count do
{
_answer = _DLL_name callExtension format["%1|%2|%3",_DLL_command,_ini_section,_i];
//В _answer будет имя текущего ключа секции, куда его девать решайте сами(Массив, или объеденить в строку...).
};
 

 

 

    Проверка наличия секции:

*****************************************************************************************************************************************
 

 

_answer = _DLL_name callExtension format["%1|%2",_DLL_command,_section];
 

 



    Проверка наличия ключа в секции:

*****************************************************************************************************************************************

 

_answer = _DLL_name callExtension format["%1|%2|%3",_DLL_command,_section,_key];
 

 

    Удаление секции:

*****************************************************************************************************************************************
 

 

_answer = _DLL_name callExtension format["%1|%2",_DLL_command,_section];
 

 



    Удалить ключ в секции:

*****************************************************************************************************************************************
 

 

_answer = _DLL_name callExtension format["%1|%2|%3",_DLL_command,_section,_key];
 

 




    Записать ключ и значение в секцию:

*****************************************************************************************************************************************
 

 

_answer = _DLL_name callExtension format["%1|%2|%3|%4",_DLL_command,_section,_key,_value];
 

 



    Прочесть значение по имени секции и ключу:

*****************************************************************************************************************************************

 

_answer = _DLL_name callExtension format["%1|%2|%3",_DLL_command,_section,_key];
 

 



*****************************************************************************************************************************************    

Примеры для скриптинга:

*****************************************************************************************************************************************

Как прочесть из файла по ключу значение, и сделать его числом, или строкой

Помните пример ini файла выше? -
[2342342344]
balance=123
rating=2

 

Например нам нужен рейтинг - raiting, игрока с UID 2342342344

*****************************************************************************************************************************************

 

 

Private ["_DLL_command","_section","_key","_answer"];
_DLL_command = "7";
_section = "2342342344";
_key = "raiting";
_answer = _DLL_name callExtension format["%1|%2|%3",_DLL_command,_section,_key];
// Если нужно число, раскоментировать строку, ниже
//_answer = parseNumber(_answer);
 

 


*****************************************************************************************************************************************
 

P.S.
Вы можете составлять запросы в строке, без форматирования текста.
т.е. Вместо всего примера выше, можно написать так:

 

 

Private ["_answer"];
_answer = "ultima" callExtension "7|2342342344|raiting";
// Если нужно число, раскоментировать строку, ниже
//_answer = parseNumber(_answer);
 

 

 




Стоимость DLL: 150(До 01.01.2015).

Ссылка для оплаты: http://rnrportal.ru/donat/

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


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


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

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

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

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


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

Войти

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


Войти сейчас

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

    • Автор: NoNameUltima
      Удалено.
       
       
       
       
       
    • Автор: NoNameUltima
      т.к. надоело отвечать в скайпе, на одни и те же вопросы, создам небольшой FAQ, по данной сборке:
      http://s-platoon.ru/index.php?/topic/1808-sborka-servera-arma-2-oa-dayz-epoch-ultima/
       
      FAQ потихоньку, буду дополнять.
      Обладатели сборки - можете свои вопросы задавать тут.
       
      В:
          Как добавить торговца?
      О:    
          Открываем файл:
              ...\dayz_server\missions\Ваша_Миссия\custom\Ultima_Map_Objects\Ultima_Maps_Objects_Traders.sqf
          После строки(для примера со сборки Черно):
              ,["Rocker2", [7083.7, 2516.5, 0], 0]     Добавляем своего торговца: (X, Y, Z - координаты. А - угол поворота(зрения) модели)
              ,["Скин", [X, Y, Z], A] В:
          Как добавить созданному торговцу меню торговли?
      О:
          Открываем файл:
              ...\dayz_server\missions\Ваша_Миссия\custom\Ultima_Client\Ultima_Trade\Ultima_Trade_Configs.sqf
          В секцию Private, добавляем переменную, в которой будут координаты вашего торговца:
              Было
                  Private ["_Klen", "_Stary", "_Bash", "_Cherno", "_Hero", "_Bandit", "_Aero", "_Whole", "_Boat"];           Стало:
                  Private ["_Klen", "_Stary", "_Bash", "_Cherno", "_Hero", "_Bandit", "_Aero", "_Whole", "_Boat", "_MyTrader"];       Следующей строкой (под секцией Private) прописываем координаты своего торговца(X, Y - координаты):
              _myTrader    =    [11440, 11362];            Далее проматываем список товаров идущих ниже, и добавляем своему торговцу в каждый раздел, его товары.
          Например, - чтобы добавить glock17, ищем секцию пистолетов:
              *Было
              ["Пистолеты",                 [                     ["Colt1911",100,5,10,0, [ _Stary, _Bash ] ]                     ,["revolver_gold_EP1",100,5,10,1, [ _Klen, _Cherno ] ]     И вниз дописываем свой товар:
              *Стало:
       
              ["Пистолеты",                 [                     ["Colt1911",100,5,10,0, [ _Stary, _Bash ] ]                     ,["revolver_gold_EP1",100,5,10,1, [ _Klen, _Cherno ] ]                     ,["glock17_EP1",100,5,10,1, [ _MyTrader ] ]       Так, же можно добавить своемй торговцу, уже прописаный товар.
          Например, в Старом и Баше продают Кольт1911, Вы можете, просто добавить туда же и своего торговца
       
              ,["Colt1911",100,5,10,0, [ _Stary, _Bash, _MyTrader ] ]        В:
          Где править информацию, справки(той, что в меню SHift+1)?
      О:
          ...\dayz_server\missions\Ваша_Миссия\custom\Ultima_Client\Ultima_Information\Ultima_Information.sqf
          
      В:
          В каком скрипте настройки кика игроков перед рестартом, и времени до рестарта?
      О:
          ...\dayz_server\missions\Ваша_Миссия\custom\Ultima_Scripts\Ultima_Server_Real_Time_To_Client_And_Kick_All_Players.sqf
       
      В:
          Как отключить\подключить скрипт подарка для Нового года?

      О:
          Для отключения меню выдачи подарков, открыть файл:
          ...\MPMissions\Ваша_Миссия\fixes\compile\fn_selfActions.sqf
              Закоментировать, код между строк:
       
      //***********************************************************Новый год****************************************************************** //*********************************************************Конец Новый год************************************************************** В:
          Как отключить некоторые статичные постройки на карте(например, елку и снеговика)?
      О:
          Все статичные постройки и объекты на карте находятся в файле:
          ...\@DayZ_Epoch_Server\addons\dayz_server\missions\Ваша_Миссия\custom\Ultima_Map_Objects\Ultima_Maps_Objects_Load_Objects.sqf
          *Для примера отключения елки и снеговика, - закоментировать строку:
      ,"Snow_Man"
          **Для удаления отдельно выбраного объекта, с какой либо территории, - открыть соответствующий постройке файл, в этой же папке, и закоментировать, или удалить данный объект.
      В:
          Как отключить скрипт, например - гонки на технике?
      О:
          Все статичные скрипты, и запускаемые отдельно находятся в файле -
              ...\@DayZ_Epoch_Server\addons\dayz_server\missions\Ваша_Миссия\mission.sqf
      // Загрузка объектов карты - статика
       
               "Ultima_Map_Objects\Ultima_Maps_Objects_Load_Objects" // Гонки на технике         ,"Ultima_Missions\Ultima_Race\Ultima_Race_Init" // Инстанс         ,"Ultima_Quests\missions\Instance_1\init" // Бан чата         ,"Ultima_Scripts\Ultima_Ban_Chat" // Создание техники, каждый рестарт, без сохранения в БД, с ключем от нее в рядом стоящем ящике         ,"Ultima_Scripts\Ultima_Create_Locked_Vehicles_Every_Restart" // Создание рудников         ,"Ultima_Scripts\Ultima_Create_Veins" // Создание ящиков  с лутом, на карте         ,"Ultima_Scripts\Ultima_Loot_Box" // Кик всех игроков перед рестартом, и врея до рестарта         ,"Ultima_Scripts\Ultima_Server_Real_Time_To_Client_And_Kick_All_Players" // Очистка техники в указаных местах         ,"Ultima_Scripts\Ultima_Sectors_Clear_Vehicles" // Серверный урон технике в указанных местах, при въезде на данную територию         ,"Ultima_Scripts\Ultima_Sectors_Damage_Vehicles"
    • Автор: СЕРГЕЙ
      Примеры, по использованию 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 с офф сайта: 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/         
    • Автор: NoNameUltima
      Текущяя версия: v.1.7.8

      Для начала, немного скриншотов:

       



       

      Думаю пока достаточно скринов.


      Теперь описание всего этого -

      Что входит в сборку:

       Архив с дополнениями серверной и клиентской части Epoch.(см. сноску ниже!).  EpochUltima Программа для работы и администрирования сервера. beta! тестировалась на картах Чернорусь, Напф.
      Стоимость 1500

      В архиве:


      Переработанные файлы торговцев для карт Chernarus, Napf. - Так необходимо для оптимизации, и взаимодействия с программой.

      *Под другие карты так же не проблема переработать. Пишите, если нужны.

      Небольшие фиксы под сервера 1.63 112555(так же подходят и отлично работают на 1.62 и предыдущих патчах).

      Конфиги кастом-лута.

      Возможности программы:

           Автозапуск на старте windows      Запуск RCon на старте программы      Запуск задач на старте программы      Автоматическое сворачивание сервера в трей при запуске      Проверка длины имени игрока при коннекте      Проверка недопустимых символов в нике игрока при коннекте      Проверка зарезервированных администрацией слотов при коннекте      Сообщения в чат по заданному интервалу      Сообщения в чат по  времени      Сообщения в чат по дню недели      Команды серверу по заданному интервалу      Команды серверу по  времени      Команды серверу по дню недели      Получение полного списка банов удаленно, про протоколу http и
      склеивание его со своим списком, исключая дубликаты. При рестартах
      сервера.      Смена игрового времени при рестарте сервера      Автоматическая чистка БД      Чистка аккаунтов на которые не заходили N дней      Удаление техники, поврежденной на N процентов      Удаление не закрываемой техники, если ее не использовали N часов      Нанесение X урона объектам карты, раз в N суток      Автоматическое пополнение товаров торговцам      Оптимизация БД      Сохранение любых файлов журнала при рестарте и удаление старых      Дамп БД по установленному интервалу времени      Возможность сохранять дампы на Yandex.disk      Настраиваемый вид консоли сообщений сервера(цвет)      Белый список игроков      Список администрации      Работа со списком банов - поиск дубликатов\объединение списков      Панель администрирования игроков на сервере - бан\личное сообщение\кик      Отсылка сообщений в чат от имени администратора      Карта отображающая любые заданные вами объекты      Добавление собственных иконок для карты      Создание разделов отображающих группы объектов карты      Быстрый просмотр текущих журналов сервера      Сохранение настроек файлов, для применения при обновлении сервера      Телепортация игроков из лобби, или когда их нет в игре, используя БД(без захода в игру)      Создание собственного списка точек телепортации, для быстрого использования.      Добавление и удаление торговцев      Добавление, редактирование, удаление разделов торговли      Добавление, удаление, редактирование ассортимента торговли      Добавление предметов из собственных сборок в ini файл программы      Конфигурирование техники спаунящейся на карте(кол-во, тип техники)      Оптимизатор скриптов построек, и торговцев.      Редактирование спавна, точек спавна, зданий, предметов, групп
      предметов, шанса спавна предметов, добавление собственных точек, шансов
      спавна зомби, типов спавна зомби и др.

       
       Программа регистрируется с привязкой к железу.



       Вам выдается 2 ключа на 2 компьютера.

       При утере ключа, или смене железа:

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

          1. Он будет выдан вам, только при условии, что предыдущий ключ был выдан не менее 2 месяцев назад.

          2. В любом случае, ключ выдается только 2 раза. Не считая выдачу ключа при покупке.

      В любом другом случае - Вам будет отказано в генерации нового ключа.

       
      Сайт http://rnrportal.ru/dzeu/

      Форум http://rnrportal.ru/forum/