Уроки Pawno: інклуди Dini та mxINI

7 квітня 2013
TheDuke

Даний урок розповість вам про функції інклудів Dini та mxINI. Також ви навчитеся користуватися цими інклудами.

Вітаю дорогих читачів.

Задумався над питанням, чому я довго не писав статті сюди. Подивившись категорію "Посібники" у файловому архіві GTA SA, я подумав - там дуже мало хороших якісних посібників, і я вирішив написати свій, як кажуть, продовжити розпочату справу. Оскільки зв'язок з BadMan'ом тримати в скайпі не можу, пишу особисто від себе.

Почну зі слова Інклуд.

Include (Інклуд) - це система функцій для скрипта. Основним інклудом є "a_samp" - він завжди має бути у скриптах.

Сьогодні ми вивчимо два простих інклуда - Dini та mxINI. Для тих, хто не знає, що це за інклуди - це прості файлові інклуди для SAMP сервера. Тобто файловий система для SAMP. Ця файлова система не служить для зв'язки сайту та сервера - цим займається MySQL або навіть SQLite, про які я напишу трохи пізніше (в наступних уроках).

Як записати include?

#include IncName

# - підключення

include - позначення підключення інклуда

IncName - як вже зрозуміло - назва інклуда.

В основному люди пишуть назву інклуда без формату файлу (наприклад #include a_samp), але й з форматом також правильно, і помилкою не вважається (наприклад #include a_samp.inc). Ми будемо підключати один з двох інклудів - Dini та mxINI (якщо вони є в папці "Ваш_Сервер/pawno/includes")

#include mxINI
#include Dini

Отже - чим же все-таки відрізняються ці системи?

Dini - більш функціональна файлова система в плані назв функцій, але вона повільно передає і отримує значення.

mxINI - менш функціональна файлова система в плані назв функцій, але швидше отримує значення.

У минулих уроках ми вивчали функції виклику повідомлень у чат або на екран (Send...Message, GameText...). Так от тут вони можуть нам знадобитися. Ми не проходили форматування тексту. Щоб продовжити, нам знадобиться функція форматування.

format(name, sizeof(name), "Text", Text Strings);

format - назва функції форматування

name - назва форматованого тексту (повинен бути певний масив "New")

sizeof(name) - змінна від масиву name

"Text" - текст всередині форматування

Що він із себе представляє? Звичайний текст, в який можна вставити певні задані значення/назви.

Власне, які значення/назви:

%s - Текстове значення (+ якщо є числове)
%d - інтегроване числове значення (наприклад playerid)
%i - інтегроване значення (задане певним масивом "New")
%c - символ
%f - десяткове числове значення (наприклад відстань до певної точки)
%x - номер
%% - відсоток значення

І, нарешті, Text Strings - значення тексту (наведеного в CODE (%s, %d і т.д.))

Створимо простий текст:

new code[30]; // Створюємо масив в 30 символів тепер нам доступно
new name[24]; // Створюємо масив в 24 символа - максимальна кількість символів в імені гравця (замість name може бути будь-яке інше слово, тільки якщо ви зібралися змінювати його - змінюйте всі name масиви в коді)
GetPlayerName(playerid, name, 24); //Дізнаємося ім'я гравця (можна використовувати ще так: GetPlayerName(playerid, name, sizeof(name)); - sizeof(name) само визначить, яке значення змінної у масиву name)
format(code, 30, "Ваш нік %s, ваш ID - %d", name, playerid);//Перевіряємо нік гравця і його ID
SendClientMessage(playerid, -1, code);// Відправимо відформатоване повідомлення "code" в чат білим кольором (-1)

Досить проста функція.

Отже. Тепер почнемо вивчення цих файлових систем. Почнемо з перевірки на наявний файл.

Dini:

dini_Exists("filename.fmt")

filename.fmt - назва файлу в лапках (можна використовувати відформатований текст). В кінці filename повинен бути формат файлу (наприклад .txt, або .ini, або .cfg і т.д.)

mxINI:

Такої функції не існує, але можна використовувати стандартну файлову систему:

fexist("filename.ini")

filename.ini - такий же як на Dini, але для mxINI читається тільки .ini формат

Наприклад, зробимо перевірку на існуючий файл main.txt (зберігається все і читається завжди з папки scriptfiles) на Dini

if(dini_Exists("main.txt")) SendClientMessage(playerid, 0xFF0000FF, "Файл main.txt існує")

Або ж на FSAMP (Стандартна файлова система, оскільки mxINI не має такої функції)

if(fexist(main.txt)) SendClientMessage(playerid, 0x00FF00FF, "Файл main.txt існує");

Наступною функцією буде створення файлу.

Dini:

dini_Create("filename.fmt")

filename.fmt - як зазвичай

mxINI:

new file = ini_createFile("filename.ini")

new file - Створюємо файл

filename.ini - як зазвичай, але формат .ini

Наприклад, створимо простий файл на Dini

dini_Create("Main.txt");
if(dini_Exists(Main.txt)) SendClientMessage(playerid, 0xFF00FFFF, "Файл Main.txt створено");

І на mxINI:

new PlayerFile = ini_createFile("Main.ini");
if(fexist(Main.ini)) SendClientMessage(playerid, 0xFF0000FF, "Файл Main.ini створено");

Наступною функцією буде відкриття файлу.

Dini:

Цієї функції немає, але вона і не потрібна, оскільки dini_Exists("filename") одразу відкриває файл.

mxINI:

new file = ini_openFile("filename.ini");

Наприклад, відкриємо файл на mxINI (оскільки приклад з Dini - dini_Exists вже розглянуто)

new File = ini_openFile("Main.ini");

Наступною функцією буде закриття файлу.

Dini:

В Dini не знадобиться ця функція, оскільки файл не відкривається, а перевіряється і одразу читається при встановленні значень (функції нижче)

mxINI:

ini_closeFile(file)

file - це створений масив з змінною файлу

Наприклад, відкриємо і закриємо файл на mxINI:

new FileName = ini_createFile("Main.ini");
ini_closeFile(FileName);

Наступною функцією буде видалення файлу.

Dini:

dini_Remove("filename.fmt")

mxINI:

Цієї функції немає, але можна використовувати стандартну файлову систему:

fremove("filename.ini")

Наприклад, створимо і видалимо файл на Dini:

dini_Create("Main.ini");
dini_Remove("Main.ini");

і на mxINI

new ForFile = ini_createFile("Main.ini");
fremove("Main.ini");

Наступними функціями будуть записи у файл.

Dini:

dini_Set("filename.fmt", "Line", "Text"); //Встановлення текстового значення
dini_IntSet("filename.fmt", "Line", value); //Встановлення числового значення
dini_FloatSet("filename.fmt", "Line", floatvalue); //Встановлення числового десяткового значення
dini_BoolSet("filename.fmt", "Line", boolsmb);//Встановлення правдивого/брехливого значення

filename.fmt - Назва файлу з форматом

Line - Рядок (назва)

Text - Текст у рядку

value - числове значення

floatvalue - десяткове числове значення

boolsmb - значення правдиве/брехливе (тут тільки true або false)

mxINI:

ini_setString(File, "Line", "Text"); //Встановлення текстового значення
ini_SetInteger(File, "Line", value); //Встановлення числового або правдивого/брехливого (1 або 0) значення
ini_setFloat(File, "Line", floatvalue); //Встановлення числового десяткового значення

File - створений файл (new File = ini_...File("filename.ini");)

Line - рядок

Text - текст

value - числове значення (для брехливого/правдивого використовуються 1 або 0)

floatvalue - десяткове значення

Наприклад створимо файл з тестовими (TEST) даними на Dini:

dini_Create("main.txt");
dini_Set("main.txt", "Тест", "Цей рядок позначає тестове значення"); // Припустимо в рядок Тест напишеться текст "Цей рядок позначає тестове значення"
dini_IntSet("main.txt", "Значення", 5); //Припустимо значення = 5
dini_FloatSet("main.txt", "Десяткове значення", 10.261); //Припустимо запишемо значення 10 цілих, 261 тисячна.
dini_BoolSet("main.txt", "Цей файл є в папці scriptfiles?", true); // Записано значення true до звичайного, нічого не робочого тексту
dini_Remove("main.txt");

Далі mxINI:

new Test = ini_createFile("Main.ini");
ini_setString(Test, "Рядок", "Це дійсно рядок"); //Створимо рядок "Рядок", і запишемо в нього текст "Це дійсно рядок"
ini_setInteger(Test, "Зараз який рік?", 2013); //Створимо рядок про рік, і  запишемо в нього інформацію про цей рік.
ini_setFloat(Test, "Максимально допустиме значення", 12.5); //В рядок зі значенням запишемо десяткове число
fremove("Main.ini");

Наступними функціями будуть читання файлів

Dini:

dini_Get("filename.fmt", "Line"); //Читання текстового значення з рядка
dini_Int("filename.fmt", "Line"); // Читання числового значення з рядка
dini_Float("filename.fmt", "Line"); // Читання десяткового значення з рядка. Перевірка записується через "new Float:NAME" (приклад нижче)
dini_Bool("filename.fmt", "Line"); // Читання булевого (true/false) значення з рядка. Перевірка записується через "new bool:NAME" (приклад нижче)

mxINI:

ini_getString(File, "Line", returnSave); //Читання текстового значення рядка, і збереження цього тексту
ini_getInteger(File, "Line", returnSave); //Читання числового/булевого (true/false) значення рядка, і збереження цього значення
ini_getFloat(File, "Line", returnSave); //Читання десяткового значення рядка, і збереження цього значення

File - створений файл (new File = ini_...File("filename.ini");)

Line - Рядок

returnSave - збереження (оголошувати через new)

Наприклад прочитаємо створені вище значення через Dini:

if(dini_Exists("Main.txt"))
{
    SendClientMessage(playerid, 0xFF0000FF, dini_Get("Main.txt", "Тест")); //Визначимо рядок з текстом, прочитаємо, і одразу ж виведемо
    SendClientMessage(playerid, 0x00FF00FF, dini_Int("Main.txt", "Значення")); //Визначимо рядок зі значенням, прочитаємо, і відразу ж виведемо
SendClientMessage(playerid, 0x0000FFFF, dini_Float("Main.txt", "Десятичне значення")); //Визначимо рядок з десятковим значенням, прочитаємо, і відразу ж виведемо
SendClientMessage(playerid, 0xFFFF00FF, dini_Bool("Main.txt", "Цей файл є в папці scriptfiles?")); //Визначимо рядок з буловим (true/false) значенням, прочитаємо, і відразу ж виведемо
}

І зробимо таку ж дію на mxINI:

if(fexist("Main.ini")) // Якщо файл існує
{
    new Req = ini_openFile("Main.ini"); //То відкриємо його
    new returnStr[18], returnInt, returnFloat;
    ini_getString(Req, "Рядок", returnStr); //Визначимо рядок, і запишемо його дані в returnStr
   ini_getInteger(Req, "Зараз який рік?", returnInt); //Визначимо рядок, і запишемо її дані в returnInt
ini_getFloat(Req, "Максимально допустиме значення", returnFloat); //Визначимо рядок, і запишемо її дані в returnFloat
SendClientMessage(playerid, 0xFF0000FF, returnStr); //Виведемо отримане з рядка з текстом
SendClientMessage(playerid, 0x00FF00FF, returnInt); //Виведемо отримане з рядка зі значення
SendClientMessage(playerid, 0x0000FFFF, returnFloat); //Виведемо отримане з рядка з десятковим значенням
ini_closeFile(Req); //А потім закриємо відкритий файл
}

Наступними функціями будуть спеціальні файлові системи

Dini:

dini_Isset("filename.fmt", "Line"); // Перевірка - чи має значення рядок
dini_Unset("filename.fmt", "Line"); // Видалення значення одного рядка (Srt, Float, Bool, Int)

mxINI:

ini_removeKey(File, "Line"); // Видалення значення з рядка будь-якого виду (String, Integer, Float)
ini_getErrorInfo("Error"); //Інформація про помилку в текстовому вигляді (про дану функцію нічого не відомо, тому що в інклуді немає stock'a з цією функцією)

Наприклад зробимо просту функцію на Dini:

if(dini_Exists("Main.txt" )) //Якщо існує файл
{
  if(!dini_Isset("Main.txt", "Тест")) //То перевіряємо, чи вільний рядок "Тест"
    {
        dini_Unset("Main.txt", "Тест"); //Якщо зайнята, то очищаємо її
    }
    else if(dini_Isset("Main.txt", "Тест")) //Але якщо вільна
    {
        dini_Set("Main.txt", "Тест", "Просто рядок з цими 9 словами та однією цифрою"); //То встановлюємо їй значення
    }
}

На цьому мій урок по функціям файлової системи закінчено, удачі в скриптингу.

Рекомендовані файли