Script runtimes

CitizenFX supports pluggable scripting runtimes. These runtimes are implemented as CitizenFX components (code/components/) implementing fxOM (CitizenFX Object Model) interfaces defined in fxScripting.idl.

The specific interfaces used at the time of this writing are:

Interface Purpose
IScriptRuntime Base interface for script runtimes. Exposes basic lifetime management functions.
IScriptTickRuntime Allows exposing a Tick function for runtimes that need to run periodically.
IScriptEventRuntime Allows exposing a TriggerEvent function to handle incoming script events.
IScriptRefRuntime Allows exposing function references that can be called, duplicated and cloned.
IScriptFileHandlingRuntime Allows to mark a script runtime as handling specific files.

In addition, there is a host interface: IScriptHost, which will be passed to IScriptRuntime::Create.

Interface reference

IScriptRuntime

Create

void Create(in IScriptHost scriptHost);

This method is called by the host when the script runtime is created. The script host passed should probably be saved.

Destroy

void Destroy();

This method is called by the host when the script runtime is about to be destroyed.

GetParentObject

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

This should return the object set by SetParentObject.

SetParentObject

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

This sets the parent object. This is typically a native fx::Resource*, which may be relevant to runtimes implemented in C++.

GetInstanceId

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

This should return a random instance ID created by the runtime upon initialization.

IScriptTickRuntime

Tick

void Tick();

This is called by the host every frame.

IScriptEventRuntime

TriggerEvent

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

TriggerEvent is called by the host whenever an event has been triggered. eventName contains the name of the executed event, argsSerialized and serializedSize indicate the argument array (serialized using the common serialization convention, see the ‘conventions’ section), and sourceId contains a string identifying the source of the event.

IScriptRefRuntime

A ‘ref’ is a function reference, which is used to allow other resources (or the host) to invoke delegates/closures in the script runtime. Each ref is identified by an integer on resource level, in the host it is qualified with the resource name, instance ID and the ref index. Refs should not be reference counted by index, each creation should be paired with a single deletion.

CallRef

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

CallRef is called by the host when a reference should be invoked. refIdx contains the ref to call, argsSerialized/argsSize contain the argument array, and retvalSerialized and retvalSize should contain the return value array upon completion.

DuplicateRef

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

DuplicateRef should return a new reference index referencing the same internal function object as refIdx into newRefIdx.

RemoveRef

void RemoveRef(in int32_t refIdx);

RemoveRef should delete the reference identified by refIdx.

IScriptFileHandlingRuntime

HandlesFile

int32_t HandlesFile(in char* scriptFile);

Should return whether or not the specified file should be handled by this runtime.

LoadFile

void LoadFile(in char* scriptFile);

This function should load the file in the runtime.

IScriptHost

InvokeNative

void InvokeNative(inout NativeCtx context);

Invokes a native function. nativeIdentifier should contain the native function identifier, numArguments the amount of arguments, and arguments the specific function arguments following the RAGE native ABI.

Any result, for natives that return any, will be returned in the first argument fields in the context.

OpenSystemFile

Returns a stream referencing the specified file name in the system VFS.

OpenHostFile

Returns a stream referencing the specified file name, relative to the host path (resources:/resourceName/).

CanonicalizeRef

ScriptTrace

IScriptHostWithResourceData

This can be obtained using QueryInterface on the IScriptHost.

GetResourceName

Returns the name of the parent resource.

GetNumResourceMetaData

This function should not be used, instead the native GET_NUM_RESOURCE_METADATA should be used.

GetResourceMetaData

This function should not be used, instead the native GET_RESOURCE_METADATA should be used.

IScriptHostWithManifest

This can be obtained using QueryInterface on the IScriptHost.

IsManifestVersionBetween

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

Returns whether or not the host resource’s manifest version is within a specific range of GUIDs (lowerBound <= guid < upperBound).

If one of the GUIDs is the null GUID, only tests if the version is greater/less then the other GUID.

Conventions

Serialization

Serialization occurs using MessagePack, with a specific extension ID for delegates/function refs.