diff --git a/azalea-block/src/range.rs b/azalea-block/src/range.rs index 7960b5c4..76b18079 100644 --- a/azalea-block/src/range.rs +++ b/azalea-block/src/range.rs @@ -3,6 +3,8 @@ use std::{ ops::{Add, RangeInclusive}, }; +use azalea_registry::Block; + use crate::{BlockState, block_state::BlockStateIntegerRepr}; #[derive(Debug, Clone)] @@ -45,14 +47,14 @@ impl Add for BlockStates { } } -impl From> for BlockStates { - fn from(set: HashSet) -> Self { +impl From> for BlockStates { + fn from(set: HashSet) -> Self { Self::from(&set) } } -impl From<&HashSet> for BlockStates { - fn from(set: &HashSet) -> Self { +impl From<&HashSet> for BlockStates { + fn from(set: &HashSet) -> Self { let mut block_states = HashSet::with_capacity(set.len()); for &block in set { block_states.extend(BlockStates::from(block)); @@ -60,3 +62,18 @@ impl From<&HashSet> for BlockStates { Self { set: block_states } } } + +impl From<[Block; N]> for BlockStates { + fn from(arr: [Block; N]) -> Self { + Self::from(&arr[..]) + } +} +impl From<&[Block]> for BlockStates { + fn from(arr: &[Block]) -> Self { + let mut block_states = HashSet::with_capacity(arr.len()); + for &block in arr { + block_states.extend(BlockStates::from(block)); + } + Self { set: block_states } + } +} diff --git a/azalea-client/src/plugins/packet/game/mod.rs b/azalea-client/src/plugins/packet/game/mod.rs index 670058c3..2fb9e1cd 100644 --- a/azalea-client/src/plugins/packet/game/mod.rs +++ b/azalea-client/src/plugins/packet/game/mod.rs @@ -1608,7 +1608,16 @@ impl GamePacketHandler<'_> { pub fn store_cookie(&mut self, _p: &ClientboundStoreCookie) {} pub fn transfer(&mut self, _p: &ClientboundTransfer) {} pub fn move_minecart_along_track(&mut self, _p: &ClientboundMoveMinecartAlongTrack) {} - pub fn set_held_slot(&mut self, _p: &ClientboundSetHeldSlot) {} + pub fn set_held_slot(&mut self, p: &ClientboundSetHeldSlot) { + debug!("Got set held slot packet {p:?}"); + + as_system::>(self.ecs, |mut query| { + let mut inventory = query.get_mut(self.player).unwrap(); + if p.slot <= 8 { + inventory.selected_hotbar_slot = p.slot as u8; + } + }); + } pub fn set_player_inventory(&mut self, _p: &ClientboundSetPlayerInventory) {} pub fn projectile_power(&mut self, _p: &ClientboundProjectilePower) {} pub fn custom_report_details(&mut self, _p: &ClientboundCustomReportDetails) {}