From 50051d9dc965492e0c3d00eb0688e41c6c27ec12 Mon Sep 17 00:00:00 2001 From: Snowiiii Date: Mon, 12 Aug 2024 18:18:53 +0200 Subject: [PATCH] Fixed: Clientbound Entity Metadata --- .../src/client/play/c_entity_metadata.rs | 6 +++-- pumpkin/src/client/client_packet.rs | 1 + pumpkin/src/client/player_packet.rs | 23 +++++++--------- pumpkin/src/server.rs | 26 ++++++++++++------- 4 files changed, 31 insertions(+), 25 deletions(-) diff --git a/pumpkin-protocol/src/client/play/c_entity_metadata.rs b/pumpkin-protocol/src/client/play/c_entity_metadata.rs index 2127cf0ab..82c8c1931 100644 --- a/pumpkin-protocol/src/client/play/c_entity_metadata.rs +++ b/pumpkin-protocol/src/client/play/c_entity_metadata.rs @@ -7,14 +7,16 @@ use crate::VarInt; #[packet(0x58)] pub struct CSetEntityMetadata { entity_id: VarInt, - metadata: Vec, + metadata: Metadata, + end: u8, } impl CSetEntityMetadata { - pub fn new(entity_id: VarInt, metadata: Vec) -> Self { + pub fn new(entity_id: VarInt, metadata: Metadata) -> Self { Self { entity_id, metadata, + end: 255, } } } diff --git a/pumpkin/src/client/client_packet.rs b/pumpkin/src/client/client_packet.rs index 3737f04a5..9e29f2f6a 100644 --- a/pumpkin/src/client/client_packet.rs +++ b/pumpkin/src/client/client_packet.rs @@ -200,6 +200,7 @@ impl Client { _server: &mut Server, client_information: SClientInformation, ) { + dbg!("got client settings"); self.config = Some(PlayerConfig { locale: client_information.locale, view_distance: client_information.view_distance, diff --git a/pumpkin/src/client/player_packet.rs b/pumpkin/src/client/player_packet.rs index ff7ea586b..2acc17764 100644 --- a/pumpkin/src/client/player_packet.rs +++ b/pumpkin/src/client/player_packet.rs @@ -73,7 +73,7 @@ impl Client { server.broadcast_packet( self, - CUpdateEntityPos::new( + &CUpdateEntityPos::new( entity_id.into(), (x * 4096.0 - lastx * 4096.0) as i16, (y * 4096.0 - lasty * 4096.0) as i16, @@ -120,7 +120,7 @@ impl Client { server.broadcast_packet( self, - CUpdateEntityPosRot::new( + &CUpdateEntityPosRot::new( entity_id.into(), (x * 4096.0 - lastx * 4096.0) as i16, (y * 4096.0 - lasty * 4096.0) as i16, @@ -130,7 +130,7 @@ impl Client { on_ground, ), ); - server.broadcast_packet(self, CHeadRot::new(entity_id.into(), head_yaw as u8)); + server.broadcast_packet(self, &CHeadRot::new(entity_id.into(), head_yaw as u8)); } pub fn handle_rotation(&mut self, server: &mut Server, rotation: SPlayerRotation) { @@ -151,9 +151,9 @@ impl Client { server.broadcast_packet( self, - CUpdateEntityRot::new(entity_id.into(), yaw as u8, pitch as u8, on_ground), + &CUpdateEntityRot::new(entity_id.into(), yaw as u8, pitch as u8, on_ground), ); - server.broadcast_packet(self, CHeadRot::new(entity_id.into(), head_yaw as u8)); + server.broadcast_packet(self, &CHeadRot::new(entity_id.into(), head_yaw as u8)); } pub fn handle_chat_command(&mut self, _server: &mut Server, command: SChatCommand) { @@ -191,14 +191,11 @@ impl Client { pub fn handle_chat_message(&mut self, server: &mut Server, chat_message: SChatMessage) { let message = chat_message.message; - server.broadcast_packet( - self, - COpenScreen::new( - VarInt(0), - VarInt(WindowType::CraftingTable as i32), - TextComponent::from("Test Crafter"), - ), - ); + self.send_packet(&COpenScreen::new( + VarInt(0), + VarInt(WindowType::CraftingTable as i32), + TextComponent::from("Test Crafter"), + )); // TODO: filter message & validation let gameprofile = self.gameprofile.as_ref().unwrap(); dbg!("got message"); diff --git a/pumpkin/src/server.rs b/pumpkin/src/server.rs index 8f743888c..0c3a85426 100644 --- a/pumpkin/src/server.rs +++ b/pumpkin/src/server.rs @@ -17,7 +17,8 @@ use pumpkin_protocol::{ config::CPluginMessage, play::{ CChunkDataUpdateLight, CGameEvent, CLogin, CPlayerAbilities, CPlayerInfoUpdate, - CRemoveEntities, CRemovePlayerInfo, CSpawnEntity, PlayerAction, + CRemoveEntities, CRemovePlayerInfo, CSetEntityMetadata, CSpawnEntity, Metadata, + PlayerAction, }, }, uuid::UUID, @@ -130,8 +131,11 @@ impl Server { if client.is_player() { let id = client.player.as_ref().unwrap().entity_id(); let uuid = client.gameprofile.as_ref().unwrap().id; - self.broadcast_packet(&mut client, CRemovePlayerInfo::new(1.into(), &[UUID(uuid)])); - self.broadcast_packet(&mut client, CRemoveEntities::new(&[id.into()])) + self.broadcast_packet_expect( + &mut client, + &CRemovePlayerInfo::new(1.into(), &[UUID(uuid)]), + ); + self.broadcast_packet_expect(&mut client, &CRemoveEntities::new(&[id.into()])) } } @@ -187,7 +191,7 @@ impl Server { // also send his info to everyone else self.broadcast_packet( client, - CPlayerInfoUpdate::new( + &CPlayerInfoUpdate::new( 0x01 | 0x08, &[pumpkin_protocol::client::play::Player { uuid: gameprofile.id, @@ -272,30 +276,32 @@ impl Server { } } // entity meta data - /* if let Some(config) = &client.config { + if let Some(config) = &client.config { self.broadcast_packet( client, - CSetEntityMetadata::new(entity_id.into(), vec![Metadata::new(18, VarInt(0), 0)]), + &CSetEntityMetadata::new( + entity_id.into(), + Metadata::new(17, VarInt(0), config.skin_parts), + ), ) } - */ // Server::spawn_test_chunk(client); } /// Sends a Packet to all Players - pub fn broadcast_packet

(&mut self, from: &mut Client, packet: P) + pub fn broadcast_packet

(&mut self, from: &mut Client, packet: &P) where P: ClientPacket, { // we can't borrow twice at same time - from.send_packet(&packet); + from.send_packet(packet); for (_, client) in self.current_clients.iter().filter(|c| c.0 != &from.token) { // 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); + client.send_packet(packet); } } }