diff --git a/azalea-client/src/chat.rs b/azalea-client/src/chat.rs index f805c20f0..255e0898c 100755 --- a/azalea-client/src/chat.rs +++ b/azalea-client/src/chat.rs @@ -2,6 +2,7 @@ use azalea_chat::FormattedText; use azalea_protocol::packets::game::{ + clientbound_disguised_chat_packet::ClientboundMaskedChatPacket, clientbound_player_chat_packet::ClientboundPlayerChatPacket, clientbound_system_chat_packet::ClientboundSystemChatPacket, serverbound_chat_command_packet::ServerboundChatCommandPacket, @@ -30,6 +31,7 @@ use crate::{ pub enum ChatPacket { System(Arc), Player(Arc), + Masked(Arc), } macro_rules! regex { @@ -45,6 +47,7 @@ impl ChatPacket { match self { ChatPacket::System(p) => p.content.clone(), ChatPacket::Player(p) => p.message(), + ChatPacket::Masked(p) => p.message.clone(), } } @@ -72,6 +75,16 @@ impl ChatPacket { return (Some(m[1].to_string()), m[2].to_string()); } + (None, message) + } + ChatPacket::Masked(p) => { + let message = p.message.to_string(); + // It's a system message, so we'll have to match the content + // with regex + if let Some(m) = regex!("^<([a-zA-Z_0-9]{1,16})> (.+)$").captures(&message) { + return (Some(m[1].to_string()), m[2].to_string()); + } + (None, message) } } @@ -91,6 +104,7 @@ impl ChatPacket { match self { ChatPacket::System(_) => None, ChatPacket::Player(m) => Some(m.sender), + ChatPacket::Masked(_) => None, } } diff --git a/azalea-client/src/packet_handling/game.rs b/azalea-client/src/packet_handling/game.rs index 20facadb2..6c4ea4f42 100644 --- a/azalea-client/src/packet_handling/game.rs +++ b/azalea-client/src/packet_handling/game.rs @@ -1382,7 +1382,18 @@ pub fn process_packet_events(ecs: &mut World) { ClientboundGamePacket::TabList(_) => {} ClientboundGamePacket::TagQuery(_) => {} ClientboundGamePacket::TakeItemEntity(_) => {} - ClientboundGamePacket::DisguisedChat(_) => {} + ClientboundGamePacket::MaskedChat(p) => { + debug!("Got masked chat packet {p:?}"); + + let mut system_state: SystemState> = + SystemState::new(ecs); + let mut chat_events = system_state.get_mut(ecs); + + chat_events.send(ChatReceivedEvent { + entity: player_entity, + packet: ChatPacket::Masked(Arc::new(p.clone())), + }); + } ClientboundGamePacket::Bundle(_) => {} ClientboundGamePacket::DamageEvent(_) => {} ClientboundGamePacket::HurtAnimation(_) => {} diff --git a/azalea-protocol/src/packets/game/clientbound_disguised_chat_packet.rs b/azalea-protocol/src/packets/game/clientbound_disguised_chat_packet.rs index 9aa9fd6f9..00e0d5770 100644 --- a/azalea-protocol/src/packets/game/clientbound_disguised_chat_packet.rs +++ b/azalea-protocol/src/packets/game/clientbound_disguised_chat_packet.rs @@ -3,8 +3,8 @@ use azalea_buf::McBuf; use azalea_chat::FormattedText; use azalea_protocol_macros::ClientboundGamePacket; -#[derive(Clone, Debug, McBuf, ClientboundGamePacket)] -pub struct ClientboundDisguisedChatPacket { +#[derive(Clone, Debug, McBuf, ClientboundGamePacket, PartialEq)] +pub struct ClientboundMaskedChatPacket { pub message: FormattedText, pub chat_type: ChatTypeBound, } diff --git a/azalea-protocol/src/packets/game/mod.rs b/azalea-protocol/src/packets/game/mod.rs index c806f21d8..0b7fb7eec 100755 --- a/azalea-protocol/src/packets/game/mod.rs +++ b/azalea-protocol/src/packets/game/mod.rs @@ -255,7 +255,7 @@ declare_state_packets!( 0x19: clientbound_damage_event_packet::ClientboundDamageEventPacket, 0x1a: clientbound_delete_chat_packet::ClientboundDeleteChatPacket, 0x1b: clientbound_disconnect_packet::ClientboundDisconnectPacket, - 0x1c: clientbound_disguised_chat_packet::ClientboundDisguisedChatPacket, + 0x1c: clientbound_disguised_chat_packet::ClientboundMaskedChatPacket, 0x1d: clientbound_entity_event_packet::ClientboundEntityEventPacket, 0x1e: clientbound_explode_packet::ClientboundExplodePacket, 0x1f: clientbound_forget_level_chunk_packet::ClientboundForgetLevelChunkPacket,