Рейтинг - 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

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

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

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

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

 

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

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

 

 

Code
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.
("Список параметров") - собственно перечисление передающихся параметров. Каждый параметр имеет свой тип данных. Всего их шесть. Вот таблица:

 

 

Code
%h - указатель на субъект
%v - строка (LongString)
%b - булево (false или true)
%s - строка (ShortString)
%f - дробное число
%i - целое число

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

 

 

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

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


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

 

 

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

По-сути класс Animation вышел полным аналогом класса Model. Проверим на примере наш класс:

 

 

Code
{$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:


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

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

 

Вход на сайт

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

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

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