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

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


---

# 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/00200/00100/000300.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.
