diff --git a/pumpkin-inventory/src/player.rs b/pumpkin-inventory/src/player.rs index 8bd91e20f..429498c25 100644 --- a/pumpkin-inventory/src/player.rs +++ b/pumpkin-inventory/src/player.rs @@ -120,6 +120,16 @@ impl PlayerInventory { self.items[self.selected + 36 - 9].as_ref() } + pub fn held_item_mut(&mut self) -> Option<&mut ItemStack> { + debug_assert!((0..9).contains(&self.selected)); + self.items[self.selected + 36 - 9].as_mut() + } + + pub fn empty_held_item(&mut self) { + debug_assert!((0..9).contains(&self.selected)); + self.items[self.selected + 36 - 9] = None + } + pub fn slots(&self) -> Vec> { let mut slots = vec![self.crafting_output.as_ref()]; slots.extend(self.crafting.iter().map(|c| c.as_ref())); diff --git a/pumpkin/src/client/player_packet.rs b/pumpkin/src/client/player_packet.rs index 4197ee937..ded4ab1f7 100644 --- a/pumpkin/src/client/player_packet.rs +++ b/pumpkin/src/client/player_packet.rs @@ -560,13 +560,23 @@ impl Player { } if let Some(face) = BlockFace::from_i32(use_item_on.face.0) { - if let Some(item) = self.inventory.lock().await.held_item() { + let mut inventory = self.inventory.lock().await; + if let Some(item) = inventory.held_item_mut() { let block = get_block_by_item(item.item_id); // check if item is a block, Because Not every item can be placed :D if let Some(block) = block { let entity = &self.living_entity.entity; let world = &entity.world; + // TODO: Config + // Decrease Block count + if self.gamemode.load() != GameMode::Creative { + item.item_count -= 1; + if item.item_count == 0 { + inventory.empty_held_item(); + } + } + world .set_block( WorldPosition(location.0 + face.to_offset()),