- Писать в 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 БД
Функции шифрования серверных скриптов, и обратной их дешифровки, по указанному Вами ключу, для ваших последующих продаж(полезно скриптописателям, которые беспокоятся за перепродажу своих скриптов).