Script-runtimes

From FiveM Wikipedia

Среды выполнения скриптов

CitizenFX поддерживает подключаемые среды выполнения сценариев. Эти среды выполнения реализуются как интерфейсы реализации компонентов CitizenFX (объектная модель CitizenFX), определенные в .code/components/fxOMfxScripting.idl

На момент написания этой статьи использовались следующие конкретные интерфейсы:

Интерфейс Цель
IScriptПолнотайм Базовый интерфейс для сред выполнения скриптов. Предоставляет основные функции управления жизненным циклом.
IScriptTickRuntime Позволяет предоставлять функцию Tick для сред выполнения, которые необходимо периодически запускать.
IScriptEventRuntime Позволяет предоставлять функцию TriggerEvent для обработки входящих событий скрипта.
IScriptRefRuntime Позволяет предоставлять ссылки на функции, которые можно вызывать, дублировать и клонировать.
IScriptFileHandlingRuntime Позволяет пометить среду выполнения скрипта как обрабатывающую определенные файлы.

Кроме того, есть хост-интерфейс: , который будет передаваться в .IScriptHostIScriptRuntime::Create

Справочник по интерфейсу

IScriptRuntime

Создавать

void Create(in IScriptHost scriptHost);

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

Удалять

void Destroy();

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

GetParentObject

void* GetParentObject(); // direct return value, not result_t

Это должно вернуть объект, заданный. SetParentObject

SetParentObject

void SetParentObject(void* object); // direct return value, not result_t

При этом задается родительский объект. Обычно это собственный код, который может иметь отношение к средам выполнения, реализованным в C++.fx::Resource*

GetInstanceId

int GetInstanceId(); // direct return value, not result_t

Это должно вернуть случайный идентификатор экземпляра, созданный средой выполнения при инициализации.

IScriptTickRuntime

Тикать

void Tick();

Это вызывается хостом каждый кадр.

IScriptEventRuntime

TriggerEvent

void TriggerEvent(in char* eventName, in char* argsSerialized, in uint32_t serializedSize, in char* sourceId);

TriggerEvent вызывается узлом всякий раз, когда инициируется событие. содержит имя выполненного события и массив аргументов (сериализованный с использованием общего соглашения о сериализации, см. раздел «Соглашения»), а также строку, идентифицирующую источник события.eventNameargsSerializedserializedSizesourceId

IScriptRefRuntime

'ref' — это ссылка на функцию, которая используется, чтобы позволить другим ресурсам (или хосту) вызывать делегаты/закрытия в среде выполнения скрипта. Каждая ссылка идентифицируется целым числом на уровне ресурсов, на узле она квалифицируется именем ресурса, идентификатором экземпляра и индексом ссылки. Ссылки не должны подсчитываться по индексу, каждое создание должно быть сопряжено с одним удалением.

CallRef

void CallRef(in int32_t refIdx, in char* argsSerialized, in uint32_t argsSize, out char* retvalSerialized, out uint32_t retvalSize);

CallRef вызывается хостом при вызове ссылки. содержит ссылку на вызов, / содержит массив аргументов и должен содержать возвращаемый массив значений после завершения.refIdxargsSerializedargsSizeretvalSerializedretvalSize

DuplicateRef

void DuplicateRef(in int32_t refIdx, out int32_t newRefIdx);

DuplicateRef должен вернуть новый ссылочный индекс, ссылающийся на тот же объект внутренней функции, что и в .refIdxnewRefIdx

RemoveRef

void RemoveRef(in int32_t refIdx);

RemoveRef должен удалить ссылку, идентифицированную .refIdx

IScriptFileHandlingRuntime

HandlesFile

int32_t HandlesFile(in char* scriptFile);

Должен возвращать значение, должен ли указанный файл обрабатываться данной средой выполнения.

LoadFile

void LoadFile(in char* scriptFile);

Эта функция должна загрузить файл в среду выполнения.

IScriptHost

InvokeNative

void InvokeNative(inout NativeCtx context);

Вызывает собственную функцию. должен содержать собственный идентификатор функции, количество аргументов и конкретные аргументы функции, следующие за собственным ABI RAGE.nativeIdentifiernumArgumentsarguments

Любой результат для собственных носителей, возвращающих любой, будет возвращен в полях первого аргумента в контексте.

OpenSystemFile

Возвращает поток, ссылающийся на указанное имя файла в системном VFS.

OpenHostFile

Возвращает поток, ссылающийся на указанное имя файла относительно пути узла ().resources:/resourceName/

CanonicalizeRef

ScriptTrace

IScriptHostWithResourceData

Это можно получить с помощью QueryInterface на IScriptHost.

GetResourceName

Возвращает имя родительского ресурса.

GetNumResourceMetaData

Эта функция не должна использоваться, вместо этого следует использовать собственный GET_NUM_RESOURCE_METADATA.

GetResourceMetaData

Эта функция не должна использоваться, вместо этого следует использовать собственный GET_RESOURCE_METADATA.

IScriptHostWithManifest

Это можно получить с помощью QueryInterface на IScriptHost.

IsManifestVersionBetween

bool IsManifestVersionBetween(guid_t* lowerBound, guid_t* upperBound);

Возвращает значение, указывающее, находится ли версия манифеста хост-ресурса в определенном диапазоне идентификаторов GUID ().lowerBound <= guid < upperBound

Если один из идентификаторов GUID является нулевым идентификатором GUID, проверяется только в том случае, если версия больше или меньше, чем у другого GUID.

Конвенций

Сериализация

Сериализация происходит с помощью MessagePack с определенным идентификатором расширения для ссылок делегатов/функций.