use core::ffi::c_void;
use crate::abi::{Entity, Header, ItemId};
#[repr(C)]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct InventoryOp {
pub kind: u32,
pub flags: u32,
pub target: u64,
pub other: u64,
pub item: ItemId,
pub count: u32,
}
impl InventoryOp {
pub const GIVE: u32 = 1;
pub const TAKE: u32 = 2;
pub const DESTROY_SLOT: u32 = 3;
pub const MOVE_SLOT: u32 = 4;
pub const MOVE_ALL: u32 = 5;
pub const INCLUDE_SPECIAL: u32 = 1;
pub const RENEW: u32 = 6;
pub const FILLED: u32 = 2;
}
#[repr(C)]
#[derive(Clone, Copy, Debug, bytemuck::Zeroable)]
pub struct InventoryRequest {
pub header: Header,
pub flags: u32,
pub actor: Entity,
pub ops: *const InventoryOp,
pub op_count: u32,
pub reserved: u32,
}
impl_headed!(InventoryRequest);
impl InventoryRequest {
pub const ALLOW_PARTIAL: u32 = 1;
pub const NOTIFY: u32 = 2;
}
#[repr(C)]
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct InventoryOpResult {
pub error: u32,
pub remaining: u32,
}
impl InventoryOpResult {
pub const NOT_RUN: u32 = 0x100;
}
#[repr(C)]
#[derive(Clone, Copy, Debug, bytemuck::Zeroable)]
pub struct InventoryResult {
pub header: Header,
pub outcome: u32,
pub op_count: u32,
pub ops: *const InventoryOpResult,
}
impl_headed!(InventoryResult);
impl InventoryResult {
pub const COMMITTED: u32 = 0;
pub const ROLLED_BACK: u32 = 1;
pub const UNAVAILABLE: u32 = 2;
pub const TIMED_OUT: u32 = 3;
}
pub type InventoryResultFn =
unsafe extern "system" fn(result: *const InventoryResult, user: *mut c_void);
#[repr(C)]
#[derive(Clone, Copy, Debug, bytemuck::Zeroable)]
pub struct ItemData {
pub header: Header,
pub id: ItemId,
pub max_stack: u16,
pub category: u8,
pub rarity: u8,
pub flags: u32,
pub placed_entity: [u8; 16],
}
impl_headed!(ItemData);
impl ItemData {
pub const HAS_PIDE: u32 = 1 << 1;
pub const IS_CONTAINER: u32 = 1 << 2;
pub const IS_BLUEPRINT: u32 = 1 << 3;
pub const USES_FUEL: u32 = 1 << 13;
}