Перейти к содержимому

DustBlue IPB Skin by CodeGame Networks

DLL для связки скриптов ARMA 2, и ini файлов.

arma2 dayz epoch hiveext hive sql callextension

  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 NoNameUltima

NoNameUltima

    Администратор

  • Администраторы
  • 191 сообщений
  • ГородСанкт-Петербург

Отправлено 10 октября 2014 - 18:15

Что умеет 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 символов.
*****************************************************************************************************************************************

Ключи команд для отправки в 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 : Запросить значение по имени секции и ключу.
11 : Запрос текущей даты и времени. Вернет дату и время в формате yyyy.mm.dd hh:nn:ss *Пример: 2015.01.01 23.30.01
12 : Запрос сравнения дат, для возврата прошедших дней. Вернет кол-во дней прошедших с указанной даты.
13 : Запрос сравнения часов, для возврата прошедших часов. Вернет кол-во часов прошедших с указанной даты.

*Во всех ответах, так же может прийти "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];


Запрос даты и времени:
*****************************************************************************************************************************************
_answer = _DLL_name callExtension ("11");
  
*****************************************************************************************************************************************

Запрос - прошло дней:
*****************************************************************************************************************************************
_answer = _DLL_name callExtension format["12|%1", _date];
  
*****************************************************************************************************************************************  

Запрос - прошло часов:
*****************************************************************************************************************************************
_answer = _DLL_name callExtension format["13|%1", _date];
  
*****************************************************************************************************************************************



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

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

Помните пример 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: 250.

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

P.S.P.S
Возможно, функционал, DLL будет пополняться. Предпологаемые дополнения:
Работа с xml файлами
Работа с sql БД
Функции шифрования серверных скриптов, и обратной их дешифровки, по указанному Вами ключу, для ваших последующих продаж(полезно скриптописателям, которые беспокоятся за перепродажу своих скриптов).





Темы с аналогичным тегами arma2, dayz, epoch, hiveext, hive sql, callextension

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных