use std::cell::RefCell;
use crate::broadcast::BroadcastMessage;
use crate::components::{BlockPosition, ChunkPosition, Position, Rotation};
use crate::context::UnlockReason;
use crate::recipes::RecipeId;
use basalt_types::Slot;
use basalt_types::nbt::NbtCompound;
#[derive(Debug, Clone)]
pub enum Response {
Broadcast(BroadcastMessage),
SendBlockAck {
sequence: i32,
},
SendSystemChat {
content: NbtCompound,
action_bar: bool,
},
SendPosition {
teleport_id: i32,
position: Position,
rotation: Rotation,
},
StreamChunks(ChunkPosition),
SendGameStateChange {
reason: u8,
value: f32,
},
PersistChunk(ChunkPosition),
SpawnDroppedItem {
position: BlockPosition,
item_id: i32,
count: i32,
},
OpenChest(BlockPosition),
OpenCraftingTable {
position: BlockPosition,
},
OpenContainer(crate::container::Container),
BroadcastBlockAction {
position: BlockPosition,
action_id: u8,
action_param: u8,
block_id: i32,
},
NotifyContainerViewers {
position: BlockPosition,
slot_index: i16,
item: Slot,
},
DestroyBlockEntity {
position: BlockPosition,
},
UnlockRecipe {
recipe_id: RecipeId,
reason: UnlockReason,
},
LockRecipe {
recipe_id: RecipeId,
},
}
pub struct ResponseQueue {
inner: RefCell<Vec<Response>>,
}
impl Default for ResponseQueue {
fn default() -> Self {
Self::new()
}
}
impl ResponseQueue {
pub fn new() -> Self {
Self {
inner: RefCell::new(Vec::new()),
}
}
pub fn push(&self, response: Response) {
self.inner.borrow_mut().push(response);
}
pub fn drain(&self) -> Vec<Response> {
self.inner.borrow_mut().drain(..).collect()
}
}