#script #run-time #engine #citizen-fx #api #communicate

cfx-core

用于与CitizenFX WASM运行时通信的WASM脚本核心引擎

1 个不稳定版本

0.1.0 2021年6月20日

#5 in #citizen-fx


3 个crate中使用

MIT 许可证

33KB
765

FiveM WASM绑定库

API

此API可以用任何编译成WASM的其他语言实现。

宿主

模块名称: host

导出

  • 日志(指针: u32,长度: u32)
  • 调用(散列: u64,指针: *const u8,长度: usize,返回值: *const返回值类型)
    • ptr, len - 指向参数指针数组的指针
// All structures are C
// See also bindings/src/types.rs
#[repr(C)]
pub struct ReturnValue {
    return_type: u32, // expected return type of the native function
    buffer: u32, // pointer to the guest buffer
    capacity: u32, // capacity of the guest buffer
}

WASM脚本

导出

  • _start
  • __cfx_alloc(大小: u32,对齐: u32) -> u32
  • __cfx_free(指针: *const c_void,大小: u32,对齐: u32)
  • __cfx_on_tick()
  • __cfx_on_event(事件名称: *const u8,参数: *const u8,参数长度: u32,: *const u8)
    • event_name - C字符串
    • args - msgpack字节数组
    • src - 事件源的C字符串

分配

所有仅存在于函数执行上下文中的参数都由宿主管理。

例如 __cfx_on_event

// allocate memory
let ptr0 = __cfx_alloc(event_name.len(), ...);
let ptr1 = __cfx_alloc(args.len(), ...);

// the host copies event name and args in the allocated memory

// call the expoted function
__cfx_on_event(ptr0, ptr1, ...)

// cleanup the memory after the call
__cfx_free(ptr0)`
__cfx_free(ptr1)

当你调用 host::invoke 时,所有参数都由客户端管理,这意味着调用invoke函数时应该有可用的内存。你可以使用静态数组或每次调用本地函数时都进行分配。

此外,您还可以调整用于获取返回值的缓冲区大小。您应该导出一个函数 __cfx_extend_retval_buffer(new_size: usize) -> *const u8。此函数将在 host::invoke 执行过程中调用(因此,请确保正确管理指针)。当传递的缓冲区小于本地返回值时,将调用此函数。扩展函数应返回一个指向可以存储 new_size 字节的新缓冲区的指针。如果您无法提供,请返回 0。如果 host::invoke 返回 -1

依赖项

~1.5–2.4MB
~48K SLoC