use serde::{Deserialize, Serialize};
use crate::types::{ClientId, ComponentKind, NetworkId};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FragmentedEvent {
pub message_id: u32,
pub fragment_index: u16,
pub total_fragments: u16,
#[serde(with = "serde_bytes")]
pub payload: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ReplicationEvent {
pub network_id: NetworkId,
pub component_kind: ComponentKind,
#[serde(with = "serde_bytes")]
pub payload: Vec<u8>,
pub tick: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ComponentUpdate {
pub network_id: NetworkId,
pub component_kind: ComponentKind,
#[serde(with = "serde_bytes")]
pub payload: Vec<u8>,
pub tick: u64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum NetworkEvent {
ClientConnected(ClientId),
ClientDisconnected(ClientId),
UnreliableMessage {
client_id: ClientId,
#[serde(with = "serde_bytes")]
data: Vec<u8>,
},
ReliableMessage {
client_id: ClientId,
#[serde(with = "serde_bytes")]
data: Vec<u8>,
},
Ping {
client_id: ClientId,
tick: u64,
},
Pong {
tick: u64,
},
Auth {
session_token: String,
},
SessionClosed(ClientId),
StreamReset(ClientId),
Fragment {
client_id: ClientId,
fragment: FragmentedEvent,
},
StressTest {
client_id: ClientId,
count: u16,
rotate: bool,
},
Spawn {
client_id: ClientId,
entity_type: u16,
x: f32,
y: f32,
rot: f32,
},
ClearWorld {
client_id: ClientId,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum WireEvent {
Ping {
tick: u64,
},
Pong {
tick: u64,
},
Auth {
session_token: String,
},
Fragment(FragmentedEvent),
StressTest {
count: u16,
rotate: bool,
},
Spawn {
entity_type: u16,
x: f32,
y: f32,
rot: f32,
},
ClearWorld,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_event_sizes_and_derives() {
let ev = NetworkEvent::ClientConnected(ClientId(1));
assert_eq!(ev, NetworkEvent::ClientConnected(ClientId(1)));
let re = ReplicationEvent {
network_id: NetworkId(1),
component_kind: ComponentKind(0),
payload: vec![1, 2, 3],
tick: 0,
};
assert_eq!(re.payload.len(), 3);
assert_eq!(
re,
ReplicationEvent {
network_id: NetworkId(1),
component_kind: ComponentKind(0),
payload: vec![1, 2, 3],
tick: 0,
}
);
}
}