mirror of
https://github.com/redstrate/Kawari.git
synced 2025-05-06 04:37:46 +00:00
Implement Default trait for PacketSegment
This reduces a *ton* of places where I had to set source_actor/target_actor to zero because it wasn't relevant.
This commit is contained in:
parent
fb69689f2a
commit
0f98bfde52
4 changed files with 47 additions and 48 deletions
|
@ -295,25 +295,23 @@ async fn client_loop(
|
||||||
} else if connection_type == ConnectionType::Chat {
|
} else if connection_type == ConnectionType::Chat {
|
||||||
// We have send THEM a keep alive
|
// We have send THEM a keep alive
|
||||||
connection.send_chat_segment(PacketSegment {
|
connection.send_chat_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::KeepAliveRequest,
|
segment_type: SegmentType::KeepAliveRequest,
|
||||||
data: SegmentData::KeepAliveRequest {
|
data: SegmentData::KeepAliveRequest {
|
||||||
id: 0xE0037603u32,
|
id: 0xE0037603u32,
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
},
|
},
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
// initialize connection
|
// initialize connection
|
||||||
connection.send_chat_segment(PacketSegment {
|
connection.send_chat_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::Initialize,
|
segment_type: SegmentType::Initialize,
|
||||||
data: SegmentData::Initialize {
|
data: SegmentData::Initialize {
|
||||||
player_id: connection.player_data.actor_id,
|
player_id: connection.player_data.actor_id,
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
},
|
},
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
|
@ -915,8 +913,6 @@ async fn client_loop(
|
||||||
{
|
{
|
||||||
connection
|
connection
|
||||||
.send_segment(PacketSegment {
|
.send_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::KawariIpc,
|
segment_type: SegmentType::KawariIpc,
|
||||||
data: SegmentData::KawariIpc {
|
data: SegmentData::KawariIpc {
|
||||||
data: CustomIpcSegment {
|
data: CustomIpcSegment {
|
||||||
|
@ -931,6 +927,7 @@ async fn client_loop(
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -944,8 +941,6 @@ async fn client_loop(
|
||||||
{
|
{
|
||||||
connection
|
connection
|
||||||
.send_segment(PacketSegment {
|
.send_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::KawariIpc,
|
segment_type: SegmentType::KawariIpc,
|
||||||
data: SegmentData::KawariIpc {
|
data: SegmentData::KawariIpc {
|
||||||
data: CustomIpcSegment {
|
data: CustomIpcSegment {
|
||||||
|
@ -957,6 +952,7 @@ async fn client_loop(
|
||||||
data: CustomIpcData::ActorIdFound { actor_id },
|
data: CustomIpcData::ActorIdFound { actor_id },
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -968,8 +964,6 @@ async fn client_loop(
|
||||||
{
|
{
|
||||||
connection
|
connection
|
||||||
.send_segment(PacketSegment {
|
.send_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::KawariIpc,
|
segment_type: SegmentType::KawariIpc,
|
||||||
data: SegmentData::KawariIpc {
|
data: SegmentData::KawariIpc {
|
||||||
data: CustomIpcSegment {
|
data: CustomIpcSegment {
|
||||||
|
@ -983,6 +977,7 @@ async fn client_loop(
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -1016,8 +1011,6 @@ async fn client_loop(
|
||||||
ConnectionType::None,
|
ConnectionType::None,
|
||||||
CompressionType::Uncompressed,
|
CompressionType::Uncompressed,
|
||||||
&[PacketSegment {
|
&[PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::KawariIpc,
|
segment_type: SegmentType::KawariIpc,
|
||||||
data: SegmentData::KawariIpc {
|
data: SegmentData::KawariIpc {
|
||||||
data: CustomIpcSegment {
|
data: CustomIpcSegment {
|
||||||
|
@ -1031,6 +1024,7 @@ async fn client_loop(
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
..Default::default()
|
||||||
}],
|
}],
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
@ -1047,8 +1041,6 @@ async fn client_loop(
|
||||||
ConnectionType::None,
|
ConnectionType::None,
|
||||||
CompressionType::Uncompressed,
|
CompressionType::Uncompressed,
|
||||||
&[PacketSegment {
|
&[PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::KawariIpc,
|
segment_type: SegmentType::KawariIpc,
|
||||||
data: SegmentData::KawariIpc {
|
data: SegmentData::KawariIpc {
|
||||||
data: CustomIpcSegment {
|
data: CustomIpcSegment {
|
||||||
|
@ -1062,6 +1054,7 @@ async fn client_loop(
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
..Default::default()
|
||||||
}],
|
}],
|
||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
|
@ -74,10 +74,9 @@ impl LobbyConnection {
|
||||||
blowfish.encrypt(&mut data);
|
blowfish.encrypt(&mut data);
|
||||||
|
|
||||||
self.send_segment(PacketSegment {
|
self.send_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::SecurityInitialize,
|
segment_type: SegmentType::SecurityInitialize,
|
||||||
data: SegmentData::SecurityInitialize { data },
|
data: SegmentData::SecurityInitialize { data },
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -102,10 +101,9 @@ impl LobbyConnection {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.send_segment(PacketSegment {
|
self.send_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::Ipc,
|
segment_type: SegmentType::Ipc,
|
||||||
data: SegmentData::Ipc { data: ipc },
|
data: SegmentData::Ipc { data: ipc },
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -146,10 +144,9 @@ impl LobbyConnection {
|
||||||
};
|
};
|
||||||
|
|
||||||
let response_packet = PacketSegment {
|
let response_packet = PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::Ipc,
|
segment_type: SegmentType::Ipc,
|
||||||
data: SegmentData::Ipc { data: ipc },
|
data: SegmentData::Ipc { data: ipc },
|
||||||
|
..Default::default()
|
||||||
};
|
};
|
||||||
packets.push(response_packet);
|
packets.push(response_packet);
|
||||||
}
|
}
|
||||||
|
@ -168,10 +165,9 @@ impl LobbyConnection {
|
||||||
};
|
};
|
||||||
|
|
||||||
let response_packet = PacketSegment {
|
let response_packet = PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::Ipc,
|
segment_type: SegmentType::Ipc,
|
||||||
data: SegmentData::Ipc { data: ipc },
|
data: SegmentData::Ipc { data: ipc },
|
||||||
|
..Default::default()
|
||||||
};
|
};
|
||||||
packets.push(response_packet);
|
packets.push(response_packet);
|
||||||
}
|
}
|
||||||
|
@ -271,10 +267,9 @@ impl LobbyConnection {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.send_segment(PacketSegment {
|
self.send_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::Ipc,
|
segment_type: SegmentType::Ipc,
|
||||||
data: SegmentData::Ipc { data: ipc },
|
data: SegmentData::Ipc { data: ipc },
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -304,10 +299,9 @@ impl LobbyConnection {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.send_segment(PacketSegment {
|
self.send_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::Ipc,
|
segment_type: SegmentType::Ipc,
|
||||||
data: SegmentData::Ipc { data: ipc },
|
data: SegmentData::Ipc { data: ipc },
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -332,10 +326,9 @@ impl LobbyConnection {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.send_segment(PacketSegment {
|
self.send_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::Ipc,
|
segment_type: SegmentType::Ipc,
|
||||||
data: SegmentData::Ipc { data: ipc },
|
data: SegmentData::Ipc { data: ipc },
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -393,10 +386,9 @@ impl LobbyConnection {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.send_segment(PacketSegment {
|
self.send_segment(PacketSegment {
|
||||||
source_actor: 0x0,
|
|
||||||
target_actor: 0x0,
|
|
||||||
segment_type: SegmentType::Ipc,
|
segment_type: SegmentType::Ipc,
|
||||||
data: SegmentData::Ipc { data: ipc },
|
data: SegmentData::Ipc { data: ipc },
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
} else {
|
} else {
|
||||||
|
@ -416,10 +408,9 @@ impl LobbyConnection {
|
||||||
};
|
};
|
||||||
|
|
||||||
let response_packet = PacketSegment {
|
let response_packet = PacketSegment {
|
||||||
source_actor: 0x0,
|
|
||||||
target_actor: 0x0,
|
|
||||||
segment_type: SegmentType::Ipc,
|
segment_type: SegmentType::Ipc,
|
||||||
data: SegmentData::Ipc { data: ipc },
|
data: SegmentData::Ipc { data: ipc },
|
||||||
|
..Default::default()
|
||||||
};
|
};
|
||||||
self.send_segment(response_packet).await;
|
self.send_segment(response_packet).await;
|
||||||
}
|
}
|
||||||
|
@ -489,10 +480,9 @@ impl LobbyConnection {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.send_segment(PacketSegment {
|
self.send_segment(PacketSegment {
|
||||||
source_actor: 0x0,
|
|
||||||
target_actor: 0x0,
|
|
||||||
segment_type: SegmentType::Ipc,
|
segment_type: SegmentType::Ipc,
|
||||||
data: SegmentData::Ipc { data: ipc },
|
data: SegmentData::Ipc { data: ipc },
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -542,10 +532,9 @@ impl LobbyConnection {
|
||||||
};
|
};
|
||||||
|
|
||||||
self.send_segment(PacketSegment {
|
self.send_segment(PacketSegment {
|
||||||
source_actor: 0x0,
|
|
||||||
target_actor: 0x0,
|
|
||||||
segment_type: SegmentType::Ipc,
|
segment_type: SegmentType::Ipc,
|
||||||
data: SegmentData::Ipc { data: ipc },
|
data: SegmentData::Ipc { data: ipc },
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
@ -578,10 +567,9 @@ pub async fn send_custom_world_packet(segment: CustomIpcSegment) -> Option<Custo
|
||||||
};
|
};
|
||||||
|
|
||||||
let segment: PacketSegment<CustomIpcSegment> = PacketSegment {
|
let segment: PacketSegment<CustomIpcSegment> = PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::KawariIpc,
|
segment_type: SegmentType::KawariIpc,
|
||||||
data: SegmentData::KawariIpc { data: segment },
|
data: SegmentData::KawariIpc { data: segment },
|
||||||
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
send_packet(
|
send_packet(
|
||||||
|
|
|
@ -26,8 +26,10 @@ pub enum ConnectionType {
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[brw(repr = u16)]
|
#[brw(repr = u16)]
|
||||||
#[derive(Debug, PartialEq, Copy, Clone)]
|
#[derive(Debug, PartialEq, Copy, Clone, Default)]
|
||||||
pub enum SegmentType {
|
pub enum SegmentType {
|
||||||
|
#[default]
|
||||||
|
None = 0x0,
|
||||||
Setup = 0x1,
|
Setup = 0x1,
|
||||||
Initialize = 0x2,
|
Initialize = 0x2,
|
||||||
// Also known as "UPLAYER"
|
// Also known as "UPLAYER"
|
||||||
|
@ -46,6 +48,8 @@ pub enum SegmentType {
|
||||||
#[brw(import(kind: &SegmentType, size: u32, encryption_key: Option<&[u8]>))]
|
#[brw(import(kind: &SegmentType, size: u32, encryption_key: Option<&[u8]>))]
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum SegmentData<T: ReadWriteIpcSegment> {
|
pub enum SegmentData<T: ReadWriteIpcSegment> {
|
||||||
|
#[br(pre_assert(*kind == SegmentType::None))]
|
||||||
|
None(),
|
||||||
#[br(pre_assert(*kind == SegmentType::Setup))]
|
#[br(pre_assert(*kind == SegmentType::Setup))]
|
||||||
Setup {
|
Setup {
|
||||||
#[brw(pad_before = 4)] // empty
|
#[brw(pad_before = 4)] // empty
|
||||||
|
@ -95,6 +99,12 @@ pub enum SegmentData<T: ReadWriteIpcSegment> {
|
||||||
KawariIpc { data: CustomIpcSegment },
|
KawariIpc { data: CustomIpcSegment },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: ReadWriteIpcSegment> Default for SegmentData<T> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::None()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[binrw]
|
#[binrw]
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct PacketHeader {
|
pub struct PacketHeader {
|
||||||
|
@ -124,11 +134,23 @@ pub struct PacketSegment<T: ReadWriteIpcSegment> {
|
||||||
pub data: SegmentData<T>,
|
pub data: SegmentData<T>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T: ReadWriteIpcSegment> Default for PacketSegment<T> {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self {
|
||||||
|
source_actor: 0,
|
||||||
|
target_actor: 0,
|
||||||
|
segment_type: SegmentType::default(),
|
||||||
|
data: SegmentData::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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.data {
|
+ match &self.data {
|
||||||
|
SegmentData::None() => 16,
|
||||||
SegmentData::SecuritySetup { .. } => 616,
|
SegmentData::SecuritySetup { .. } => 616,
|
||||||
SegmentData::SecurityInitialize { .. } => 640,
|
SegmentData::SecurityInitialize { .. } => 640,
|
||||||
SegmentData::Ipc { data } => data.calc_size(),
|
SegmentData::Ipc { data } => data.calc_size(),
|
||||||
|
@ -231,10 +253,9 @@ pub async fn send_keep_alive<T: ReadWriteIpcSegment>(
|
||||||
timestamp: u32,
|
timestamp: u32,
|
||||||
) {
|
) {
|
||||||
let response_packet: PacketSegment<T> = PacketSegment {
|
let response_packet: PacketSegment<T> = PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::KeepAliveResponse,
|
segment_type: SegmentType::KeepAliveResponse,
|
||||||
data: SegmentData::KeepAliveResponse { id, timestamp },
|
data: SegmentData::KeepAliveResponse { id, timestamp },
|
||||||
|
..Default::default()
|
||||||
};
|
};
|
||||||
send_packet(
|
send_packet(
|
||||||
socket,
|
socket,
|
||||||
|
@ -297,10 +318,9 @@ mod tests {
|
||||||
let mut cursor = Cursor::new(Vec::new());
|
let mut cursor = Cursor::new(Vec::new());
|
||||||
|
|
||||||
let packet_segment: PacketSegment<ClientLobbyIpcSegment> = PacketSegment {
|
let packet_segment: PacketSegment<ClientLobbyIpcSegment> = PacketSegment {
|
||||||
source_actor: 0,
|
segment_type: SegmentType::None,
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::Setup,
|
|
||||||
data: packet.clone(),
|
data: packet.clone(),
|
||||||
|
..Default::default()
|
||||||
};
|
};
|
||||||
packet_segment.write_le(&mut cursor).unwrap();
|
packet_segment.write_le(&mut cursor).unwrap();
|
||||||
|
|
||||||
|
|
|
@ -195,25 +195,23 @@ impl ZoneConnection {
|
||||||
// We have send THEM a keep alive
|
// We have send THEM a keep alive
|
||||||
{
|
{
|
||||||
self.send_segment(PacketSegment {
|
self.send_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::KeepAliveRequest,
|
segment_type: SegmentType::KeepAliveRequest,
|
||||||
data: SegmentData::KeepAliveRequest {
|
data: SegmentData::KeepAliveRequest {
|
||||||
id: 0xE0037603u32,
|
id: 0xE0037603u32,
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
},
|
},
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.send_segment(PacketSegment {
|
self.send_segment(PacketSegment {
|
||||||
source_actor: 0,
|
|
||||||
target_actor: 0,
|
|
||||||
segment_type: SegmentType::Initialize,
|
segment_type: SegmentType::Initialize,
|
||||||
data: SegmentData::Initialize {
|
data: SegmentData::Initialize {
|
||||||
player_id: self.player_data.actor_id,
|
player_id: self.player_data.actor_id,
|
||||||
timestamp: timestamp_secs(),
|
timestamp: timestamp_secs(),
|
||||||
},
|
},
|
||||||
|
..Default::default()
|
||||||
})
|
})
|
||||||
.await;
|
.await;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue