From ddd3f1e7813ccfc2076e08ed4eabd59d3302b356 Mon Sep 17 00:00:00 2001 From: Snowiiii Date: Sun, 25 Aug 2024 12:06:09 +0200 Subject: [PATCH] Add Serverbound Set Player On Ground --- pumpkin-protocol/src/bytebuf/mod.rs | 2 +- pumpkin-protocol/src/client/login/c_login_success.rs | 4 ++-- pumpkin-protocol/src/client/play/c_player_info_update.rs | 2 +- pumpkin-protocol/src/server/play/mod.rs | 2 ++ pumpkin-protocol/src/server/play/s_player_ground.rs | 8 ++++++++ pumpkin/src/client/client_packet.rs | 2 +- pumpkin/src/client/player_packet.rs | 6 +++++- pumpkin/src/entity/player.rs | 6 +++++- 8 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 pumpkin-protocol/src/server/play/s_player_ground.rs diff --git a/pumpkin-protocol/src/bytebuf/mod.rs b/pumpkin-protocol/src/bytebuf/mod.rs index 250d4fa1f..d6be909de 100644 --- a/pumpkin-protocol/src/bytebuf/mod.rs +++ b/pumpkin-protocol/src/bytebuf/mod.rs @@ -119,7 +119,7 @@ impl ByteBuffer { } } - pub fn put_uuid(&mut self, v: uuid::Uuid) { + pub fn put_uuid(&mut self, v: &uuid::Uuid) { // thats the vanilla way let pair = v.as_u64_pair(); self.put_u64(pair.0); diff --git a/pumpkin-protocol/src/client/login/c_login_success.rs b/pumpkin-protocol/src/client/login/c_login_success.rs index 4177d1c5a..cf0d52ee8 100644 --- a/pumpkin-protocol/src/client/login/c_login_success.rs +++ b/pumpkin-protocol/src/client/login/c_login_success.rs @@ -4,7 +4,7 @@ use crate::{bytebuf::ByteBuffer, ClientPacket, Property}; #[packet(0x02)] pub struct CLoginSuccess<'a> { - pub uuid: uuid::Uuid, + pub uuid: &'a uuid::Uuid, pub username: &'a str, // 16 pub properties: &'a [Property], pub strict_error_handling: bool, @@ -12,7 +12,7 @@ pub struct CLoginSuccess<'a> { impl<'a> CLoginSuccess<'a> { pub fn new( - uuid: uuid::Uuid, + uuid: &'a uuid::Uuid, username: &'a str, properties: &'a [Property], strict_error_handling: bool, 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 1be348dc5..e85f2637f 100644 --- a/pumpkin-protocol/src/client/play/c_player_info_update.rs +++ b/pumpkin-protocol/src/client/play/c_player_info_update.rs @@ -25,7 +25,7 @@ impl<'a> ClientPacket for CPlayerInfoUpdate<'a> { fn write(&self, bytebuf: &mut ByteBuffer) { bytebuf.put_i8(self.actions); bytebuf.put_list::(self.players, |p, v| { - p.put_uuid(v.uuid); + p.put_uuid(&v.uuid); for action in &v.actions { match action { PlayerAction::AddPlayer { name, properties } => { diff --git a/pumpkin-protocol/src/server/play/mod.rs b/pumpkin-protocol/src/server/play/mod.rs index 2cccb9c2e..0e2fc9a26 100644 --- a/pumpkin-protocol/src/server/play/mod.rs +++ b/pumpkin-protocol/src/server/play/mod.rs @@ -7,6 +7,7 @@ mod s_interact; mod s_ping_request; mod s_player_action; mod s_player_command; +mod s_player_ground; mod s_player_position; mod s_player_position_rotation; mod s_player_rotation; @@ -24,6 +25,7 @@ pub use s_interact::*; pub use s_ping_request::*; pub use s_player_action::*; pub use s_player_command::*; +pub use s_player_ground::*; pub use s_player_position::*; pub use s_player_position_rotation::*; pub use s_player_rotation::*; diff --git a/pumpkin-protocol/src/server/play/s_player_ground.rs b/pumpkin-protocol/src/server/play/s_player_ground.rs new file mode 100644 index 000000000..915d8614e --- /dev/null +++ b/pumpkin-protocol/src/server/play/s_player_ground.rs @@ -0,0 +1,8 @@ +use pumpkin_macros::packet; +use serde::Deserialize; + +#[derive(Deserialize)] +#[packet(0x1D)] +pub struct SSetPlayerGround { + pub on_ground: bool, +} diff --git a/pumpkin/src/client/client_packet.rs b/pumpkin/src/client/client_packet.rs index d93e72a30..7ba6cfb62 100644 --- a/pumpkin/src/client/client_packet.rs +++ b/pumpkin/src/client/client_packet.rs @@ -175,7 +175,7 @@ impl Client { } if let Some(profile) = self.gameprofile.as_ref().cloned() { - let packet = CLoginSuccess::new(profile.id, &profile.name, &profile.properties, false); + let packet = CLoginSuccess::new(&profile.id, &profile.name, &profile.properties, false); self.send_packet(&packet); } else { self.kick("game profile is none"); diff --git a/pumpkin/src/client/player_packet.rs b/pumpkin/src/client/player_packet.rs index fff71fb08..1d405081d 100644 --- a/pumpkin/src/client/player_packet.rs +++ b/pumpkin/src/client/player_packet.rs @@ -10,7 +10,7 @@ use num_traits::FromPrimitive; use pumpkin_core::text::TextComponent; use pumpkin_entity::EntityId; use pumpkin_inventory::WindowType; -use pumpkin_protocol::server::play::SCloseContainer; +use pumpkin_protocol::server::play::{SCloseContainer, SSetPlayerGround}; use pumpkin_protocol::{ client::play::{ Animation, CAcknowledgeBlockChange, CBlockUpdate, CEntityAnimation, CEntityVelocity, @@ -178,6 +178,10 @@ impl Player { handle_command(&mut CommandSender::Player(self), &command.command); } + pub fn handle_player_ground(&mut self, _server: &mut Server, ground: SSetPlayerGround) { + self.on_ground = ground.on_ground; + } + pub fn handle_player_command(&mut self, _server: &mut Server, command: SPlayerCommand) { if command.entity_id != self.entity.entity_id.into() { return; diff --git a/pumpkin/src/entity/player.rs b/pumpkin/src/entity/player.rs index 8a8d3471d..9925278ee 100644 --- a/pumpkin/src/entity/player.rs +++ b/pumpkin/src/entity/player.rs @@ -11,7 +11,7 @@ use pumpkin_protocol::{ server::play::{ SChatCommand, SChatMessage, SClientInformationPlay, SConfirmTeleport, SInteract, SPlayPingRequest, SPlayerAction, SPlayerCommand, SPlayerPosition, SPlayerPositionRotation, - SPlayerRotation, SSetCreativeSlot, SSetHeldItem, SSwingArm, SUseItemOn, + SPlayerRotation, SSetCreativeSlot, SSetHeldItem, SSetPlayerGround, SSwingArm, SUseItemOn, }, ConnectionState, RawPacket, ServerPacket, VarInt, }; @@ -192,6 +192,10 @@ impl Player { self.handle_rotation(server, SPlayerRotation::read(bytebuf)?); Ok(()) } + SSetPlayerGround::PACKET_ID => { + self.handle_player_ground(server, SSetPlayerGround::read(bytebuf)?); + Ok(()) + } SPlayerCommand::PACKET_ID => { self.handle_player_command(server, SPlayerCommand::read(bytebuf)?); Ok(())