From f3f25eb219ac348b4821169ac18442dbc0f499a0 Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Fri, 2 May 2025 00:03:36 -0400 Subject: [PATCH] Overhaul segment types, their names and their order --- src/bin/kawari-lobby.rs | 10 ++-- src/bin/kawari-world.rs | 57 +++++++++++++-------- src/lobby/connection.rs | 42 ++++++++++------ src/packet/mod.rs | 4 +- src/packet/parsing.rs | 102 ++++++++++++++++++++++---------------- src/world/chat_handler.rs | 23 ++++++--- src/world/connection.rs | 70 +++++++++++++++++--------- src/world/lua.rs | 11 ++-- 8 files changed, 197 insertions(+), 122 deletions(-) diff --git a/src/bin/kawari-lobby.rs b/src/bin/kawari-lobby.rs index 9ecd38c..ef6b52b 100644 --- a/src/bin/kawari-lobby.rs +++ b/src/bin/kawari-lobby.rs @@ -10,7 +10,7 @@ use kawari::lobby::ipc::{ClientLobbyIpcData, ServerLobbyIpcSegment}; use kawari::lobby::send_custom_world_packet; use kawari::oodle::OodleNetwork; use kawari::packet::ConnectionType; -use kawari::packet::{PacketState, SegmentType, send_keep_alive}; +use kawari::packet::{PacketState, SegmentData, send_keep_alive}; use tokio::io::AsyncReadExt; use tokio::net::TcpListener; @@ -60,11 +60,11 @@ async fn main() { if n != 0 { let (segments, _) = connection.parse_packet(&buf[..n]).await; for segment in &segments { - match &segment.segment_type { - SegmentType::InitializeEncryption { phrase, key } => { + match &segment.data { + SegmentData::SecuritySetup { phrase, key } => { connection.initialize_encryption(phrase, key).await } - SegmentType::Ipc { data } => match &data.data { + SegmentData::Ipc { data } => match &data.data { ClientLobbyIpcData::LoginEx { sequence, session_id, @@ -150,7 +150,7 @@ async fn main() { .await; } }, - SegmentType::KeepAlive { id, timestamp } => { + SegmentData::KeepAliveRequest { id, timestamp } => { send_keep_alive::( &mut connection.socket, &mut connection.state, diff --git a/src/bin/kawari-world.rs b/src/bin/kawari-world.rs index d20d62d..90f4a89 100644 --- a/src/bin/kawari-world.rs +++ b/src/bin/kawari-world.rs @@ -11,8 +11,8 @@ use kawari::config::get_config; use kawari::oodle::OodleNetwork; use kawari::opcodes::ServerZoneIpcType; use kawari::packet::{ - CompressionType, ConnectionType, PacketSegment, PacketState, SegmentType, send_keep_alive, - send_packet, + CompressionType, ConnectionType, PacketSegment, PacketState, SegmentData, SegmentType, + send_keep_alive, send_packet, }; use kawari::world::ipc::{ ActionEffect, ActionResult, ClientZoneIpcData, EffectKind, GameMasterCommandType, @@ -272,10 +272,10 @@ async fn client_loop( if n > 0 { let (segments, connection_type) = connection.parse_packet(&buf[..n]).await; for segment in &segments { - match &segment.segment_type { - SegmentType::InitializeSession { actor_id } => { + match &segment.data { + SegmentData::Setup { ticket } => { // for some reason they send a string representation - let actor_id = actor_id.parse::().unwrap(); + let actor_id = ticket.parse::().unwrap(); // initialize player data if it doesn't exist' if connection.player_data.actor_id == 0 { @@ -293,7 +293,7 @@ async fn client_loop( connection.handle.send(ToServer::NewClient(client_handle.clone())).await; } } - SegmentType::Ipc { data } => { + SegmentData::Ipc { data } => { match &data.data { ClientZoneIpcData::InitRequest { .. } => { tracing::info!( @@ -317,7 +317,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: connection.player_data.actor_id, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -369,7 +370,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: connection.player_data.actor_id, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -418,7 +420,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: connection.player_data.actor_id, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -438,7 +441,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: connection.player_data.actor_id, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -508,7 +512,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: connection.player_data.actor_id, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -528,7 +533,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: connection.player_data.actor_id, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -564,7 +570,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: connection.player_data.actor_id, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -748,7 +755,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: connection.player_data.actor_id, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; @@ -799,7 +807,7 @@ async fn client_loop( } } } - SegmentType::KeepAlive { id, timestamp } => { + SegmentData::KeepAliveRequest { id, timestamp } => { send_keep_alive::( &mut connection.socket, &mut connection.state, @@ -809,10 +817,10 @@ async fn client_loop( ) .await } - SegmentType::KeepAliveResponse { .. } => { + SegmentData::KeepAliveResponse { .. } => { tracing::info!("Got keep alive response from client... cool..."); } - SegmentType::CustomIpc { data } => { + SegmentData::KawariIpc { data } => { match &data.data { CustomIpcData::RequestCreateCharacter { service_account_id, @@ -860,7 +868,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::CustomIpc { + segment_type: SegmentType::KawariIpc, + data: SegmentData::KawariIpc { data: CustomIpcSegment { unk1: 0, unk2: 0, @@ -888,7 +897,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::CustomIpc { + segment_type: SegmentType::KawariIpc, + data: SegmentData::KawariIpc { data: CustomIpcSegment { unk1: 0, unk2: 0, @@ -911,7 +921,8 @@ async fn client_loop( .send_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::CustomIpc { + segment_type: SegmentType::KawariIpc, + data: SegmentData::KawariIpc { data: CustomIpcSegment { unk1: 0, unk2: 0, @@ -958,7 +969,8 @@ async fn client_loop( &[PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::CustomIpc { + segment_type: SegmentType::KawariIpc, + data: SegmentData::KawariIpc { data: CustomIpcSegment { unk1: 0, unk2: 0, @@ -988,7 +1000,8 @@ async fn client_loop( &[PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::CustomIpc { + segment_type: SegmentType::KawariIpc, + data: SegmentData::KawariIpc { data: CustomIpcSegment { unk1: 0, unk2: 0, diff --git a/src/lobby/connection.rs b/src/lobby/connection.rs index 0659076..77f5989 100644 --- a/src/lobby/connection.rs +++ b/src/lobby/connection.rs @@ -14,7 +14,7 @@ use crate::{ oodle::OodleNetwork, opcodes::ServerLobbyIpcType, packet::{ - CompressionType, ConnectionType, PacketSegment, PacketState, SegmentType, + CompressionType, ConnectionType, PacketSegment, PacketState, SegmentData, SegmentType, generate_encryption_key, parse_packet, send_packet, }, }; @@ -76,7 +76,8 @@ impl LobbyConnection { self.send_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::InitializationEncryptionResponse { data }, + segment_type: SegmentType::SecurityInitialize, + data: SegmentData::SecurityInitialize { data }, }) .await; } @@ -103,7 +104,8 @@ impl LobbyConnection { self.send_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -146,7 +148,8 @@ impl LobbyConnection { let response_packet = PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }; packets.push(response_packet); } @@ -167,7 +170,8 @@ impl LobbyConnection { let response_packet = PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }; packets.push(response_packet); } @@ -269,7 +273,8 @@ impl LobbyConnection { self.send_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -301,7 +306,8 @@ impl LobbyConnection { self.send_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -328,7 +334,8 @@ impl LobbyConnection { self.send_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -388,7 +395,8 @@ impl LobbyConnection { self.send_segment(PacketSegment { source_actor: 0x0, target_actor: 0x0, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } else { @@ -410,7 +418,8 @@ impl LobbyConnection { let response_packet = PacketSegment { source_actor: 0x0, target_actor: 0x0, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }; self.send_segment(response_packet).await; } @@ -482,7 +491,8 @@ impl LobbyConnection { self.send_segment(PacketSegment { source_actor: 0x0, target_actor: 0x0, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -534,7 +544,8 @@ impl LobbyConnection { self.send_segment(PacketSegment { source_actor: 0x0, target_actor: 0x0, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -569,7 +580,8 @@ pub async fn send_custom_world_packet(segment: CustomIpcSegment) -> Option = PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::CustomIpc { data: segment }, + segment_type: SegmentType::KawariIpc, + data: SegmentData::KawariIpc { data: segment }, }; send_packet( @@ -587,8 +599,8 @@ pub async fn send_custom_world_packet(segment: CustomIpcSegment) -> Option(&buf[..n], &mut packet_state).await; - return match &segments[0].segment_type { - SegmentType::CustomIpc { data } => Some(data.clone()), + return match &segments[0].data { + SegmentData::KawariIpc { data } => Some(data.clone()), _ => None, }; } diff --git a/src/packet/mod.rs b/src/packet/mod.rs index 41d80b7..d2f9a81 100644 --- a/src/packet/mod.rs +++ b/src/packet/mod.rs @@ -1,8 +1,8 @@ mod parsing; use parsing::PacketHeader; pub use parsing::{ - ConnectionType, PacketSegment, PacketState, SegmentType, parse_packet, send_keep_alive, - send_packet, + ConnectionType, PacketSegment, PacketState, SegmentData, SegmentType, parse_packet, + send_keep_alive, send_packet, }; mod compression; diff --git a/src/packet/parsing.rs b/src/packet/parsing.rs index 907e0f6..9dddacc 100644 --- a/src/packet/parsing.rs +++ b/src/packet/parsing.rs @@ -25,21 +25,44 @@ pub enum ConnectionType { } #[binrw] -#[brw(import(size: u32, encryption_key: Option<&[u8]>))] +#[brw(repr = u16)] +#[derive(Debug, PartialEq, Copy, Clone)] +pub enum SegmentType { + Setup = 0x1, + Initialize = 0x2, + // Also known as "UPLAYER" + Ipc = 0x3, + KeepAliveRequest = 0x7, + KeepAliveResponse = 0x8, + // Also known as "SECSETUP" + SecuritySetup = 0x9, + // Also known as "SECINIT" + SecurityInitialize = 0xA, + // This isn't in retail! + KawariIpc = 0xAAAA, +} + +#[binrw] +#[brw(import(kind: &SegmentType, size: u32, encryption_key: Option<&[u8]>))] #[derive(Debug, Clone)] -pub enum SegmentType { - // Client->Server Packets - #[brw(magic = 0x1u32)] - InitializeSession { +pub enum SegmentData { + #[br(pre_assert(*kind == SegmentType::Setup))] + Setup { #[brw(pad_before = 4)] // empty #[brw(pad_size_to = 36)] #[br(count = 36)] #[br(map = read_string)] #[bw(map = write_string)] - actor_id: String, // square enix in their infinite wisdom has this as a STRING REPRESENTATION of an integer. what + ticket: String, // square enix in their infinite wisdom has this as a STRING REPRESENTATION of an integer. what }, - #[brw(magic = 0x9u32)] - InitializeEncryption { + #[br(pre_assert(*kind == SegmentType::Initialize))] + Initialize { + player_id: u32, + #[brw(pad_after = 32)] + timestamp: u32, + }, + #[br(pre_assert(*kind == SegmentType::SecuritySetup))] + SecuritySetup { #[brw(pad_before = 36)] // empty #[brw(pad_size_to = 32)] #[br(count = 32)] @@ -51,34 +74,25 @@ pub enum SegmentType { #[brw(pad_after = 512)] // empty key: [u8; 4], }, - #[brw(magic = 0x3u32)] + #[br(pre_assert(*kind == SegmentType::Ipc))] Ipc { #[br(parse_with = decrypt, args(size, encryption_key))] #[bw(write_with = encrypt, args(size, encryption_key))] data: T, }, - #[brw(magic = 0x7u32)] - KeepAlive { id: u32, timestamp: u32 }, - - // Server->Client Packets - #[brw(magic = 0xAu32)] - InitializationEncryptionResponse { + #[br(pre_assert(*kind == SegmentType::KeepAliveRequest))] + KeepAliveRequest { id: u32, timestamp: u32 }, + #[br(pre_assert(*kind == SegmentType::SecurityInitialize))] + SecurityInitialize { #[br(count = 0x280)] #[brw(pad_size_to = 640)] data: Vec, }, - #[brw(magic = 0x8u32)] + #[br(pre_assert(*kind == SegmentType::KeepAliveResponse))] KeepAliveResponse { id: u32, timestamp: u32 }, - #[brw(magic = 0x2u32)] - ZoneInitialize { - player_id: u32, - #[brw(pad_after = 32)] - timestamp: u32, - }, - // Custom Packets - #[brw(magic = 0xAAAAu32)] - CustomIpc { data: CustomIpcSegment }, + #[br(pre_assert(*kind == SegmentType::KawariIpc))] + KawariIpc { data: CustomIpcSegment }, } #[binrw] @@ -104,23 +118,25 @@ pub struct PacketSegment { pub size: u32, pub source_actor: u32, pub target_actor: u32, - #[brw(args(size, encryption_key))] - pub segment_type: SegmentType, + #[brw(pad_after = 2)] // padding + pub segment_type: SegmentType, + #[brw(args(&segment_type, size, encryption_key))] + pub data: SegmentData, } impl PacketSegment { pub fn calc_size(&self) -> u32 { let header = std::mem::size_of::() * 4; header as u32 - + match &self.segment_type { - SegmentType::InitializeEncryption { .. } => 616, - SegmentType::InitializationEncryptionResponse { .. } => 640, - SegmentType::Ipc { data } => data.calc_size(), - SegmentType::KeepAlive { .. } => 0x8, - SegmentType::KeepAliveResponse { .. } => 0x8, - SegmentType::ZoneInitialize { .. } => 40, - SegmentType::InitializeSession { .. } => 40, - SegmentType::CustomIpc { data } => data.calc_size(), + + match &self.data { + SegmentData::SecuritySetup { .. } => 616, + SegmentData::SecurityInitialize { .. } => 640, + SegmentData::Ipc { data } => data.calc_size(), + SegmentData::KeepAliveRequest { .. } => 0x8, + SegmentData::KeepAliveResponse { .. } => 0x8, + SegmentData::Initialize { .. } => 40, + SegmentData::Setup { .. } => 40, + SegmentData::KawariIpc { data } => data.calc_size(), } } } @@ -217,7 +233,8 @@ pub async fn send_keep_alive( let response_packet: PacketSegment = PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::KeepAliveResponse { id, timestamp }, + segment_type: SegmentType::KeepAliveResponse, + data: SegmentData::KeepAliveResponse { id, timestamp }, }; send_packet( socket, @@ -261,16 +278,16 @@ mod tests { } let packet_types = [ - SegmentType::InitializeEncryption { + SegmentData::SecuritySetup { phrase: String::new(), key: [0; 4], }, - SegmentType::InitializationEncryptionResponse { data: Vec::new() }, - SegmentType::KeepAlive { + SegmentData::SecurityInitialize { data: Vec::new() }, + SegmentData::KeepAliveRequest { id: 0, timestamp: 0, }, - SegmentType::KeepAliveResponse { + SegmentData::KeepAliveResponse { id: 0, timestamp: 0, }, @@ -282,7 +299,8 @@ mod tests { let packet_segment: PacketSegment = PacketSegment { source_actor: 0, target_actor: 0, - segment_type: packet.clone(), + segment_type: SegmentType::Setup, + data: packet.clone(), }; packet_segment.write_le(&mut cursor).unwrap(); diff --git a/src/world/chat_handler.rs b/src/world/chat_handler.rs index c815f9c..9cfb0f8 100644 --- a/src/world/chat_handler.rs +++ b/src/world/chat_handler.rs @@ -2,7 +2,7 @@ use crate::{ common::{CustomizeData, ObjectId, ObjectTypeId, Position, timestamp_secs}, config::get_config, opcodes::ServerZoneIpcType, - packet::{PacketSegment, SegmentType}, + packet::{PacketSegment, SegmentData, SegmentType}, world::{ Actor, Event, ipc::{ @@ -122,7 +122,8 @@ impl ChatHandler { .send_segment(PacketSegment { source_actor: 0x106ad804, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -147,7 +148,8 @@ impl ChatHandler { .send_segment(PacketSegment { source_actor: 0x106ad804, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -198,7 +200,8 @@ impl ChatHandler { .send_segment(PacketSegment { source_actor: 0x106ad804, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -238,7 +241,8 @@ impl ChatHandler { .send_segment(PacketSegment { source_actor: 0x106ad804, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -277,7 +281,8 @@ impl ChatHandler { .send_segment(PacketSegment { source_actor: connection.player_data.actor_id, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -301,7 +306,8 @@ impl ChatHandler { .send_segment(PacketSegment { source_actor: connection.player_data.actor_id, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -344,7 +350,8 @@ impl ChatHandler { .send_segment(PacketSegment { source_actor: 0x106ad804, target_actor: connection.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } diff --git a/src/world/connection.rs b/src/world/connection.rs index ff919a9..0fa2c3a 100644 --- a/src/world/connection.rs +++ b/src/world/connection.rs @@ -14,8 +14,8 @@ use crate::{ config::get_config, opcodes::{ServerChatIpcType, ServerZoneIpcType}, packet::{ - CompressionType, ConnectionType, PacketSegment, PacketState, SegmentType, parse_packet, - send_packet, + CompressionType, ConnectionType, PacketSegment, PacketState, SegmentData, SegmentType, + parse_packet, send_packet, }, world::chat::{ServerChatIpcData, ServerChatIpcSegment}, }; @@ -199,7 +199,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::KeepAlive { + segment_type: SegmentType::KeepAliveRequest, + data: SegmentData::KeepAliveRequest { id: 0xE0037603u32, timestamp: timestamp_secs(), }, @@ -210,7 +211,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::ZoneInitialize { + segment_type: SegmentType::Initialize, + data: SegmentData::Initialize { player_id: self.player_data.actor_id, timestamp: timestamp_secs(), }, @@ -225,7 +227,8 @@ impl ZoneConnection { self.send_chat_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::KeepAlive { + segment_type: SegmentType::KeepAliveRequest, + data: SegmentData::KeepAliveRequest { id: 0xE0037603u32, timestamp: timestamp_secs(), }, @@ -237,7 +240,8 @@ impl ZoneConnection { self.send_chat_segment(PacketSegment { source_actor: 0, target_actor: 0, - segment_type: SegmentType::ZoneInitialize { + segment_type: SegmentType::Initialize, + data: SegmentData::Initialize { player_id: self.player_data.actor_id, timestamp: timestamp_secs(), }, @@ -262,7 +266,8 @@ impl ZoneConnection { self.send_chat_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -287,7 +292,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -311,7 +317,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: actor_id, target_actor: actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -338,7 +345,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: actor.id.0, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; @@ -364,7 +372,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: actor.id.0, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; @@ -394,7 +403,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -458,7 +468,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -478,7 +489,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -520,7 +532,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; }; @@ -546,7 +559,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -577,7 +591,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; }; @@ -604,7 +619,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -633,7 +649,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -653,7 +670,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -696,7 +714,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; @@ -715,7 +734,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: actor_id.0, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -739,7 +759,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } @@ -802,7 +823,8 @@ impl ZoneConnection { self.send_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }) .await; } diff --git a/src/world/lua.rs b/src/world/lua.rs index ce79548..edb544d 100644 --- a/src/world/lua.rs +++ b/src/world/lua.rs @@ -3,7 +3,7 @@ use mlua::{FromLua, Lua, LuaSerdeExt, UserData, UserDataMethods, Value}; use crate::{ common::{ObjectId, ObjectTypeId, Position, timestamp_secs}, opcodes::ServerZoneIpcType, - packet::{PacketSegment, SegmentType}, + packet::{PacketSegment, SegmentData, SegmentType}, }; use super::{ @@ -45,7 +45,8 @@ impl LuaPlayer { self.queue_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }); } @@ -76,7 +77,8 @@ impl LuaPlayer { self.queue_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }); } @@ -94,7 +96,8 @@ impl LuaPlayer { self.queue_segment(PacketSegment { source_actor: self.player_data.actor_id, target_actor: self.player_data.actor_id, - segment_type: SegmentType::Ipc { data: ipc }, + segment_type: SegmentType::Ipc, + data: SegmentData::Ipc { data: ipc }, }); }