bevy_simple_networking/
lib.rs1mod 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
16const DEFAULT_HEARTBEAT_TICK_RATE_SECS: f32 = 2.;
19const DEFAULT_IDLE_TIMEOUT_SECS: f32 = 5.;
22
23#[derive(Resource)]
24pub struct NetworkResource {
25 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#[derive(Clone, Hash, Debug, PartialEq, Eq, SystemSet)]
41pub enum NetworkSystem {
42 Receive,
43 Send,
44}
45
46#[derive(Clone, Hash, Debug, PartialEq, Eq, SystemSet)]
48pub enum ServerSystem {
49 IdleTimeout,
50}
51
52#[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}