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::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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue