Script-runtimes
Среды выполнения скриптов
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 с определенным идентификатором расширения для ссылок делегатов/функций.