diff --git a/pumpkin-protocol/src/bytebuf/mod.rs b/pumpkin-protocol/src/bytebuf/mod.rs index 17268c3fc..caca3480a 100644 --- a/pumpkin-protocol/src/bytebuf/mod.rs +++ b/pumpkin-protocol/src/bytebuf/mod.rs @@ -150,7 +150,7 @@ impl ByteBuffer { pub fn put_bit_set(&mut self, set: &BitSet) { self.put_var_int(&set.0); - for b in &set.1 { + for b in set.1 { self.put_i64(*b); } } diff --git a/pumpkin-protocol/src/bytebuf/packet_id.rs b/pumpkin-protocol/src/bytebuf/packet_id.rs index bd63dd552..f5dde8413 100644 --- a/pumpkin-protocol/src/bytebuf/packet_id.rs +++ b/pumpkin-protocol/src/bytebuf/packet_id.rs @@ -7,13 +7,13 @@ use crate::{BitSet, ClientPacket, ServerPacket, VarInt, VarIntType}; use super::{deserializer, serializer, ByteBuffer, DeserializerError}; -impl Serialize for BitSet { +impl Serialize for BitSet<'static> { fn serialize(&self, serializer: S) -> Result where S: Serializer, { // TODO: make this right - (self.0.clone(), self.1.clone()).serialize(serializer) + (&self.0, self.1).serialize(serializer) } } diff --git a/pumpkin-protocol/src/client/play/c_chunk_data.rs b/pumpkin-protocol/src/client/play/c_chunk_data.rs index 22d917b8b..eec44e47c 100644 --- a/pumpkin-protocol/src/client/play/c_chunk_data.rs +++ b/pumpkin-protocol/src/client/play/c_chunk_data.rs @@ -22,92 +22,89 @@ impl<'a> ClientPacket for CChunkData<'a> { buf.put_slice(&heightmap_nbt); let mut data_buf = ByteBuffer::empty(); - self.0 - .blocks - .iter() - .chunks(16 * 16 * 16) - .into_iter() - .for_each(|chunk| { - let chunk = chunk.collect_vec(); - let block_count = chunk - .iter() - .filter(|block| ***block != 0 && ***block != 12959 && ***block != 12958) - .count() as i16; - // Block count - data_buf.put_i16(block_count); - //// Block states + self.0.blocks.chunks(16 * 16 * 16).for_each(|chunk| { + let block_count = chunk + .iter() + .dedup() + .filter(|block| **block != 0 && **block != 12959 && **block != 12958) + .count() as i16; + // Block count + data_buf.put_i16(block_count); + //// Block states - let palette = chunk.clone().into_iter().dedup().collect_vec(); - // TODO: make dynamic block_size work - // TODO: make direct block_size work - enum PaletteType { - Indirect(u32), - Direct, + let palette = chunk.into_iter().dedup().collect_vec(); + // TODO: make dynamic block_size work + // TODO: make direct block_size work + enum PaletteType { + Indirect(u32), + Direct, + } + let palette_type = { + let palette_bit_len = 64 - (palette.len() as i64 - 1).leading_zeros(); + if palette_bit_len > 8 { + PaletteType::Direct + } else if palette_bit_len > 3 { + PaletteType::Indirect(palette_bit_len) + } else { + PaletteType::Indirect(4) } - let palette_type = { - let palette_bit_len = 64 - (palette.len() as i64 - 1).leading_zeros(); - if palette_bit_len > 8 { - PaletteType::Direct - } else if palette_bit_len > 3 { - PaletteType::Indirect(palette_bit_len) - } else { - PaletteType::Indirect(4) - } - // TODO: fix indirect palette to work correctly - // PaletteType::Direct - }; + // TODO: fix indirect palette to work correctly + // PaletteType::Direct + }; - let mut block_data_array = Vec::new(); - match palette_type { - PaletteType::Indirect(block_size) => { - // Bits per entry - data_buf.put_u8(block_size as u8); - // Palette length - data_buf.put_var_int(&VarInt(palette.len() as i32)); - let mut palette_map = HashMap::new(); - palette.iter().enumerate().for_each(|(i, id)| { - palette_map.insert(**id, i); - // Palette - data_buf.put_var_int(&VarInt(**id as i32)); - }); - for block_clump in chunk.chunks(64 / block_size as usize) { - let mut out_long: i64 = 0; - for block in block_clump.iter().rev() { - let index = palette_map - .get(*block) - .expect("Its just got added, ofc it should be there"); - out_long = out_long << block_size | (*index as i64); - } - block_data_array.push(out_long); + let mut block_data_array = Vec::new(); + match palette_type { + PaletteType::Indirect(block_size) => { + // Bits per entry + data_buf.put_u8(block_size as u8); + // Palette length + data_buf.put_var_int(&VarInt(palette.len() as i32)); + let mut palette_map = HashMap::new(); + palette.iter().enumerate().for_each(|(i, id)| { + palette_map.insert(*id, i); + // Palette + data_buf.put_var_int(&VarInt(**id as i32)); + }); + for block_clump in chunk.chunks(64 / block_size as usize) { + let mut out_long: i64 = 0; + for block in block_clump.iter().rev() { + let index = palette_map + .get(block) + .expect("Its just got added, ofc it should be there"); + out_long = out_long << block_size | (*index as i64); } + block_data_array.push(out_long); } - PaletteType::Direct => { - // Bits per entry - data_buf.put_u8(DIRECT_PALETTE_BITS as u8); - for block_clump in chunk.chunks(64 / DIRECT_PALETTE_BITS as usize) { - let mut out_long: i64 = 0; - for block in block_clump.iter().rev() { - out_long = out_long << DIRECT_PALETTE_BITS | (**block as i64); - } - block_data_array.push(out_long); + } + PaletteType::Direct => { + // Bits per entry + data_buf.put_u8(DIRECT_PALETTE_BITS as u8); + for block_clump in chunk.chunks(64 / DIRECT_PALETTE_BITS as usize) { + let mut out_long: i64 = 0; + let mut shift = 0; + for block in block_clump { + out_long |= (*block as i64) << shift; + shift += DIRECT_PALETTE_BITS; } + block_data_array.push(out_long); } } + } - // Data array length - // TODO: precompute this and omit making the `block_data_array` - data_buf.put_var_int(&VarInt(block_data_array.len() as i32)); - // Data array - for data_int in block_data_array { - data_buf.put_i64(data_int); - } + // Data array length + // TODO: precompute this and omit making the `block_data_array` + data_buf.put_var_int(&VarInt(block_data_array.len() as i32)); + // Data array + for data_int in block_data_array { + data_buf.put_i64(data_int); + } - //// Biomes - // TODO: make biomes work - data_buf.put_u8(0); - data_buf.put_var_int(&VarInt(0)); - data_buf.put_var_int(&VarInt(0)); - }); + //// Biomes + // TODO: make biomes work + data_buf.put_u8(0); + data_buf.put_var_int(&VarInt(0)); + data_buf.put_var_int(&VarInt(0)); + }); // Size buf.put_var_int(&VarInt(data_buf.buf().len() as i32)); @@ -118,10 +115,10 @@ impl<'a> ClientPacket for CChunkData<'a> { buf.put_var_int(&VarInt(0)); // TODO - buf.put_bit_set(&BitSet(VarInt(1), vec![0])); - buf.put_bit_set(&BitSet(VarInt(1), vec![0])); - buf.put_bit_set(&BitSet(VarInt(1), vec![0])); - buf.put_bit_set(&BitSet(VarInt(1), vec![0])); + buf.put_bit_set(&BitSet(VarInt(1), &[0])); + buf.put_bit_set(&BitSet(VarInt(1), &[0])); + buf.put_bit_set(&BitSet(VarInt(1), &[0])); + buf.put_bit_set(&BitSet(VarInt(1), &[0])); // buf.put_bit_set(&BitSet(VarInt(0), vec![])); // buf.put_bit_set(&BitSet(VarInt(0), vec![])); // buf.put_bit_set(&BitSet(VarInt(0), vec![])); diff --git a/pumpkin-protocol/src/client/play/c_player_info_update.rs b/pumpkin-protocol/src/client/play/c_player_info_update.rs index 163c7ce97..1be348dc5 100644 --- a/pumpkin-protocol/src/client/play/c_player_info_update.rs +++ b/pumpkin-protocol/src/client/play/c_player_info_update.rs @@ -4,7 +4,6 @@ use crate::{bytebuf::ByteBuffer, ClientPacket, Property}; use super::PlayerAction; -#[derive(Clone)] #[packet(0x3E)] pub struct CPlayerInfoUpdate<'a> { pub actions: i8, diff --git a/pumpkin-protocol/src/lib.rs b/pumpkin-protocol/src/lib.rs index f64eca8f6..b46e0f248 100644 --- a/pumpkin-protocol/src/lib.rs +++ b/pumpkin-protocol/src/lib.rs @@ -22,7 +22,7 @@ pub type Identifier = String; pub type VarIntType = i32; pub type VarLongType = i64; -pub struct BitSet(pub VarInt, pub Vec); +pub struct BitSet<'a>(pub VarInt, pub &'a [i64]); #[derive(Debug, Clone, PartialEq, Eq)] pub struct VarInt(pub VarIntType); diff --git a/pumpkin/src/client/player_packet.rs b/pumpkin/src/client/player_packet.rs index a96c8abee..1142d7e0d 100644 --- a/pumpkin/src/client/player_packet.rs +++ b/pumpkin/src/client/player_packet.rs @@ -271,7 +271,7 @@ impl Client { } drop(client); if config.hurt_animation { - // todo + // TODO server.broadcast_packet(self, &CHurtAnimation::new(interact.entity_id, 10.0)) } } diff --git a/pumpkin/src/commands/pumpkin.rs b/pumpkin/src/commands/pumpkin.rs index 88bbb016d..8a648dd50 100644 --- a/pumpkin/src/commands/pumpkin.rs +++ b/pumpkin/src/commands/pumpkin.rs @@ -15,6 +15,6 @@ impl<'a> Command<'a> for PumpkinCommand { fn on_execute(sender: &mut super::CommandSender<'a>, _command: String) { let version = env!("CARGO_PKG_VERSION"); let description = env!("CARGO_PKG_DESCRIPTION"); - sender.send_message(TextComponent::from(format!("Pumpkin {version}, {description} (Minecraft {CURRENT_MC_VERSION}, Protocol {CURRENT_MC_PROTOCOL})")).color_named(NamedColor::Green).bold()) + sender.send_message(TextComponent::from(format!("Pumpkin {version}, {description} (Minecraft {CURRENT_MC_VERSION}, Protocol {CURRENT_MC_PROTOCOL})")).color_named(NamedColor::Green)) } } diff --git a/pumpkin/src/server.rs b/pumpkin/src/server.rs index 578aab5d2..ee31453bb 100644 --- a/pumpkin/src/server.rs +++ b/pumpkin/src/server.rs @@ -127,17 +127,14 @@ impl Server { pub fn remove_client(&mut self, token: &Token) { let client = self.current_clients.remove(token).unwrap(); - let mut client = client.borrow_mut(); + let client = client.borrow(); // despawn the player // todo: put this into the entitiy struct if client.is_player() { let id = client.player.as_ref().unwrap().entity_id(); let uuid = client.gameprofile.as_ref().unwrap().id; - self.broadcast_packet_expect( - &mut client, - &CRemovePlayerInfo::new(1.into(), &[UUID(uuid)]), - ); - self.broadcast_packet_expect(&mut client, &CRemoveEntities::new(&[id.into()])) + self.broadcast_packet_expect(&client, &CRemovePlayerInfo::new(1.into(), &[UUID(uuid)])); + self.broadcast_packet_expect(&client, &CRemoveEntities::new(&[id.into()])) } } @@ -313,7 +310,6 @@ impl Server { // Check if client is a player let mut client = client.borrow_mut(); if client.is_player() { - // we need to clone, Because we send a new packet to every client client.send_packet(packet); } } @@ -327,7 +323,6 @@ impl Server { // Check if client is a player let mut client = client.borrow_mut(); if client.is_player() { - // we need to clone, Because we send a new packet to every client client.send_packet(packet); } } @@ -360,7 +355,7 @@ impl Server { let mut test = ByteBuffer::empty(); CChunkData(chunk.1.as_ref().unwrap()).write(&mut test); let len = test.buf().len(); - dbg!( + log::debug!( "Chunk packet size: {}B {}KB {}MB", len, len / 1024, @@ -368,27 +363,15 @@ impl Server { ); } match &chunk.1 { - Err(err) => println!( + Err(err) => log::warn!( "Chunk loading failed for chunk ({},{}): {}", - chunk.0 .0, chunk.0 .1, err + chunk.0 .0, + chunk.0 .1, + err ), Ok(data) => client.send_packet(&CChunkData(data)), } }); - - // let test_chunk = TestChunk::new(); - // client.send_packet(CChunkDataUpdateLight::new( - // 10, - // 10, - // test_chunk.heightmap, - // Vec::new(), - // Vec::new(), - // BitSet(0.into(), Vec::new()), - // BitSet(0.into(), Vec::new()), - // BitSet(0.into(), Vec::new()), - // Vec::new(), - // Vec::new(), - // )); } // move to world