Skip to content

Commit c6b576b

Browse files
committed
feat: basic unsigned chat
1 parent 1771a50 commit c6b576b

File tree

5 files changed

+80
-0
lines changed

5 files changed

+80
-0
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
use ferrumc_core::identity::player_identity::PlayerIdentity;
2+
use ferrumc_macros::event_handler;
3+
use ferrumc_net::{packets::{incoming::chat_message::ChatMessageEvent, outgoing::system_message::SystemMessagePacket}, utils::broadcast::{BroadcastOptions, BroadcastToAll}, NetResult};
4+
use ferrumc_state::GlobalState;
5+
use ferrumc_text::TextComponentBuilder;
6+
7+
#[event_handler]
8+
async fn chat_message(
9+
event: ChatMessageEvent,
10+
state: GlobalState
11+
) -> NetResult<ChatMessageEvent> {
12+
let identity = state.universe.get::<PlayerIdentity>(event.player_conn_id)?;
13+
let message = TextComponentBuilder::new(format!("<{}> {}", identity.username, event.message)).build();
14+
let packet = SystemMessagePacket::new(message, false);
15+
state.broadcast(&packet, BroadcastOptions::default().all()).await?;
16+
17+
Ok(event)
18+
}

src/bin/src/packet_handlers/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ mod handshake;
33
mod login_process;
44
mod tick_handler;
55
mod transform;
6+
mod chat_message;

src/lib/net/crates/codec/src/decode/primitives.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,24 @@ where
8383
}
8484
}
8585

86+
/// This implementation assumes that the optional was written using PacketByteBuf#writeNullable and has a leading bool.
87+
impl<T> NetDecode for Option<T>
88+
where
89+
T: NetDecode,
90+
{
91+
fn decode<R: Read>(reader: &mut R, opts: &NetDecodeOpts) -> NetDecodeResult<Self> {
92+
let is_some = <bool as NetDecode>::decode(reader, opts)?;
93+
94+
if !is_some {
95+
return Ok(None)
96+
}
97+
98+
let value = <T as NetDecode>::decode(reader, opts)?;
99+
100+
Ok(Some(value))
101+
}
102+
}
103+
86104
/// This isn't actually a type in the Minecraft Protocol. This is just for saving data/ or for general use.
87105
/// It was created for saving/reading chunks!
88106
impl<K, V> NetDecode for HashMap<K, V>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use std::sync::Arc;
2+
3+
use ferrumc_events::infrastructure::Event;
4+
use ferrumc_macros::{packet, Event, NetDecode};
5+
use ferrumc_net_codec::net_types::var_int::VarInt;
6+
use ferrumc_state::ServerState;
7+
8+
use crate::packets::IncomingPacket;
9+
10+
#[derive(NetDecode, Debug, Clone)]
11+
#[packet(packet_id = 0x06, state = "play")]
12+
pub struct ChatMessagePacket {
13+
pub message: String,
14+
pub timestamp: u64,
15+
pub salt: u64,
16+
pub has_signature: bool,
17+
pub signature: Option<Vec<u64>>,
18+
pub message_count: VarInt,
19+
pub acknowledged: Vec<u8>
20+
}
21+
22+
impl IncomingPacket for ChatMessagePacket {
23+
async fn handle(
24+
self,
25+
conn_id: usize,
26+
state: Arc<ServerState>,
27+
) -> crate::NetResult<()> {
28+
ChatMessageEvent::trigger(ChatMessageEvent::new(conn_id, self.message), state).await
29+
}
30+
}
31+
32+
#[derive(Debug, Event, Clone)]
33+
pub struct ChatMessageEvent {
34+
pub player_conn_id: usize,
35+
pub message: String,
36+
}
37+
38+
impl ChatMessageEvent {
39+
pub fn new(player_conn_id: usize, message: String) -> Self {
40+
Self { player_conn_id, message }
41+
}
42+
}

src/lib/net/src/packets/incoming/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ pub mod set_player_position_and_rotation;
1616
pub mod set_player_rotation;
1717

1818
pub mod command;
19+
pub mod chat_message;

0 commit comments

Comments
 (0)