RFC (Remote Function Call)

Для упрощения работы с RPC, результат которых необходимо получить на вызвавшей их стороне (например, при выполнении какого-то действия, доступного только на сервере) библиотека предоставляет обёртку механизма RPC самой библиотеки, называемую RFC (Remote Function Call). Обёртка состоит из двух компонентов: компонент вызова и обработчик.

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

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

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

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

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

Обработчик - это вызываемая строго типизированная функция на другой стороне, которая получает аргументы, а также информацию о вызвавшем функцию игроке (если обработчик на сервере), и создаёт Promise результата (даже если функция выполняется синхронно). В библиотеке этот компонент представлен семейством классов MBSL_RFCHandler.

//N - число аргументов (от 0 до 7)
class MBSL_RFCHandlerN<Class ReturnType, Class Arg1, ..., Class ArgN> : Managed
{
    //Добавить обработчик
    //Требует передать:
    //название модификации (пространство имён)
    //название функции в этой модификации (пространстве имён)
    //Функцию-обработчик
    static MBSL_RFCHandlerN Register(string modname, string funcname, MBSL_TypedFunction(N+1)<MBSL_Promise<ReturnType>, Arg1, ..., ArgN, PlayerIdentity> handler);
    //Удаляет ранее добавленный обработчик.
    //Возвращает false, если обработчик уже был ранее удалён.
    bool Unregister();
}

//N - число аргументов (от 0 до 7)
//Вариант для функций, возвращающих PromiseRef.
class MBSL_RFCHandlerNRef<Class ReturnType, Class Arg1, ..., Class ArgN> : Managed
{
    //Добавить обработчик
    //Требует передать:
    //название модификации (пространство имён)
    //название функции в этой модификации (пространстве имён)
    //Функцию-обработчик
    static MBSL_RFCHandlerN Register(string modname, string funcname, MBSL_TypedFunction(N+1)<MBSL_PromiseRef<ReturnType>, Arg1, ..., ArgN, PlayerIdentity> handler);
    //Удаляет ранее добавленный обработчик.
    //Возвращает false, если обработчик уже был ранее удалён.
    bool Unregister();
}

При работе с удалёнными функциями (RFC) необходимо учитывать следующие особенности:

  • При отключении клиента от игрового сервера (в том числе из-за выключения сервера) все удалённые вызовы, выполненные этим клиентом, но ещё не завершённые, будут автоматически отклонены на клиенте с ошибкой MBSL_ConectionResetException. При этом сами удалённые функции на сервере никак не будут уведомлены об этом.

  • При отключении клиента от игрового сервера (в том числе из-за выключения сервера) все удалённые вызовы, выполненные сервером к этому клиенту, но ещё не завершённый, будут автоматически отклонены на сервере с ошибкой MBSL_ConectionResetException. При этом сами удалённые функции на клиенте никак не будут уведомлены об этом.

Last updated