From e9b475639a844f21f0f705a1f67ab9b3db134184 Mon Sep 17 00:00:00 2001 From: Snowiiii Date: Fri, 2 Aug 2024 12:31:44 +0200 Subject: [PATCH] protocol: add SPluginMessage --- pumpkin-protocol/src/bytebuf/mod.rs | 4 ++++ pumpkin-protocol/src/lib.rs | 2 ++ pumpkin-protocol/src/packet_encoder.rs | 5 +---- pumpkin-protocol/src/server/config/mod.rs | 18 +++++++++++++++++- pumpkin/src/client/client_packet.rs | 16 +++++++++++++++- pumpkin/src/client/mod.rs | 7 ++++++- 6 files changed, 45 insertions(+), 7 deletions(-) diff --git a/pumpkin-protocol/src/bytebuf/mod.rs b/pumpkin-protocol/src/bytebuf/mod.rs index faeed3e91..be080f8e2 100644 --- a/pumpkin-protocol/src/bytebuf/mod.rs +++ b/pumpkin-protocol/src/bytebuf/mod.rs @@ -280,4 +280,8 @@ impl ByteBuffer { pub fn put_slice(&mut self, src: &[u8]) { self.buffer.put_slice(src) } + + pub fn get_slice(&mut self) -> BytesMut { + self.buffer.split() + } } diff --git a/pumpkin-protocol/src/lib.rs b/pumpkin-protocol/src/lib.rs index b87521bb3..3008df480 100644 --- a/pumpkin-protocol/src/lib.rs +++ b/pumpkin-protocol/src/lib.rs @@ -14,6 +14,8 @@ pub mod packet_encoder; pub const MAX_PACKET_SIZE: i32 = 2097152; +/// usally uses a namespace like "minecraft:thing" +pub type Identifier = String; pub type VarInt = i32; pub type VarLong = i64; diff --git a/pumpkin-protocol/src/packet_encoder.rs b/pumpkin-protocol/src/packet_encoder.rs index ac9af376a..bd0831c0f 100644 --- a/pumpkin-protocol/src/packet_encoder.rs +++ b/pumpkin-protocol/src/packet_encoder.rs @@ -3,10 +3,7 @@ use std::io::Write; use aes::cipher::{generic_array::GenericArray, BlockEncryptMut, BlockSizeUser, KeyIvInit}; use bytes::{BufMut, BytesMut}; -use crate::{ - bytebuf::ByteBuffer, ClientPacket, PacketError, VarInt32, - MAX_PACKET_SIZE, -}; +use crate::{bytebuf::ByteBuffer, ClientPacket, PacketError, VarInt32, MAX_PACKET_SIZE}; type Cipher = cfb8::Encryptor; diff --git a/pumpkin-protocol/src/server/config/mod.rs b/pumpkin-protocol/src/server/config/mod.rs index d137bdf73..89e30e9fa 100644 --- a/pumpkin-protocol/src/server/config/mod.rs +++ b/pumpkin-protocol/src/server/config/mod.rs @@ -1,4 +1,4 @@ -use crate::{bytebuf::ByteBuffer, ServerPacket, VarInt}; +use crate::{bytebuf::ByteBuffer, Identifier, ServerPacket, VarInt}; pub struct SClientInformation { pub locale: String, // 16 @@ -28,6 +28,22 @@ impl ServerPacket for SClientInformation { } } +pub struct SPluginMessage { + pub channel: Identifier, + pub data: Vec, +} + +impl ServerPacket for SPluginMessage { + const PACKET_ID: VarInt = 0x02; + + fn read(bytebuf: &mut ByteBuffer) -> Self { + Self { + channel: bytebuf.get_string().unwrap(), + data: bytebuf.get_slice().to_vec(), + } + } +} + pub struct SAcknowledgeFinishConfig {} impl ServerPacket for SAcknowledgeFinishConfig { diff --git a/pumpkin/src/client/client_packet.rs b/pumpkin/src/client/client_packet.rs index a7e84a210..4c9be7aa0 100644 --- a/pumpkin/src/client/client_packet.rs +++ b/pumpkin/src/client/client_packet.rs @@ -1,3 +1,4 @@ + use pumpkin_protocol::{ client::{ config::{CFinishConfig, CKnownPacks, CRegistryData, Entry}, @@ -5,7 +6,7 @@ use pumpkin_protocol::{ status::{CPingResponse, CStatusResponse}, }, server::{ - config::{SAcknowledgeFinishConfig, SClientInformation, SKnownPacks}, + config::{SAcknowledgeFinishConfig, SClientInformation, SKnownPacks, SPluginMessage}, handshake::SHandShake, login::{SEncryptionResponse, SLoginAcknowledged, SLoginPluginResponse, SLoginStart}, status::{SPingRequest, SStatusRequest}, @@ -52,6 +53,7 @@ pub trait ClientPacketProcessor { server: &mut Server, client_information: SClientInformation, ); + fn handle_plugin_message(&mut self, server: &mut Server, plugin_message: SPluginMessage); fn handle_known_packs(&mut self, server: &mut Server, config_acknowledged: SKnownPacks); fn handle_config_acknowledged( &mut self, @@ -161,6 +163,18 @@ impl ClientPacketProcessor for Client { }); } + fn handle_plugin_message(&mut self, _server: &mut Server, plugin_message: SPluginMessage) { + if plugin_message.channel.starts_with("minecraft:brand") + || plugin_message.channel.starts_with("MC|Brand") + { + dbg!("got a client brand"); + match String::from_utf8(plugin_message.data) { + Ok(brand) => self.brand = Some(brand), + Err(e) => self.kick(&e.to_string()), + } + } + } + fn handle_known_packs(&mut self, server: &mut Server, config_acknowledged: SKnownPacks) { self.send_packet(CRegistryData::new( "dimension_type", diff --git a/pumpkin/src/client/mod.rs b/pumpkin/src/client/mod.rs index 7a2bb4e69..9916cf078 100644 --- a/pumpkin/src/client/mod.rs +++ b/pumpkin/src/client/mod.rs @@ -15,7 +15,7 @@ use pumpkin_protocol::{ packet_decoder::PacketDecoder, packet_encoder::PacketEncoder, server::{ - config::{SAcknowledgeFinishConfig, SClientInformation, SKnownPacks}, + config::{SAcknowledgeFinishConfig, SClientInformation, SKnownPacks, SPluginMessage}, handshake::SHandShake, login::{SEncryptionResponse, SLoginAcknowledged, SLoginPluginResponse, SLoginStart}, status::{SPingRequest, SStatusRequest}, @@ -49,6 +49,7 @@ pub struct Client { pub name: Option, pub uuid: Option, pub config: Option, + pub brand: Option, pub connection_state: ConnectionState, pub encrytion: bool, @@ -66,6 +67,7 @@ impl Client { name: None, uuid: None, config: None, + brand: None, token, player: None, connection_state: ConnectionState::HandShake, @@ -169,6 +171,9 @@ impl Client { SClientInformation::PACKET_ID => { self.handle_client_information(server, SClientInformation::read(bytebuf)) } + SPluginMessage::PACKET_ID => { + self.handle_plugin_message(server, SPluginMessage::read(bytebuf)) + } SAcknowledgeFinishConfig::PACKET_ID => { self.handle_config_acknowledged(server, SAcknowledgeFinishConfig::read(bytebuf)) }