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:
parent
b426de677f
commit
f3f25eb219
8 changed files with 197 additions and 122 deletions
|
@ -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::<ServerLobbyIpcSegment>(
|
||||
&mut connection.socket,
|
||||
&mut connection.state,
|
||||
|
|
|
@ -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::<u32>().unwrap();
|
||||
let actor_id = ticket.parse::<u32>().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::<ServerZoneIpcSegment>(
|
||||
&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,
|
||||
|
|
|
@ -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<Custo
|
|||
let segment: PacketSegment<CustomIpcSegment> = 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<Custo
|
|||
if n != 0 {
|
||||
let (segments, _) = parse_packet::<CustomIpcSegment>(&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,
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<T: ReadWriteIpcSegment> {
|
||||
// Client->Server Packets
|
||||
#[brw(magic = 0x1u32)]
|
||||
InitializeSession {
|
||||
pub enum SegmentData<T: ReadWriteIpcSegment> {
|
||||
#[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<T: ReadWriteIpcSegment> {
|
|||
#[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<u8>,
|
||||
},
|
||||
#[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<T: ReadWriteIpcSegment> {
|
|||
pub size: u32,
|
||||
pub source_actor: u32,
|
||||
pub target_actor: u32,
|
||||
#[brw(args(size, encryption_key))]
|
||||
pub segment_type: SegmentType<T>,
|
||||
#[brw(pad_after = 2)] // padding
|
||||
pub segment_type: SegmentType,
|
||||
#[brw(args(&segment_type, size, encryption_key))]
|
||||
pub data: SegmentData<T>,
|
||||
}
|
||||
|
||||
impl<T: ReadWriteIpcSegment> PacketSegment<T> {
|
||||
pub fn calc_size(&self) -> u32 {
|
||||
let header = std::mem::size_of::<u32>() * 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<T: ReadWriteIpcSegment>(
|
|||
let response_packet: PacketSegment<T> = 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<ClientLobbyIpcSegment> = 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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 },
|
||||
});
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue