Skip to content

Commit

Permalink
Chunks: remove some clone's
Browse files Browse the repository at this point in the history
  • Loading branch information
Snowiiii committed Aug 13, 2024
1 parent 9fc86e2 commit 6510890
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 112 deletions.
2 changes: 1 addition & 1 deletion pumpkin-protocol/src/bytebuf/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down
4 changes: 2 additions & 2 deletions pumpkin-protocol/src/bytebuf/packet_id.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
// TODO: make this right
(self.0.clone(), self.1.clone()).serialize(serializer)
(&self.0, self.1).serialize(serializer)
}
}

Expand Down
157 changes: 77 additions & 80 deletions pumpkin-protocol/src/client/play/c_chunk_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -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![]));
Expand Down
1 change: 0 additions & 1 deletion pumpkin-protocol/src/client/play/c_player_info_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ use crate::{bytebuf::ByteBuffer, ClientPacket, Property};

use super::PlayerAction;

#[derive(Clone)]
#[packet(0x3E)]
pub struct CPlayerInfoUpdate<'a> {
pub actions: i8,
Expand Down
2 changes: 1 addition & 1 deletion pumpkin-protocol/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ pub type Identifier = String;
pub type VarIntType = i32;
pub type VarLongType = i64;

pub struct BitSet(pub VarInt, pub Vec<i64>);
pub struct BitSet<'a>(pub VarInt, pub &'a [i64]);

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct VarInt(pub VarIntType);
Expand Down
2 changes: 1 addition & 1 deletion pumpkin/src/client/player_packet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
}
Expand Down
2 changes: 1 addition & 1 deletion pumpkin/src/commands/pumpkin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
}
33 changes: 8 additions & 25 deletions pumpkin/src/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()]))
}
}

Expand Down Expand Up @@ -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);
}
}
Expand All @@ -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);
}
}
Expand Down Expand Up @@ -360,35 +355,23 @@ 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,
len / (1024 * 1024)
);
}
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
Expand Down

0 comments on commit 6510890

Please sign in to comment.