> For the complete documentation index, see [llms.txt](https://wmysterio.gitbook.io/gta-script-generator/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wmysterio.gitbook.io/gta-script-generator/docs/plugins/plugin_properties.md).

# Недвижимость

Начиная с версии 5.1.5 можно использовать плагин `Properties`. Он позволяет делать покупки чего угодно, используя стандартный принцип. И это первый плагин, который может взаимодействовать с другим плагином. Существует 3 режима работы: простой режим, режим с использованием плагина [SaveGame](/gta-script-generator/docs/plugins/plugin_save_game.md) и продвинутый режим.

### Простой режим

Этот режим не требует дополнительных настроек. Он создаст маркеры и пикапы недвижимости, которую можно было купить в оригинальной игре (за исключением магазинов **Zero RC Shop** и **Wang Cars**). При покупке домов, будут разблокированы их гаражи и маркеры входа в интерьер. Пример использования:

```csharp
using GTA;
using GTA.Plugins;

public partial class MAIN : Thread {

    static Properties PROPERTIES; // сохраняем ссылку на плагин, если нужно

    public override void START( LabelJump label ) {
        create_thread<BUY_PRO>(); // создать поток, который контролирует покупки
        end_thread();
    }

    //----------------------------------------------------------------------------------------------------

    public class BUY_PRO : Thread {

        public override void START( LabelJump label ) {
            PROPERTIES = new Properties(); // инициализация плагина
        }

    }

}
```

Объект **PROPERTIES** имеет одну проверку `is_property_bought`, которая возвращает **true**, если конкретная недвижимость куплена. Принимает метод 1 параметр типа **byte** с ограничениями от 0 до 31 включительно — уникальный идентификатор недвижимости (детали будут ниже). Это свойство будет работать независимо от режима использования.

### Режим с использованием плагина SaveGame

Этот режим работает точно так же, как и простой режим. Главным отличием является то, что плагин самостоятельно добавляет маркеры сохранения для домов, в которых можно сохраниться. Это позволит реализовать стандартное сохранение и покупку одновременно.

Для реализации этого способа нужно сначала создать плагин [SaveGame](/gta-script-generator/docs/plugins/plugin_save_game.md#prostoi-rezhim) в простом режиме, а потом передать ссылку на плагин в конструктор класса **Properties**:

```csharp
using GTA;
using GTA.Plugins;

public partial class MAIN : Thread {

    static SaveGame SAVE_GAME; // сохраняем ссылку на плагин SaveGame
    static Properties PROPERTIES; // сохраняем ссылку на плагин Properties

    public override void START( LabelJump label ) {
        create_thread<SAVEGM>(); // сначала запускаем поток для сохранения
        create_thread<BUY_PRO>(); // потом запускаем поток для покупок
        end_thread();
    }

    //----------------------------------------------------------------------------------------------------

    public class SAVEGM : Thread {

        public override void START( LabelJump label ) {
            SAVE_GAME = new SaveGame(); // инициализация плагина SaveGame
        }

    }
	
    public class BUY_PRO : Thread {

        public override void START( LabelJump label ) {
            PROPERTIES = new Properties( SAVE_GAME ); // <-- передаём ссылку на плагин SaveGame
        }

    }

}
```

### Продвинутый режим

В этом режиме можно указать произвольный набор покупок недвижимости (количество должно быть от 1 до 32 включительно). Для этого надо использовать анонимный метод в качестве параметра конструктора:

```csharp
using GTA;
using GTA.Plugins;

public partial class MAIN : Thread {

    static Properties PROPERTIES; // сохраняем ссылку на плагин Properties

    public override void START( LabelJump label ) {
        create_thread<BUY_PRO>(); // потом запускаем поток для покупок
        end_thread();
    }

    //----------------------------------------------------------------------------------------------------

	public class BUY_PRO : Thread {

        public override void START( LabelJump label ) {

            PROPERTIES = new Properties( setup => {

                setup.add_property( 0.0, 1.0, 2.0, 30000, action => {
                    // ...
                }, BuyPropertyMessage.PROPERTY );

            } );

        }

    }

}
```

Объект **setup** даёт доступ к методу `add_property`. Именно он и добавляет новую недвижимость в свой список. Параметры **0.0 1.0** и **2.0** отвечают за координаты пикапа, **30000** — цена недвижимости. В следующем параметре надо указать анонимную функцию, которая позволяет настроить дополнительные действия. Последний параметр позволяет настроить тип текста, который будет выводится при покупке ("недвижимость" или "номер в отеле"). Рассмотрим их все:

```csharp
public class BUY_PRO : Thread {
    public override void START( LabelJump label ) {
        PROPERTIES = new Properties( setup => {
            setup.add_property( 0.0, 1.0, 2.0, 30000, action => {


                action.set_camera_position( 316.0747, -1786.757, 5.0712 ); <-- обязательный вызов!

                //action.set_camera_point( 0.0, 1.0, 2.0 );
                //action.X
                //action.Y
                //action.Z
                //action.Price
                //action.ID
                //action.AfterBought = delegate { };
                //action.BeforeCreate = delegate { };


            } );
        } );
    }
}
```

Метод `set_camera_position` является обязательным для вызова. Он устанавливает камеру в нужную позицию перед выводом сообщения о покупке. Все остальные опциональны. Метод `set_camera_point` устанавливает позицию куда будет смотреть камера. Без вызова этого метода камера будет смотреть в точку, где был создан пикап покупки. Свойства `AfterBought` и `BeforeCreate` позволяют указать дополнительные действия после покупки и до создания пикапа недвижимости.

Свойства `X`, `Y`, `Z` и `Price` возвращают координаты пикапа и цену недвижимости соответственно. Остался только загадочный `ID`. Когда недвижимость добавляется через метод **add\_property**, генератор присваивает ей персональный идентификатор — число от 0 до 31 включительно. Он используется для внутренней реализации плагина, но также позволяет сохранить это число для проверок через метод `is_property_bought`.

{% hint style="danger" %}
Плагин может существовать в единственном экземпляре и требует отдельного потока (не **MAIN**)!
{% endhint %}
