> For the complete documentation index, see [llms.txt](https://lessons.sannybuilder.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lessons.sannybuilder.com/00200/00100/000300.md).

# Наш первый скрипт. Необходимые условия его написания

Первым шагом будет подключения необходимых библиотек для работы. В обозревателе решений выделим папку "Ссылки". Нажимаем `ПКМ->Добавить ссылку...`. В появившемся окне выбираем вкладку "Обзор" и ищем в нём файл "ScriptHookDotNet.dll". Он лежит в папке

```
GTA IV\scripts\for Developers\bin 
```

Нажимаем **Ок**:

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

В этой библиотека находятся все функции GTA 4, которые мы будем использовать в скриптах.

Также нам необходима ещё одна ссылка. Используя метод выше, добавим ссылку "System". Она уже вложена в каталог, поэтому искать её нужно во вкладке ".NET":

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

Минимальные ссылки мы подключили. Теперь можно писать код. В первую очередь нам необходимо подключить пространства имён из этих ссылок. Делается это командой `using`. В поле редактора добавляем следующий код:

```csharp
using System;
using GTA;
```

Теперь мы можем пользоваться командами, находящиеся в этих библиотеках. Дальше мы должны объявить область, которая содержит набор связанных объектов (`namespase`). Обычно это делается как для удобства так и во избежание возможных конфликтов между типами (в разных пространствах имён могут существовать типы с одинаковыми именами).

```csharp
namespace TestScript {

   // Сюда пишем код!
   // Это как область для главного потока 'MAIN' в Sanny Builder.

}
```

Этому пространству обычно дают название такое же, как и название проекта. В нашем случаи это "TestScript". В отличии от SannyBuilder, скобки `{` и `}` являются блоком, внутри которого пишется код. Они всегда должны идти парно, чтобы одна открывала блок, другая — закрывала. В сумме этот блок формирует так званую "область видимости".

Как и известном Sanny Builder, тут присутствуют комментарии. Синтаксис написания таков:

```csharp
код;
код; // Это строчный комментарий!
код;
код;

/* -------------------------------------
А это уже
многострочный комментарий!!!
код; -------------------------------- */

код;
```

В блоке "namespace" нам нужно добавить новый класс с произвольным именем. Это будет как бы аналогом потока в SannyBuilder:

```csharp
public class Thread : Script {

 /* ПРОСТРАНСТВО ФУНКЦИЙ */

} ///////////////////////
```

В нашем случае, мы объявили поток с именем "Thread". "Script" — это класс, который нужен для запуска этого потока. Другими словами эта конструкция "превращает" класс в скрипт, используемый игрой. Символ `:` здесь говорит о том, что все методы, которые есть в классе "Script" будут доступны и в классе "Thread". В C# это принято называть наследованием. Это одна из базовых концепций объектно-ориентированного программирования. Об этих концепциях будут отдельные уроки.

Этот "поток", как Вы уже догадались по скобкам, так же блочный. Внутри его находится область видимости, которое я здесь упрощённо назвал "пространством функций". В нём мы можем размещать различные методы в блоке и прочее. Главная функция, которая начинает поток (что-то вроде `name_thread` в Sanny Builder), имеет следующий синтаксис написания:

```csharp
public Thread() {

 /* ПРОСТРАНСТВО ПОТОКА */

} ///////////////////////
```

Стоит отметить, что этот синтаксис не подходит для остальных функций. Дело в том, что это "конструктор" — функция, котороя создаёт объект. Имя функции совпадает с и именем класса. Поскольку ScriptHook имеет свою реализацию запуска, то создавать объекты через него нам не нужно. Это делается автоматически. Внутри этого блока мы как раз и будем писать скрипт, вызывая функции для GTA IV. Если собрать всё в кучу, то мы получим следующий код:

```csharp
using System;
using GTA;

namespace TestScript {

	/* ПРОСТРАНСТВО ДЛЯ ВСЕХ ПОТОКОВ */

	public class Thread : Script {

		public Thread() {

			/* ПРОСТРАНСТВО ДЛЯ КОНКРЕТНОГО ПОТОКА */

		}

		/* ПРОСТРАНСТВО ФУНКЦИЙ ПОТОКА */

	}

}
```

Этот код будет работать примерно так же, как и этот в Sanny Builder:

```
{$CLEO}
0000:

{ ПРОСТРАНСТВО ФУНКЦИЙ ПОТОКА }

thread 'Thread'

// ПРОСТРАНСТВО ДЛЯ КОНКРЕТНОГО ПОТОКА

0A93: end_custom_thread
```

Сохраняем наш проект. **НЕ** компилируем, а просто сохраняем! Можем закрывать Visual Studio и перейти в папку с проектом. Копируем файл "TestScript.cs" в папку `GTA IV\scripts`. Скрипт установлен! Теперь он готов к выполнению! :)

Естественно, скрипт ничего не делает, так как он пуст. Что и как писать я расскажу в следующих уроках. Это только основа.

### Рекомендация

1. Создать текстовый файл в папке "GTA IV\scripts";
2. Переименовать расширение файла с `*.txt` на `*.cs`;
3. Нажимаем `ПКМ` на названии проекта и выбрать `Добавить->Существующий элемент...`:

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

В появившемся окне выбираем созданный нами файл в шаге 1 и нажимаем "Добавить". Далее сохраняем проект. В результате мы можем редактировать несколько проектов!

Автор: **wmysterio**
