use std::ptr::NonNull;
use bitfield::bitfield;
use shared::{F32Vector3, OwnedPtr};
use crate::cs::FieldInsHandle;
use super::{ChrIns, ChrSet};
#[repr(C)]
pub struct NetChrSync {
world_info_owner: usize,
pub chr_slot_count: u32,
_padc: u32,
pub net_chr_set_sync: [Option<OwnedPtr<NetChrSetSync>>; 196],
}
#[repr(C)]
pub struct NetChrSetSync {
vftable: usize,
pub chr_set: NonNull<ChrSet<ChrIns>>,
pub capacity: u32,
_pad14: u32,
unk18_readback_values: usize,
placement_readback_values: *mut ChrSyncPlacementUpdate,
unk28_readback_values: usize,
health_readback_values: *mut ChrSyncHealthUpdate,
update_flags: *mut ChrSyncUpdateFlags,
unk40_readback_values: usize,
unk48_readback_values: usize,
}
impl NetChrSetSync {
pub fn update_flags(&self) -> &[ChrSyncUpdateFlags] {
unsafe { std::slice::from_raw_parts(self.update_flags, self.capacity as usize) }
}
pub fn health_updates(&self) -> &[ChrSyncHealthUpdate] {
unsafe { std::slice::from_raw_parts(self.health_readback_values, self.capacity as usize) }
}
pub fn placement_updates(&self) -> &[ChrSyncPlacementUpdate] {
unsafe {
std::slice::from_raw_parts(self.placement_readback_values, self.capacity as usize)
}
}
pub fn update_flags_mut(&mut self) -> &mut [ChrSyncUpdateFlags] {
unsafe { std::slice::from_raw_parts_mut(self.update_flags, self.capacity as usize) }
}
pub fn health_updates_mut(&mut self) -> &mut [ChrSyncHealthUpdate] {
unsafe {
std::slice::from_raw_parts_mut(self.health_readback_values, self.capacity as usize)
}
}
pub fn placement_updates_mut(&mut self) -> &mut [ChrSyncPlacementUpdate] {
unsafe {
std::slice::from_raw_parts_mut(self.placement_readback_values, self.capacity as usize)
}
}
}
bitfield! {
#[repr(C)]
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct ChrSyncUpdateFlags(u16);
impl Debug;
bool;
pub has_placement_update, _: 0;
_, set_has_placement_update: 0;
pub has_health_update, _: 4;
_, set_has_health_update: 4;
}
#[repr(C)]
pub struct ChrSyncHealthUpdate {
pub current_hp: i32,
pub damage_taken: u32,
}
#[repr(C)]
pub struct ChrSyncPlacementUpdate {
pub position: F32Vector3,
pub rotation: F32Vector3,
unk18: F32Vector3,
unk24: u32,
unk28: FieldInsHandle,
unk30: u16,
unk34: u32,
}