Рейтинг - 5.0 (1)

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

Очень часто скриптеры хранят какие-то данные в файле. Например: я в моде NFS GTA RACE хранил стартера для миссий, а также текущую модель, уважение в ini-файле.

Рассмотрим основные опкоды. Сначала, обычно, проверяют на существование файла опкодом:

0AAB: file_exists "CLEO\temp.ini"
Здесь:
"CLEO\temp.ini" - путь к нужному файлу

Дальше, обычно, если файла не найден, то скриптеры завершают поток, чтобы скрипт без файла не работал. Если файл найден - то можно.

Первый наш скрипт будет записывать данные. Давайте в файле будет хранится состояние жизни и брони CЖ. Другой скрипт будет считывать с того же самого файла данные и выводить их на экран.

Но сначала рассмотрим структуру ini-файла. Обычно он делится на секции - текст, написанный в квадратных скобках:

[SECTION]

Количество секций неограниченно; а могут и вовсе отсутствовать.

В каждой секции имеются ключевые слова, которым заданы значения типа "int", "float", "string" ( целое, дробное, строка ). Сначала пишем ключевое слово, затем символ =, а потом само значение. Каждое ключевое слово пишется с новой строки.

key_int = 25
key_float = -0.23
key_string = WMYSTERIO

Сложив всё вместе, мы получим полную структуру ini-файла:

Примеры INI-файлов:
Пример 1Пример 2
[SECTION]
key_int = 25
key_float = 1.83
key_string = WMYSTERIO
; Основные данные об актёре
[Coord_Actor]
position_x = -190.35
position_y = 2004.2345
position_z = 39.0
actor_angle = 180.0

[Data_Actor]
Health = 50
Armor = 100
Name = Smoke

Как и в Санни Билдере, в ini-файлах есть комментарии. Всё что находится после символа ; будет игнорироваться. Вроде, с этим не должно возникнуть проблем, поэтому рассмотрим опкоды для записи значений в ini-файл:

0AF1: write_int 25 to_ini_file "CLEO\temp.ini" section "SECTION" key "key_int"
0AF3: write_float 1.85 to_ini_file "CLEO\temp.ini" section "SECTION" key "key_float"
0AF5: write_string "MY NAME - WMYSTERIO" to_ini_file "CLEO\temp.ini" section "SECTION" key "key_string"
Здесь:
0AF1 - опкод записи целого числа в файл
0AF3 - опкод записи дробного числа в файл
0AF5 - опкод записи строки в файл
"CLEO\temp.ini" - указывается полный путь к файлу
"SECTION" - указывается секция, в которую нужно записать данные
"key_int", "key_float", "key_string" - указываются ключи. Именно в них будут хранится данные

Теперь считывание с ini-файла:

0AF0: 0@ = get_int_from_ini_file "CLEO\temp.ini" section "SECTION" key "key_int"
0AF2: 1@ = get_float_from_ini_file "CLEO\temp.ini" section "SECTION" key "key_float"
0AF4: 2@v = read_string_from_ini_file "CLEO\temp.ini" section "SECTION" key "key_string"
Здесь:
0AF0 - в переменную считываются целые значения с файла
0AF2 - в переменную считываются дробные значения с файла
0AF4 - в переменную считываются строки с файла
"CLEO\temp.ini" - указывается полный путь к файлу
"SECTION" - указывается секция, с которой будет считано значение
"key_int", "key_float", "key_string" - указываются ключи. Именно из них будут передаваться данные в переменную.

Для строк всегда возле переменных указывайте префикс v. Опкоды рассмотрели, теперь к примерам :) Скрипт, который будет записывать состояние жизни и брони СЖ в ini-файл:

{$CLEO}
0000:

:WRITE
thread 'WRITE'
wait 0
if
0AAB: file_exists "CLEO\TEMP.ini" // если файл не найден, то завершаем скрипт
jf @WRITE_END

:WRITE_1
wait 0
0@ = actor.Health($PLAYER_ACTOR)
04DD: 1@ = actor $PLAYER_ACTOR armour
0AF1: write_int 0@ to_ini_file "CLEO\TEMP.ini" section "CJ" key "Health" // запишем данные в файл
0AF1: write_int 1@ to_ini_file "CLEO\TEMP.ini" section "CJ" key "Armour"
jump @WRITE_1

:WRITE_END
wait 0
0A93: end_custom_thread

Скрипт, которые считывает данные из файла и выводит на экран состояние жизни и брони CJ:

{$CLEO}
0000:

:READ
thread 'READ'
wait 0
if
0AAB: file_exists "CLEO\TEMP.ini" // Если файл не найден - завершаем скрипт
jf @READ_END

:READ_1
wait 0
03F0: enable_text_draw 1 // Включаем возможность рисования на экране
0AF0: 0@ = get_int_from_ini_file "CLEO\TEMP.ini" section "CJ" key "Health" // Считываем данные из файла
0AF0: 1@ = get_int_from_ini_file "CLEO\TEMP.ini" section "CJ" key "Armour"
{-- Выводим данные на экран --}
045A: draw_text_1number 20.0 20.0 GXT 'HEA_1' number 0@ // text: health ~1~
045A: draw_text_1number 20.0 30.0 GXT 'BRO_1' number 1@ // text: armour ~1~
jump @READ_1

:READ_END
wait 0
0A93: end_custom_thread

Результат, как всегда, положительный :) Всё работает как часики, и на экран выводится состояние CJ:

Интересные факты:

  • ini-файл можно редактировать во время игры;
  • расширение файла не обязательно должно быть "*.ini", можно и как "*.bag", "*.fix" и т.п;

На этом урок окончен. Тестируйте ;)


Yurko_UA   (10.07.12 13:48)
Респект і уважуха!!!

Zaznet   (09.06.13 04:50)
У меня со вторым скриптом игра вылетает, только выбираю сохранение и все, точка. Коментирование построчное привело к команде 0AF0: 0@ = get_int_from_ini_file "CLEO\TEMP.ini" section , при попытке ее выполнить ошибку игры выбивает

Zaznet   (09.06.13 04:52)
а если сделать просто вывод каких то данных присвоенных переменной то они тоже не выводятся на екран вообще

Yurko_UA   (28.02.14 19:09)
А як зашифрувати файл, але щоб він нормально читався скриптом? Так як ти зробив в своїх 4-х гонках.

wmysterio   (28.02.14 19:34)
Я нічого не шифрував там. Я переіменував файли з *.ini на *.lig. Скоріше цей процес можна назвати "замазкував".
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
А вы проходили GTA San Andreas на 100% без читов и скриптов?
Всего ответов: 3
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
wmysterio
Реклама