# 00091. Создания собственных классов и кейвордов

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

× **ВАЖНО:** делайте резевную копию редактируемых файлов

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

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

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

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

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

```
ini
0A93=end_cleo
```

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

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

× \*\*Примечание:\*\* старайтесь избегать кириллических символ, используйте только латинские

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

```
ini
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**. Для этого добавить его название в список классов:

```
ini
#CLASSESLIST
Actor
Camera
...
Garage
File
Audiostream

Animation

...
```

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

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

#EOF
```

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

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/44166367.jpg)

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

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

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

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

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

| Номер | Опсиание             | Пример                                                    |
| ----- | -------------------- | --------------------------------------------------------- |
| 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:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/36444738.png)

Так как в нас есть ещё проверка и выгрузка анимации, то, по примеру, создадим соответствующие функции для класса "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:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/1/00797942.png)

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

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

На этом всё. Этот урок будет полезно изучить уже опытным скриптерам, так как это сократит время написание скрипта до минимального. Минус такого подхода - ваш код не скомпиллируется на других машинах, что влияет на некоторые возможности, таких как помощь с кодом от опытных скриптеров или его предоставление новичкам.|1200|1|0|44166367`jpg`405`109`400`107``\|36444738`png`497`142`400`114``\|00797942`png`500`300`400`240``||sozdanija\_sobstvennykh\_klassov\_i\_kejvordov|1504423261
