use uika_ffi::{UClassHandle, UObjectHandle};
use crate::api::api;
use crate::error::{check_ffi, UikaError, UikaResult};
pub fn spawn_actor_raw(
world: UObjectHandle,
class: UClassHandle,
transform_buf: &[u8],
owner: UObjectHandle,
) -> UikaResult<UObjectHandle> {
let result = unsafe {
((*api().world).spawn_actor)(
world,
class,
transform_buf.as_ptr(),
transform_buf.len() as u32,
owner,
)
};
if result.0.is_null() {
Err(UikaError::InvalidOperation("spawn_actor returned null".into()))
} else {
Ok(result)
}
}
pub fn find_object_raw(class: UClassHandle, path: &str) -> UikaResult<UObjectHandle> {
let result = unsafe {
((*api().world).find_object)(class, path.as_ptr(), path.len() as u32)
};
if result.0.is_null() {
Err(UikaError::InvalidOperation(format!("find_object: not found: {path}")))
} else {
Ok(result)
}
}
pub fn load_object_raw(class: UClassHandle, path: &str) -> UikaResult<UObjectHandle> {
let result = unsafe {
((*api().world).load_object)(class, path.as_ptr(), path.len() as u32)
};
if result.0.is_null() {
Err(UikaError::InvalidOperation(format!("load_object: failed to load: {path}")))
} else {
Ok(result)
}
}
pub fn new_object_raw(outer: UObjectHandle, class: UClassHandle) -> UikaResult<UObjectHandle> {
let result = unsafe { ((*api().world).new_object)(outer, class) };
if result.0.is_null() {
Err(UikaError::InvalidOperation("new_object returned null".into()))
} else {
Ok(result)
}
}
pub fn spawn_actor_deferred_raw(
world: UObjectHandle,
class: UClassHandle,
transform_buf: &[u8],
owner: UObjectHandle,
instigator: UObjectHandle,
collision_method: u8,
) -> UikaResult<UObjectHandle> {
let result = unsafe {
((*api().world).spawn_actor_deferred)(
world,
class,
transform_buf.as_ptr(),
transform_buf.len() as u32,
owner,
instigator,
collision_method,
)
};
if result.0.is_null() {
Err(UikaError::InvalidOperation("spawn_actor_deferred returned null".into()))
} else {
Ok(result)
}
}
pub fn finish_spawning_raw(
actor: UObjectHandle,
transform_buf: &[u8],
) -> UikaResult<()> {
check_ffi(unsafe {
((*api().world).finish_spawning)(
actor,
transform_buf.as_ptr(),
transform_buf.len() as u32,
)
})
}
pub fn get_world_raw(actor: UObjectHandle) -> UikaResult<UObjectHandle> {
let result = unsafe { ((*api().world).get_world)(actor) };
if result.0.is_null() {
Err(UikaError::InvalidOperation("get_world returned null".into()))
} else {
Ok(result)
}
}
pub fn get_all_actors_of_class_raw(
world: UObjectHandle,
class: UClassHandle,
) -> UikaResult<Vec<UObjectHandle>> {
let mut count: u32 = 0;
check_ffi(unsafe {
((*api().world).get_all_actors_of_class)(
world,
class,
std::ptr::null_mut(),
0,
&mut count,
)
})?;
if count == 0 {
return Ok(Vec::new());
}
let mut buf = vec![UObjectHandle(std::ptr::null_mut()); count as usize];
let mut actual_count: u32 = 0;
check_ffi(unsafe {
((*api().world).get_all_actors_of_class)(
world,
class,
buf.as_mut_ptr(),
count,
&mut actual_count,
)
})?;
buf.truncate(actual_count as usize);
Ok(buf)
}