> For the complete documentation index, see [llms.txt](https://workshop-guide.magicbyte.ru/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://workshop-guide.magicbyte.ru/mbsl-docs/rabota-s-setyu/rpc-remote-procedure-call.md).

# RPC (Remote Procedure Call)

Для упрощения работы с RPC библиотека предоставляет свою обёртку механизма RPC игры. Обёртка состоит из двух компонентов: компонент вызова и обработчик.

Реализованная обёртка позволяет выполнять RPC, идентифицируемые сразу по 3 атрибутам: название модификации (пространство имён), название функции в модификации, типы аргументов функции. Таким образом, обёртка поддерживает перегрузку функций (т.е. создание двух функций с одинаковыми названиями, но разными аргументами).

Компонент вызова - это объект, который создаётся на вызывающей процедуру стороне, и используется для строго типизированного вызова процедуры. В библиотеке этот компонент представлен семейством классов MBSL\_RPC. При использовании компонента на клиенте параметр recipient можно игнорировать. При использовании на сервере он указывает получателя RPC (NULL = все игроки).

```clike
//N - число аргументов (от 0 до 7)
class MBSL_RPCN<Class Arg1, ..., Class ArgN> : Managed
{
    //Конструктор. Требует передать название модификации (пространство имён)
    //А также название функции в этой модификации (пространстве имён).
    void MBSL_RPCN(string modname, string functionname);
    //Вызвать удалённую процедуру с указанными аргументами
    void Invoke(Arg1 arg1, ..., ArgN argN, PlayerIdentity recipient = NULL);
}

//Вариант без аргументов
class MBSL_RPC0 : Managed
{
    //Конструктор. Требует передать название модификации (пространство имён)
    //А также название функции в этой модификации (пространстве имён).
    void MBSL_RPC0(string modname, string functionname);
    //Вызвать удалённую процедуру с указанными аргументами
    void Invoke(PlayerIdentity recipient = NULL);
}

//Особый вариант. Позволяет передать любое число аргументов в виде массива
class MBSL_RPCRaw : Managed
{
    //Конструктор. Требует передать название модификации (пространство имён)
    //А также название функции в этой модификации (пространстве имён).
    void MBSL_RPCRaw (string modname, string functionname);
    //Вызвать удалённую процедуру с указанными аргументами
    void Invoke(array<ref Param> params, PlayerIdentity recipient = null)
}
```

Обработчик - это вызываемая [строго типизированная функция](/mbsl-docs/modeli-vyzova-funkcii/strogo-tipizirovannye-funkcii.md) на другой стороне, которая получает аргументы, а также информацию о вызвавшем функцию игроке (если обработчик на  сервере). В библиотеке этот компонент представлен семейством классов MBSL\_RPC\_Handler.

<pre class="language-clike"><code class="lang-clike">//N - число аргументов (от 0 до 7)
<strong>class MBSL_RPC_HandlerN&#x3C;Class Arg1, ..., Class ArgN> : Managed
</strong>{
    //Добавить обработчик
    //Требует передать:
    //название модификации (пространство имён)
    //название функции в этой модификации (пространстве имён)
    //Функцию-обработчик
    static MBSL_RPC_HandlerBase Register(string modname, string funcname, MBSL_TypedAction(N+1)&#x3C;Arg1, ..., ArgN, PlayerIdentity> handler);
    //Удаляет ранее добавленный обработчик.
    //Возвращает false, если обработчик уже был ранее удалён.
    bool Unregister();
}

//Вариант без аргументов
class MBSL_RPC_Handler0 : Managed
{
    //Добавить обработчик
    //Требует передать:
    //название модификации (пространство имён)
    //название функции в этой модификации (пространстве имён)
    //Функцию-обработчик
    static MBSL_RPC_HandlerBase Register(string modname, string funcname, MBSL_TypedAction1&#x3C;PlayerIdentity> handler);
    //Удаляет ранее добавленный обработчик.
    //Возвращает false, если обработчик уже был ранее удалён.
    bool Unregister();
}

//Особый вариант. Получаем любое число аргументов
class MBSL_RPC_HandlerRaw : Managed
{
    //Добавить обработчик
    //Требует передать:
    //название модификации (пространство имён)
    //название функции в этой модификации (пространстве имён)
    //Функцию-обработчик
    static MBSL_RPC_HandlerBase Register(string modname, string funcname, MBSL_TypedAction2&#x3C;ParamsReadContext, PlayerIdentity> handler);
    //Удаляет ранее добавленный обработчик.
    //Возвращает false, если обработчик уже был ранее удалён.
    bool Unregister();
}
</code></pre>

Пример использования RPC:

```clike
//Клиент
MBSL_RPC1<string> sendMessage = new MBSL_RPC1<string>("ExampleMod", "SendMessage");
sendMessage.Invoke("Hello");

//Сервер
class Example : Managed
{
    void Example()
    {
        MBSL_RPC_Handler1<string>.Register("ExampleMod", "SendMessage", _SendMessage.AsStrong());
    }
    
    protected ref MBSL_TypedAction2<string, PlayerIdentity> _SendMessage = MBSL_TypedAction2<string, PlayerIdentity>.Weak(this, "SendMessage");
    protected void SendMessage(string message, PlayerIdentity sender)
    {
        Print(sender.GetPlainId() + " says: " + message);
    }
}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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://workshop-guide.magicbyte.ru/mbsl-docs/rabota-s-setyu/rpc-remote-procedure-call.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.
