1
Fork 0
mirror of https://github.com/redstrate/Kawari.git synced 2025-05-06 04:37:46 +00:00

Overhaul segment types, their names and their order

This commit is contained in:
Joshua Goins 2025-05-02 00:03:36 -04:00
parent b426de677f
commit f3f25eb219
8 changed files with 197 additions and 122 deletions

View file

@ -10,7 +10,7 @@ use kawari::lobby::ipc::{ClientLobbyIpcData, ServerLobbyIpcSegment};
use kawari::lobby::send_custom_world_packet; use kawari::lobby::send_custom_world_packet;
use kawari::oodle::OodleNetwork; use kawari::oodle::OodleNetwork;
use kawari::packet::ConnectionType; 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::io::AsyncReadExt;
use tokio::net::TcpListener; use tokio::net::TcpListener;
@ -60,11 +60,11 @@ async fn main() {
if n != 0 { if n != 0 {
let (segments, _) = connection.parse_packet(&buf[..n]).await; let (segments, _) = connection.parse_packet(&buf[..n]).await;
for segment in &segments { for segment in &segments {
match &segment.segment_type { match &segment.data {
SegmentType::InitializeEncryption { phrase, key } => { SegmentData::SecuritySetup { phrase, key } => {
connection.initialize_encryption(phrase, key).await connection.initialize_encryption(phrase, key).await
} }
SegmentType::Ipc { data } => match &data.data { SegmentData::Ipc { data } => match &data.data {
ClientLobbyIpcData::LoginEx { ClientLobbyIpcData::LoginEx {
sequence, sequence,
session_id, session_id,
@ -150,7 +150,7 @@ async fn main() {
.await; .await;
} }
}, },
SegmentType::KeepAlive { id, timestamp } => { SegmentData::KeepAliveRequest { id, timestamp } => {
send_keep_alive::<ServerLobbyIpcSegment>( send_keep_alive::<ServerLobbyIpcSegment>(
&mut connection.socket, &mut connection.socket,
&mut connection.state, &mut connection.state,

View file

@ -11,8 +11,8 @@ use kawari::config::get_config;
use kawari::oodle::OodleNetwork; use kawari::oodle::OodleNetwork;
use kawari::opcodes::ServerZoneIpcType; use kawari::opcodes::ServerZoneIpcType;
use kawari::packet::{ use kawari::packet::{
CompressionType, ConnectionType, PacketSegment, PacketState, SegmentType, send_keep_alive, CompressionType, ConnectionType, PacketSegment, PacketState, SegmentData, SegmentType,
send_packet, send_keep_alive, send_packet,
}; };
use kawari::world::ipc::{ use kawari::world::ipc::{
ActionEffect, ActionResult, ClientZoneIpcData, EffectKind, GameMasterCommandType, ActionEffect, ActionResult, ClientZoneIpcData, EffectKind, GameMasterCommandType,
@ -272,10 +272,10 @@ async fn client_loop(
if n > 0 { if n > 0 {
let (segments, connection_type) = connection.parse_packet(&buf[..n]).await; let (segments, connection_type) = connection.parse_packet(&buf[..n]).await;
for segment in &segments { for segment in &segments {
match &segment.segment_type { match &segment.data {
SegmentType::InitializeSession { actor_id } => { SegmentData::Setup { ticket } => {
// for some reason they send a string representation // for some reason they send a string representation
let actor_id = actor_id.parse::<u32>().unwrap(); let actor_id = ticket.parse::<u32>().unwrap();
// initialize player data if it doesn't exist' // initialize player data if it doesn't exist'
if connection.player_data.actor_id == 0 { if connection.player_data.actor_id == 0 {
@ -293,7 +293,7 @@ async fn client_loop(
connection.handle.send(ToServer::NewClient(client_handle.clone())).await; connection.handle.send(ToServer::NewClient(client_handle.clone())).await;
} }
} }
SegmentType::Ipc { data } => { SegmentData::Ipc { data } => {
match &data.data { match &data.data {
ClientZoneIpcData::InitRequest { .. } => { ClientZoneIpcData::InitRequest { .. } => {
tracing::info!( tracing::info!(
@ -317,7 +317,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
target_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; .await;
} }
@ -369,7 +370,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
target_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; .await;
} }
@ -418,7 +420,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
target_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; .await;
} }
@ -438,7 +441,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
target_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; .await;
} }
@ -508,7 +512,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
target_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; .await;
} }
@ -528,7 +533,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
target_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; .await;
} }
@ -564,7 +570,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
target_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; .await;
} }
@ -748,7 +755,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
target_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; .await;
@ -799,7 +807,7 @@ async fn client_loop(
} }
} }
} }
SegmentType::KeepAlive { id, timestamp } => { SegmentData::KeepAliveRequest { id, timestamp } => {
send_keep_alive::<ServerZoneIpcSegment>( send_keep_alive::<ServerZoneIpcSegment>(
&mut connection.socket, &mut connection.socket,
&mut connection.state, &mut connection.state,
@ -809,10 +817,10 @@ async fn client_loop(
) )
.await .await
} }
SegmentType::KeepAliveResponse { .. } => { SegmentData::KeepAliveResponse { .. } => {
tracing::info!("Got keep alive response from client... cool..."); tracing::info!("Got keep alive response from client... cool...");
} }
SegmentType::CustomIpc { data } => { SegmentData::KawariIpc { data } => {
match &data.data { match &data.data {
CustomIpcData::RequestCreateCharacter { CustomIpcData::RequestCreateCharacter {
service_account_id, service_account_id,
@ -860,7 +868,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::CustomIpc { segment_type: SegmentType::KawariIpc,
data: SegmentData::KawariIpc {
data: CustomIpcSegment { data: CustomIpcSegment {
unk1: 0, unk1: 0,
unk2: 0, unk2: 0,
@ -888,7 +897,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::CustomIpc { segment_type: SegmentType::KawariIpc,
data: SegmentData::KawariIpc {
data: CustomIpcSegment { data: CustomIpcSegment {
unk1: 0, unk1: 0,
unk2: 0, unk2: 0,
@ -911,7 +921,8 @@ async fn client_loop(
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::CustomIpc { segment_type: SegmentType::KawariIpc,
data: SegmentData::KawariIpc {
data: CustomIpcSegment { data: CustomIpcSegment {
unk1: 0, unk1: 0,
unk2: 0, unk2: 0,
@ -958,7 +969,8 @@ async fn client_loop(
&[PacketSegment { &[PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::CustomIpc { segment_type: SegmentType::KawariIpc,
data: SegmentData::KawariIpc {
data: CustomIpcSegment { data: CustomIpcSegment {
unk1: 0, unk1: 0,
unk2: 0, unk2: 0,
@ -988,7 +1000,8 @@ async fn client_loop(
&[PacketSegment { &[PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::CustomIpc { segment_type: SegmentType::KawariIpc,
data: SegmentData::KawariIpc {
data: CustomIpcSegment { data: CustomIpcSegment {
unk1: 0, unk1: 0,
unk2: 0, unk2: 0,

View file

@ -14,7 +14,7 @@ use crate::{
oodle::OodleNetwork, oodle::OodleNetwork,
opcodes::ServerLobbyIpcType, opcodes::ServerLobbyIpcType,
packet::{ packet::{
CompressionType, ConnectionType, PacketSegment, PacketState, SegmentType, CompressionType, ConnectionType, PacketSegment, PacketState, SegmentData, SegmentType,
generate_encryption_key, parse_packet, send_packet, generate_encryption_key, parse_packet, send_packet,
}, },
}; };
@ -76,7 +76,8 @@ impl LobbyConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::InitializationEncryptionResponse { data }, segment_type: SegmentType::SecurityInitialize,
data: SegmentData::SecurityInitialize { data },
}) })
.await; .await;
} }
@ -103,7 +104,8 @@ impl LobbyConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::Ipc { data: ipc }, segment_type: SegmentType::Ipc,
data: SegmentData::Ipc { data: ipc },
}) })
.await; .await;
} }
@ -146,7 +148,8 @@ impl LobbyConnection {
let response_packet = PacketSegment { let response_packet = PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::Ipc { data: ipc }, segment_type: SegmentType::Ipc,
data: SegmentData::Ipc { data: ipc },
}; };
packets.push(response_packet); packets.push(response_packet);
} }
@ -167,7 +170,8 @@ impl LobbyConnection {
let response_packet = PacketSegment { let response_packet = PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::Ipc { data: ipc }, segment_type: SegmentType::Ipc,
data: SegmentData::Ipc { data: ipc },
}; };
packets.push(response_packet); packets.push(response_packet);
} }
@ -269,7 +273,8 @@ impl LobbyConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::Ipc { data: ipc }, segment_type: SegmentType::Ipc,
data: SegmentData::Ipc { data: ipc },
}) })
.await; .await;
} }
@ -301,7 +306,8 @@ impl LobbyConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::Ipc { data: ipc }, segment_type: SegmentType::Ipc,
data: SegmentData::Ipc { data: ipc },
}) })
.await; .await;
} }
@ -328,7 +334,8 @@ impl LobbyConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::Ipc { data: ipc }, segment_type: SegmentType::Ipc,
data: SegmentData::Ipc { data: ipc },
}) })
.await; .await;
} }
@ -388,7 +395,8 @@ impl LobbyConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: 0x0, source_actor: 0x0,
target_actor: 0x0, target_actor: 0x0,
segment_type: SegmentType::Ipc { data: ipc }, segment_type: SegmentType::Ipc,
data: SegmentData::Ipc { data: ipc },
}) })
.await; .await;
} else { } else {
@ -410,7 +418,8 @@ impl LobbyConnection {
let response_packet = PacketSegment { let response_packet = PacketSegment {
source_actor: 0x0, source_actor: 0x0,
target_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; self.send_segment(response_packet).await;
} }
@ -482,7 +491,8 @@ impl LobbyConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: 0x0, source_actor: 0x0,
target_actor: 0x0, target_actor: 0x0,
segment_type: SegmentType::Ipc { data: ipc }, segment_type: SegmentType::Ipc,
data: SegmentData::Ipc { data: ipc },
}) })
.await; .await;
} }
@ -534,7 +544,8 @@ impl LobbyConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: 0x0, source_actor: 0x0,
target_actor: 0x0, target_actor: 0x0,
segment_type: SegmentType::Ipc { data: ipc }, segment_type: SegmentType::Ipc,
data: SegmentData::Ipc { data: ipc },
}) })
.await; .await;
} }
@ -569,7 +580,8 @@ pub async fn send_custom_world_packet(segment: CustomIpcSegment) -> Option<Custo
let segment: PacketSegment<CustomIpcSegment> = PacketSegment { let segment: PacketSegment<CustomIpcSegment> = PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::CustomIpc { data: segment }, segment_type: SegmentType::KawariIpc,
data: SegmentData::KawariIpc { data: segment },
}; };
send_packet( send_packet(
@ -587,8 +599,8 @@ pub async fn send_custom_world_packet(segment: CustomIpcSegment) -> Option<Custo
if n != 0 { if n != 0 {
let (segments, _) = parse_packet::<CustomIpcSegment>(&buf[..n], &mut packet_state).await; let (segments, _) = parse_packet::<CustomIpcSegment>(&buf[..n], &mut packet_state).await;
return match &segments[0].segment_type { return match &segments[0].data {
SegmentType::CustomIpc { data } => Some(data.clone()), SegmentData::KawariIpc { data } => Some(data.clone()),
_ => None, _ => None,
}; };
} }

View file

@ -1,8 +1,8 @@
mod parsing; mod parsing;
use parsing::PacketHeader; use parsing::PacketHeader;
pub use parsing::{ pub use parsing::{
ConnectionType, PacketSegment, PacketState, SegmentType, parse_packet, send_keep_alive, ConnectionType, PacketSegment, PacketState, SegmentData, SegmentType, parse_packet,
send_packet, send_keep_alive, send_packet,
}; };
mod compression; mod compression;

View file

@ -25,21 +25,44 @@ pub enum ConnectionType {
} }
#[binrw] #[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)] #[derive(Debug, Clone)]
pub enum SegmentType<T: ReadWriteIpcSegment> { pub enum SegmentData<T: ReadWriteIpcSegment> {
// Client->Server Packets #[br(pre_assert(*kind == SegmentType::Setup))]
#[brw(magic = 0x1u32)] Setup {
InitializeSession {
#[brw(pad_before = 4)] // empty #[brw(pad_before = 4)] // empty
#[brw(pad_size_to = 36)] #[brw(pad_size_to = 36)]
#[br(count = 36)] #[br(count = 36)]
#[br(map = read_string)] #[br(map = read_string)]
#[bw(map = write_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)] #[br(pre_assert(*kind == SegmentType::Initialize))]
InitializeEncryption { Initialize {
player_id: u32,
#[brw(pad_after = 32)]
timestamp: u32,
},
#[br(pre_assert(*kind == SegmentType::SecuritySetup))]
SecuritySetup {
#[brw(pad_before = 36)] // empty #[brw(pad_before = 36)] // empty
#[brw(pad_size_to = 32)] #[brw(pad_size_to = 32)]
#[br(count = 32)] #[br(count = 32)]
@ -51,34 +74,25 @@ pub enum SegmentType<T: ReadWriteIpcSegment> {
#[brw(pad_after = 512)] // empty #[brw(pad_after = 512)] // empty
key: [u8; 4], key: [u8; 4],
}, },
#[brw(magic = 0x3u32)] #[br(pre_assert(*kind == SegmentType::Ipc))]
Ipc { Ipc {
#[br(parse_with = decrypt, args(size, encryption_key))] #[br(parse_with = decrypt, args(size, encryption_key))]
#[bw(write_with = encrypt, args(size, encryption_key))] #[bw(write_with = encrypt, args(size, encryption_key))]
data: T, data: T,
}, },
#[brw(magic = 0x7u32)] #[br(pre_assert(*kind == SegmentType::KeepAliveRequest))]
KeepAlive { id: u32, timestamp: u32 }, KeepAliveRequest { id: u32, timestamp: u32 },
#[br(pre_assert(*kind == SegmentType::SecurityInitialize))]
// Server->Client Packets SecurityInitialize {
#[brw(magic = 0xAu32)]
InitializationEncryptionResponse {
#[br(count = 0x280)] #[br(count = 0x280)]
#[brw(pad_size_to = 640)] #[brw(pad_size_to = 640)]
data: Vec<u8>, data: Vec<u8>,
}, },
#[brw(magic = 0x8u32)] #[br(pre_assert(*kind == SegmentType::KeepAliveResponse))]
KeepAliveResponse { id: u32, timestamp: u32 }, KeepAliveResponse { id: u32, timestamp: u32 },
#[brw(magic = 0x2u32)]
ZoneInitialize {
player_id: u32,
#[brw(pad_after = 32)]
timestamp: u32,
},
// Custom Packets #[br(pre_assert(*kind == SegmentType::KawariIpc))]
#[brw(magic = 0xAAAAu32)] KawariIpc { data: CustomIpcSegment },
CustomIpc { data: CustomIpcSegment },
} }
#[binrw] #[binrw]
@ -104,23 +118,25 @@ pub struct PacketSegment<T: ReadWriteIpcSegment> {
pub size: u32, pub size: u32,
pub source_actor: u32, pub source_actor: u32,
pub target_actor: u32, pub target_actor: u32,
#[brw(args(size, encryption_key))] #[brw(pad_after = 2)] // padding
pub segment_type: SegmentType<T>, pub segment_type: SegmentType,
#[brw(args(&segment_type, size, encryption_key))]
pub data: SegmentData<T>,
} }
impl<T: ReadWriteIpcSegment> PacketSegment<T> { impl<T: ReadWriteIpcSegment> PacketSegment<T> {
pub fn calc_size(&self) -> u32 { pub fn calc_size(&self) -> u32 {
let header = std::mem::size_of::<u32>() * 4; let header = std::mem::size_of::<u32>() * 4;
header as u32 header as u32
+ match &self.segment_type { + match &self.data {
SegmentType::InitializeEncryption { .. } => 616, SegmentData::SecuritySetup { .. } => 616,
SegmentType::InitializationEncryptionResponse { .. } => 640, SegmentData::SecurityInitialize { .. } => 640,
SegmentType::Ipc { data } => data.calc_size(), SegmentData::Ipc { data } => data.calc_size(),
SegmentType::KeepAlive { .. } => 0x8, SegmentData::KeepAliveRequest { .. } => 0x8,
SegmentType::KeepAliveResponse { .. } => 0x8, SegmentData::KeepAliveResponse { .. } => 0x8,
SegmentType::ZoneInitialize { .. } => 40, SegmentData::Initialize { .. } => 40,
SegmentType::InitializeSession { .. } => 40, SegmentData::Setup { .. } => 40,
SegmentType::CustomIpc { data } => data.calc_size(), SegmentData::KawariIpc { data } => data.calc_size(),
} }
} }
} }
@ -217,7 +233,8 @@ pub async fn send_keep_alive<T: ReadWriteIpcSegment>(
let response_packet: PacketSegment<T> = PacketSegment { let response_packet: PacketSegment<T> = PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::KeepAliveResponse { id, timestamp }, segment_type: SegmentType::KeepAliveResponse,
data: SegmentData::KeepAliveResponse { id, timestamp },
}; };
send_packet( send_packet(
socket, socket,
@ -261,16 +278,16 @@ mod tests {
} }
let packet_types = [ let packet_types = [
SegmentType::InitializeEncryption { SegmentData::SecuritySetup {
phrase: String::new(), phrase: String::new(),
key: [0; 4], key: [0; 4],
}, },
SegmentType::InitializationEncryptionResponse { data: Vec::new() }, SegmentData::SecurityInitialize { data: Vec::new() },
SegmentType::KeepAlive { SegmentData::KeepAliveRequest {
id: 0, id: 0,
timestamp: 0, timestamp: 0,
}, },
SegmentType::KeepAliveResponse { SegmentData::KeepAliveResponse {
id: 0, id: 0,
timestamp: 0, timestamp: 0,
}, },
@ -282,7 +299,8 @@ mod tests {
let packet_segment: PacketSegment<ClientLobbyIpcSegment> = PacketSegment { let packet_segment: PacketSegment<ClientLobbyIpcSegment> = PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: packet.clone(), segment_type: SegmentType::Setup,
data: packet.clone(),
}; };
packet_segment.write_le(&mut cursor).unwrap(); packet_segment.write_le(&mut cursor).unwrap();

View file

@ -2,7 +2,7 @@ use crate::{
common::{CustomizeData, ObjectId, ObjectTypeId, Position, timestamp_secs}, common::{CustomizeData, ObjectId, ObjectTypeId, Position, timestamp_secs},
config::get_config, config::get_config,
opcodes::ServerZoneIpcType, opcodes::ServerZoneIpcType,
packet::{PacketSegment, SegmentType}, packet::{PacketSegment, SegmentData, SegmentType},
world::{ world::{
Actor, Event, Actor, Event,
ipc::{ ipc::{
@ -122,7 +122,8 @@ impl ChatHandler {
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: 0x106ad804, source_actor: 0x106ad804,
target_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; .await;
} }
@ -147,7 +148,8 @@ impl ChatHandler {
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: 0x106ad804, source_actor: 0x106ad804,
target_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; .await;
} }
@ -198,7 +200,8 @@ impl ChatHandler {
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: 0x106ad804, source_actor: 0x106ad804,
target_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; .await;
} }
@ -238,7 +241,8 @@ impl ChatHandler {
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: 0x106ad804, source_actor: 0x106ad804,
target_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; .await;
} }
@ -277,7 +281,8 @@ impl ChatHandler {
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
target_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; .await;
} }
@ -301,7 +306,8 @@ impl ChatHandler {
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: connection.player_data.actor_id, source_actor: connection.player_data.actor_id,
target_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; .await;
} }
@ -344,7 +350,8 @@ impl ChatHandler {
.send_segment(PacketSegment { .send_segment(PacketSegment {
source_actor: 0x106ad804, source_actor: 0x106ad804,
target_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; .await;
} }

View file

@ -14,8 +14,8 @@ use crate::{
config::get_config, config::get_config,
opcodes::{ServerChatIpcType, ServerZoneIpcType}, opcodes::{ServerChatIpcType, ServerZoneIpcType},
packet::{ packet::{
CompressionType, ConnectionType, PacketSegment, PacketState, SegmentType, parse_packet, CompressionType, ConnectionType, PacketSegment, PacketState, SegmentData, SegmentType,
send_packet, parse_packet, send_packet,
}, },
world::chat::{ServerChatIpcData, ServerChatIpcSegment}, world::chat::{ServerChatIpcData, ServerChatIpcSegment},
}; };
@ -199,7 +199,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::KeepAlive { segment_type: SegmentType::KeepAliveRequest,
data: SegmentData::KeepAliveRequest {
id: 0xE0037603u32, id: 0xE0037603u32,
timestamp: timestamp_secs(), timestamp: timestamp_secs(),
}, },
@ -210,7 +211,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::ZoneInitialize { segment_type: SegmentType::Initialize,
data: SegmentData::Initialize {
player_id: self.player_data.actor_id, player_id: self.player_data.actor_id,
timestamp: timestamp_secs(), timestamp: timestamp_secs(),
}, },
@ -225,7 +227,8 @@ impl ZoneConnection {
self.send_chat_segment(PacketSegment { self.send_chat_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::KeepAlive { segment_type: SegmentType::KeepAliveRequest,
data: SegmentData::KeepAliveRequest {
id: 0xE0037603u32, id: 0xE0037603u32,
timestamp: timestamp_secs(), timestamp: timestamp_secs(),
}, },
@ -237,7 +240,8 @@ impl ZoneConnection {
self.send_chat_segment(PacketSegment { self.send_chat_segment(PacketSegment {
source_actor: 0, source_actor: 0,
target_actor: 0, target_actor: 0,
segment_type: SegmentType::ZoneInitialize { segment_type: SegmentType::Initialize,
data: SegmentData::Initialize {
player_id: self.player_data.actor_id, player_id: self.player_data.actor_id,
timestamp: timestamp_secs(), timestamp: timestamp_secs(),
}, },
@ -262,7 +266,8 @@ impl ZoneConnection {
self.send_chat_segment(PacketSegment { self.send_chat_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }
@ -287,7 +292,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }
@ -311,7 +317,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: actor_id, source_actor: actor_id,
target_actor: actor_id, target_actor: actor_id,
segment_type: SegmentType::Ipc { data: ipc }, segment_type: SegmentType::Ipc,
data: SegmentData::Ipc { data: ipc },
}) })
.await; .await;
} }
@ -338,7 +345,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: actor.id.0, source_actor: actor.id.0,
target_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; .await;
@ -364,7 +372,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: actor.id.0, source_actor: actor.id.0,
target_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; .await;
@ -394,7 +403,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }
@ -458,7 +468,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }
@ -478,7 +489,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }
@ -520,7 +532,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
}; };
@ -546,7 +559,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }
@ -577,7 +591,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
}; };
@ -604,7 +619,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }
@ -633,7 +649,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }
@ -653,7 +670,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }
@ -696,7 +714,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
@ -715,7 +734,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: actor_id.0, source_actor: actor_id.0,
target_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; .await;
} }
@ -739,7 +759,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }
@ -802,7 +823,8 @@ impl ZoneConnection {
self.send_segment(PacketSegment { self.send_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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; .await;
} }

View file

@ -3,7 +3,7 @@ use mlua::{FromLua, Lua, LuaSerdeExt, UserData, UserDataMethods, Value};
use crate::{ use crate::{
common::{ObjectId, ObjectTypeId, Position, timestamp_secs}, common::{ObjectId, ObjectTypeId, Position, timestamp_secs},
opcodes::ServerZoneIpcType, opcodes::ServerZoneIpcType,
packet::{PacketSegment, SegmentType}, packet::{PacketSegment, SegmentData, SegmentType},
}; };
use super::{ use super::{
@ -45,7 +45,8 @@ impl LuaPlayer {
self.queue_segment(PacketSegment { self.queue_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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 { self.queue_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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 { self.queue_segment(PacketSegment {
source_actor: self.player_data.actor_id, source_actor: self.player_data.actor_id,
target_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 },
}); });
} }