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

Всем привет! Сегодня мы попытаемся сделать несколько классов, таких как player, actor и добавить ключевые слова.

Начнём с простого. Ключевые слова очень легко добавить. Для начала откроем любым текстовым редактором файл:

X:\...\Sanny Builder\Data\SA\keywords.txt

Как видите, структура файла очень проста:

номер опкодазнак равенстваключевое слово
0001=wait

По-аналогии, добавим в конец файла новый опкод. Например, опкод заканчивающий cleo-поток: 0A93: end_custom_thread. Давайте запишем краткий вариант, так, что бы его можно было быстро запомнить и легко писать. Я, например, использую кейворд - end_cleo. Таким образом нужно добавить в наш файл строчку:

0A93=end_cleo

Как показала практика - быстрота написания скрипта резко увеличилась, так как нет необходимости постоянно искать этот опкод в поиске. Особое внимание нужно обратить на количество параметров ( тип данных ) в кейворде, они должны быть в том же порядке, что и в опкоде, например:

Кейворд:fade 0 1000
Опкод:016A: fade 0 time 1000

Я собрал самое необходимое, на мой взгляд:

0A93=end_cleo
0AB1=function
0AB2=f_ret
0A92=run_cleo_thread
0A94=run_cleo_mission
0169=fade_color
0209=random_int
0208=random_float
0707=goto_scene
0701=end_scene
038B=loading
04E4=renderer

Но я был бы рад, что бы Вы сами для себя собрали такой список, можно и подлиннее =)

Теперь рассмотрим более сложный процесс оптимизации написания кода под скриптеров, а именно - создание и дополнение классов. Для начала рассмотрим структуру файла:

X:\...\Sanny Builder\data\sa\classes.db

Он открывается любым текстовым редактором. Первое, что попадается в глаза - это строчка "#CLASSESLIST". После неё идёт перечень всех классов, которые использует санник. После строчки "#CLASSES" идут перечень классов и методов, свойственны им. Все методы закреплены в блоке $BEGIN ... $END. Ну и завершается файл строкой "#EOF".

Давайте создадим класс Animation. Для этого добавить его название в список классов:

#CLASSESLIST
Actor
Camera
...
Garage
File
Audiostream

Animation

...

После этого переходим вниз файла и добавим блок $BEGIN ... $END для нашего класса:

$Animation
$begin
; здесь будут условия и методы
$end

#EOF

Итак, класс мы создали! Теперь он отображается в нашем списке:

И на этом все возможности и кончились. Возникает вопрос: Как добавить функции? Здесь уже посложнее. Но общий вид такой:

Название функции, опкод, тип, вспомогательной код,("Список параметров")

Название функции - здесь ( без пробелов ) нужно указать название. Так как класс у нас будет об анимациях, то первой функцией будет загрузка нужного IFP-файла, а название - LOAD. Название своё, но для удобства назовём так, как в опкоде.
Опкод - так, как мы загружаем анимацию, нам нужно указать опкод. Естественно наш вариант - "04ED" ( от опкода 04ED: load_animation "LOWRIDER" )
Тип функции - собственно чем будет являться наш метод. Есть 3 типа ( таких, как и в опкодов ):

0Regular ( обычный метод или процедура )
1Conditional ( условие )
2Property ( свойство )

Если наш метод будет загружать анимацию, мы будем использовать тип "0", так как опкод является методом.
Вспомогательной код - это как бы регулировка где будет размещаться переменные:

НомерОпсианиеПример
0в скобках, по спискуactor.SetImmunities($Actor, 1, 1 ,1 ,1 ,1 )
1смещение влево$Actor = actor.create(6, #WMYDRUG, 0.0, 0.0, 0.0)
2смещение вправоObject.KeepInMemory(0@) = true

В нашем случаи нет необходимости смещать параметр влево или вправо, поэтому оставляем "0".
"Список параметров" - собственно перечисление передающихся параметров. Каждый параметр имеет свой тип данных. Всего их шесть. Вот таблица:

ТипОписание
%hуказатель на субъект
%vстрока ( Long String )
%bбулево ( false или true )
%sстрока ( Short String )
%fдробное число
%iцелое число

В нашем случае это строка ( LongString ). Поэтому в скобках мы должны указать этот параметр: ( "%v" ). Между этими параметрами мы можем писать комментарии, что бы у нас была подсказка. Вышла такая строка:

Load,04ED,0,0,("Animation%v")

Сохраняем наш файл и проверяем созданную функцию в SB:

Так как в нас есть ещё проверка и выгрузка анимации, то, по примеру, создадим соответствующие функции для класса "Animation":

Available,04EE,1,0,("Animation%v")
Release,04EF,0,0,("Animation%v")

Класс "Animation" вышел очень похожем на класс "Model". Проверим на примере наш класс:

{$CLEO}
0000:

:NAME
thread 'NAME'
wait 0
Animation.Load("GANGS")

while not Animation.Available("GANGS")
wait 0
end

wait 5000
0812: AS_actor $PLAYER_ACTOR perform_animation "hndshkfa" IFP_file "GANGS" 4.0 loopA 0 lockX 0 lockY 0 lockF 0 time 4700
wait 4700
Animation.Release("GANGS")
end_cleo

Проверка не выдала никаких ошибок как в SB, так и в GTA:

Советы для тех, кто делает классы для своего удобства:

  • Старайтесь что бы названия максимально отличались, но не меняли смысла;
  • Старайтесь делать функции, которые максимально относятся к планируемому классу;
  • Проверяйте новый опкод с уже существующими. Во многих случаях возможно дублирование, что конечно нам не нужно;

На этом всё. Этот урок будет полезно изучить уже опытным скриптерам, так как это сократит время написание скрипта до минимального. Минус такого подхода - ваш код не скомпиллируется на других машинах, что влияет на некоторые возможности, таких как помощь с кодом от опытных скриптеров или его предоставление новичкам.


Теги: classes.db, кейворд, класс, keywords.txt
Вход на сайт

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

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

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