From 231b8fbb34197c9f3aab0304ba0b4907cf48a2dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nils=20Kr=C3=BCger?= Date: Mon, 30 Dec 2024 00:32:58 +0100 Subject: [PATCH] feat: basic unsigned chat --- src/bin/src/packet_handlers/chat_message.rs | 24 +++++++++++ src/bin/src/packet_handlers/mod.rs | 1 + .../net/crates/codec/src/decode/primitives.rs | 18 ++++++++ .../net/src/packets/incoming/chat_message.rs | 41 +++++++++++++++++++ src/lib/net/src/packets/incoming/mod.rs | 1 + 5 files changed, 85 insertions(+) create mode 100644 src/bin/src/packet_handlers/chat_message.rs create mode 100644 src/lib/net/src/packets/incoming/chat_message.rs diff --git a/src/bin/src/packet_handlers/chat_message.rs b/src/bin/src/packet_handlers/chat_message.rs new file mode 100644 index 00000000..0d69812c --- /dev/null +++ b/src/bin/src/packet_handlers/chat_message.rs @@ -0,0 +1,24 @@ +use ferrumc_core::identity::player_identity::PlayerIdentity; +use ferrumc_macros::event_handler; +use ferrumc_net::{ + packets::{ + incoming::chat_message::ChatMessageEvent, outgoing::system_message::SystemMessagePacket, + }, + utils::broadcast::{BroadcastOptions, BroadcastToAll}, + NetResult, +}; +use ferrumc_state::GlobalState; +use ferrumc_text::TextComponentBuilder; + +#[event_handler] +async fn chat_message(event: ChatMessageEvent, state: GlobalState) -> NetResult { + let identity = state.universe.get::(event.player_conn_id)?; + let message = + TextComponentBuilder::new(format!("<{}> {}", identity.username, event.message)).build(); + let packet = SystemMessagePacket::new(message, false); + state + .broadcast(&packet, BroadcastOptions::default().all()) + .await?; + + Ok(event) +} diff --git a/src/bin/src/packet_handlers/mod.rs b/src/bin/src/packet_handlers/mod.rs index b6362dcc..59affd21 100644 --- a/src/bin/src/packet_handlers/mod.rs +++ b/src/bin/src/packet_handlers/mod.rs @@ -1,3 +1,4 @@ +mod chat_message; mod commands; mod handshake; mod login_process; diff --git a/src/lib/net/crates/codec/src/decode/primitives.rs b/src/lib/net/crates/codec/src/decode/primitives.rs index 3e00e794..a7b6c672 100644 --- a/src/lib/net/crates/codec/src/decode/primitives.rs +++ b/src/lib/net/crates/codec/src/decode/primitives.rs @@ -83,6 +83,24 @@ where } } +/// This implementation assumes that the optional was written using PacketByteBuf#writeNullable and has a leading bool. +impl NetDecode for Option +where + T: NetDecode, +{ + fn decode(reader: &mut R, opts: &NetDecodeOpts) -> NetDecodeResult { + let is_some = ::decode(reader, opts)?; + + if !is_some { + return Ok(None); + } + + let value = ::decode(reader, opts)?; + + Ok(Some(value)) + } +} + /// This isn't actually a type in the Minecraft Protocol. This is just for saving data/ or for general use. /// It was created for saving/reading chunks! impl NetDecode for HashMap diff --git a/src/lib/net/src/packets/incoming/chat_message.rs b/src/lib/net/src/packets/incoming/chat_message.rs new file mode 100644 index 00000000..c073368c --- /dev/null +++ b/src/lib/net/src/packets/incoming/chat_message.rs @@ -0,0 +1,41 @@ +use std::sync::Arc; + +use ferrumc_events::infrastructure::Event; +use ferrumc_macros::{packet, Event, NetDecode}; +use ferrumc_net_codec::net_types::var_int::VarInt; +use ferrumc_state::ServerState; + +use crate::packets::IncomingPacket; + +#[derive(NetDecode, Debug, Clone)] +#[packet(packet_id = 0x06, state = "play")] +pub struct ChatMessagePacket { + pub message: String, + pub timestamp: u64, + pub salt: u64, + pub has_signature: bool, + pub signature: Option>, + pub message_count: VarInt, + pub acknowledged: Vec, +} + +impl IncomingPacket for ChatMessagePacket { + async fn handle(self, conn_id: usize, state: Arc) -> crate::NetResult<()> { + ChatMessageEvent::trigger(ChatMessageEvent::new(conn_id, self.message), state).await + } +} + +#[derive(Debug, Event, Clone)] +pub struct ChatMessageEvent { + pub player_conn_id: usize, + pub message: String, +} + +impl ChatMessageEvent { + pub fn new(player_conn_id: usize, message: String) -> Self { + Self { + player_conn_id, + message, + } + } +} diff --git a/src/lib/net/src/packets/incoming/mod.rs b/src/lib/net/src/packets/incoming/mod.rs index b7994e38..609f328f 100644 --- a/src/lib/net/src/packets/incoming/mod.rs +++ b/src/lib/net/src/packets/incoming/mod.rs @@ -15,4 +15,5 @@ pub mod set_player_position; pub mod set_player_position_and_rotation; pub mod set_player_rotation; +pub mod chat_message; pub mod command;