# 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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00100/00400/00091.-sozdaniya-sobstvennykh-klassov-i-keivordov.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
