bevy_simple_networking/
lib.rs

1mod events;
2mod message;
3mod systems;
4mod transport;
5
6use std::collections::HashMap;
7use std::net::SocketAddr;
8use std::time::Duration;
9
10pub use self::events::NetworkEvent;
11pub use self::systems::{SocketAddrResource, UdpSocketResource};
12pub use self::transport::Transport;
13
14use bevy::prelude::*;
15
16/// Defines how many times a client automatically sends a heartbeat packet.
17/// This should be no more than half of idle_timeout.
18const DEFAULT_HEARTBEAT_TICK_RATE_SECS: f32 = 2.;
19/// Defines how long the server will wait until it sends
20/// NetworkEvent::Disconnected
21const DEFAULT_IDLE_TIMEOUT_SECS: f32 = 5.;
22
23#[derive(Resource)]
24pub struct NetworkResource {
25    // Hashmap of each live connection and their last known packet activity
26    pub connections: HashMap<SocketAddr, Duration>,
27    pub idle_timeout: Duration,
28}
29
30impl Default for NetworkResource {
31    fn default() -> Self {
32        Self {
33            connections: Default::default(),
34            idle_timeout: Duration::from_secs_f32(DEFAULT_IDLE_TIMEOUT_SECS),
35        }
36    }
37}
38
39/// Label for network related systems.
40#[derive(Clone, Hash, Debug, PartialEq, Eq, SystemSet)]
41pub enum NetworkSystem {
42    Receive,
43    Send,
44}
45
46/// Label for server specific systems.
47#[derive(Clone, Hash, Debug, PartialEq, Eq, SystemSet)]
48pub enum ServerSystem {
49    IdleTimeout,
50}
51
52/// Label for client specific systems.
53#[derive(Clone, Hash, Debug, PartialEq, Eq, SystemSet)]
54pub enum ClientSystem {
55    Heartbeat,
56}
57
58pub struct ServerPlugin;
59
60impl Plugin for ServerPlugin {
61    fn build(&self, app: &mut App) {
62        app.insert_resource(NetworkResource::default())
63            .insert_resource(transport::Transport::new())
64            .add_event::<events::NetworkEvent>()
65            .add_systems(
66                Update,
67                (
68                    systems::server_recv_packet_system.in_set(NetworkSystem::Receive),
69                    systems::send_packet_system.in_set(NetworkSystem::Send),
70                    systems::idle_timeout_system.in_set(ServerSystem::IdleTimeout)
71                )
72            );
73    }
74}
75
76#[derive(Resource)]
77pub struct HeartbeatTimer(Timer);
78
79pub struct ClientPlugin;
80
81impl Plugin for ClientPlugin {
82    fn build(&self, app: &mut App) {
83        app.insert_resource(transport::Transport::new())
84            .insert_resource(HeartbeatTimer(Timer::from_seconds(
85                DEFAULT_HEARTBEAT_TICK_RATE_SECS,
86                TimerMode::Repeating,
87            )))
88            .add_event::<events::NetworkEvent>()
89            .add_systems(
90                Update,
91                (
92                    systems::client_recv_packet_system.in_set(NetworkSystem::Receive),
93                    systems::send_packet_system.in_set(NetworkSystem::Send),
94                    systems::auto_heartbeat_system.in_set(ClientSystem::Heartbeat)
95                )
96            );
97    }
98}