From 8bfc6cafb37c0bc3849c64022eea02e2698b8ed3 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Thu, 13 Mar 2025 21:11:20 -0400 Subject: [PATCH] Send a message when logging in --- src/bin/kawari-world.rs | 28 ++++++++++++++++++++++++++++ src/ipc.rs | 12 ++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/bin/kawari-world.rs b/src/bin/kawari-world.rs index e1aa623..44b75ca 100644 --- a/src/bin/kawari-world.rs +++ b/src/bin/kawari-world.rs @@ -354,6 +354,34 @@ async fn main() { "Client has finished loading... spawning in!" ); + // send welcome message + { + let ipc = IPCSegment { + unk1: 0, + unk2: 0, + op_code: IPCOpCode::ServerChatMessage, + server_id: 0, + timestamp: timestamp_secs(), + data: IPCStructData::ServerChatMessage { + message: "Welcome to Kawari!".to_string(), + unk: 0, + }, + }; + + let response_packet = PacketSegment { + source_actor: state.player_id.unwrap(), + target_actor: state.player_id.unwrap(), + segment_type: SegmentType::Ipc { data: ipc }, + }; + send_packet( + &mut write, + &[response_packet], + &mut state, + CompressionType::Oodle, + ) + .await; + } + // send player spawn { let ipc = IPCSegment { diff --git a/src/ipc.rs b/src/ipc.rs index ff9d1ef..8607c44 100644 --- a/src/ipc.rs +++ b/src/ipc.rs @@ -83,6 +83,8 @@ pub enum IPCOpCode { GameMasterCommand = 0x3B3, // Sent by the server to modify the client's position ActorSetPos = 0x223, + // Sent by the server when they send a chat message + ServerChatMessage = 0x196, } #[binrw] @@ -430,6 +432,15 @@ pub enum IPCStructData { }, #[br(pre_assert(false))] ActorSetPos(ActorSetPos), + #[br(pre_assert(false))] + ServerChatMessage { + unk: u8, // channel? + #[brw(pad_after = 775)] + #[br(count = 775)] + #[br(map = read_string)] + #[bw(map = write_string)] + message: String, + }, } #[binrw] @@ -488,6 +499,7 @@ impl IPCSegment { IPCStructData::ChatMessage { .. } => 1056, IPCStructData::GameMasterCommand { .. } => todo!(), IPCStructData::ActorSetPos { .. } => 24, + IPCStructData::ServerChatMessage { .. } => 776, } } }