diff options
Diffstat (limited to 'azalea-world/src/entity/data.rs')
| -rwxr-xr-x | azalea-world/src/entity/data.rs | 113 |
1 files changed, 36 insertions, 77 deletions
diff --git a/azalea-world/src/entity/data.rs b/azalea-world/src/entity/data.rs index dcff6cfe..baebd210 100755 --- a/azalea-world/src/entity/data.rs +++ b/azalea-world/src/entity/data.rs @@ -1,10 +1,9 @@ use azalea_block::BlockState; -use azalea_buf::{BufReadError, McBufVarReadable}; +use azalea_buf::{BufReadError, McBufVarReadable, McBufVarWritable}; use azalea_buf::{McBuf, McBufReadable, McBufWritable}; use azalea_chat::Component; use azalea_core::{BlockPos, Direction, GlobalPos, Particle, Slot}; use enum_as_inner::EnumAsInner; -use log::warn; use nohash_hasher::IntSet; use std::io::{Cursor, Write}; use uuid::Uuid; @@ -24,12 +23,12 @@ impl McBufReadable for EntityMetadataItems { fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> { let mut metadata = Vec::new(); loop { - let index = u8::read_from(buf)?; - if index == 0xff { + let id = u8::read_from(buf)?; + if id == 0xff { break; } let value = EntityDataValue::read_from(buf)?; - metadata.push(EntityDataItem { index, value }); + metadata.push(EntityDataItem { index: id, value }); } Ok(EntityMetadataItems(metadata)) } @@ -46,10 +45,11 @@ impl McBufWritable for EntityMetadataItems { } } -#[derive(Clone, Debug, EnumAsInner)] +#[derive(Clone, Debug, EnumAsInner, McBuf)] pub enum EntityDataValue { Byte(u8), - Int(i32), + Int(#[var] i32), + Long(i64), Float(f32), String(String), Component(Component), @@ -63,87 +63,48 @@ pub enum EntityDataValue { OptionalUuid(Option<Uuid>), // 0 for absent (implies air); otherwise, a block state ID as per the global palette // this is a varint - OptionalBlockState(Option<BlockState>), + BlockState(BlockState), CompoundTag(azalea_nbt::Tag), Particle(Particle), VillagerData(VillagerData), // 0 for absent; 1 + actual value otherwise. Used for entity IDs. - OptionalUnsignedInt(Option<u32>), + OptionalUnsignedInt(OptionalUnsignedInt), Pose(Pose), CatVariant(azalea_registry::CatVariant), FrogVariant(azalea_registry::FrogVariant), - GlobalPos(GlobalPos), + OptionalGlobalPos(Option<GlobalPos>), PaintingVariant(azalea_registry::PaintingVariant), } -#[derive(Clone, Debug, McBuf, Default)] -pub struct Rotations { - pub x: f32, - pub y: f32, - pub z: f32, -} +#[derive(Clone, Debug)] +pub struct OptionalUnsignedInt(pub Option<u32>); -impl McBufReadable for EntityDataValue { +impl McBufReadable for OptionalUnsignedInt { fn read_from(buf: &mut Cursor<&[u8]>) -> Result<Self, BufReadError> { - let data_type = u32::var_read_from(buf)?; - Ok(match data_type { - 0 => EntityDataValue::Byte(u8::read_from(buf)?), - 1 => EntityDataValue::Int(i32::var_read_from(buf)?), - 2 => EntityDataValue::Float(f32::read_from(buf)?), - 3 => EntityDataValue::String(String::read_from(buf)?), - 4 => EntityDataValue::Component(Component::read_from(buf)?), - 5 => EntityDataValue::OptionalComponent(Option::<Component>::read_from(buf)?), - 6 => EntityDataValue::ItemStack(Slot::read_from(buf)?), - 7 => EntityDataValue::Boolean(bool::read_from(buf)?), - 8 => EntityDataValue::Rotations(Rotations::read_from(buf)?), - 9 => EntityDataValue::BlockPos(BlockPos::read_from(buf)?), - 10 => EntityDataValue::OptionalBlockPos(Option::<BlockPos>::read_from(buf)?), - 11 => EntityDataValue::Direction(Direction::read_from(buf)?), - 12 => EntityDataValue::OptionalUuid(Option::<Uuid>::read_from(buf)?), - 13 => EntityDataValue::OptionalBlockState({ - let val = u32::var_read_from(buf)?; - if val == 0 { - None - } else { - Some(BlockState::try_from(val - 1).unwrap_or_else(|_| { - warn!("Invalid block state ID {} in entity metadata", val - 1); - BlockState::Air - })) - } - }), - 14 => EntityDataValue::CompoundTag(azalea_nbt::Tag::read_from(buf)?), - 15 => EntityDataValue::Particle(Particle::read_from(buf)?), - 16 => EntityDataValue::VillagerData(VillagerData::read_from(buf)?), - 17 => EntityDataValue::OptionalUnsignedInt({ - let val = u32::var_read_from(buf)?; - if val == 0 { - None - } else { - Some(val - 1) - } - }), - 18 => EntityDataValue::Pose(Pose::read_from(buf)?), - 19 => EntityDataValue::CatVariant(azalea_registry::CatVariant::read_from(buf)?), - 20 => EntityDataValue::FrogVariant(azalea_registry::FrogVariant::read_from(buf)?), - 21 => EntityDataValue::GlobalPos(GlobalPos::read_from(buf)?), - 22 => { - EntityDataValue::PaintingVariant(azalea_registry::PaintingVariant::read_from(buf)?) - } - _ => { - return Err(BufReadError::UnexpectedEnumVariant { - id: data_type as i32, - }) - } - }) + let val = u32::var_read_from(buf)?; + Ok(OptionalUnsignedInt(if val == 0 { + None + } else { + Some(val - 1) + })) } } - -impl McBufWritable for EntityDataValue { - fn write_into(&self, _buf: &mut impl Write) -> Result<(), std::io::Error> { - todo!(); +impl McBufWritable for OptionalUnsignedInt { + fn write_into(&self, buf: &mut impl Write) -> Result<(), std::io::Error> { + match self.0 { + Some(val) => (val + 1).var_write_into(buf), + None => 0u32.var_write_into(buf), + } } } +#[derive(Clone, Debug, McBuf, Default)] +pub struct Rotations { + pub x: f32, + pub y: f32, + pub z: f32, +} + #[derive(Clone, Debug, Copy, McBuf, Default)] pub enum Pose { #[default] @@ -157,14 +118,12 @@ pub enum Pose { Dying, } -#[derive(Debug, Clone, McBuf, Default)] +#[derive(Debug, Clone, McBuf)] pub struct VillagerData { + pub kind: azalea_registry::VillagerType, + pub profession: azalea_registry::VillagerProfession, #[var] - type_: u32, - #[var] - profession: u32, - #[var] - level: u32, + pub level: u32, } impl TryFrom<EntityMetadataItems> for Vec<EntityDataValue> { |
