From 15ba550ff6a8f7c108448f7f6a56145ced02f540 Mon Sep 17 00:00:00 2001 From: koe Date: Sun, 22 Dec 2024 15:47:45 -0600 Subject: [PATCH] split renet2 crate into renet2 and renet2_netcode; move steam bevy integration to bevy_renet2; ClientId is now a type alias for u64 --- Cargo.toml | 5 +- README.md | 12 +- bevy_renet2/Cargo.toml | 27 +-- bevy_renet2/examples/simple.rs | 17 +- bevy_renet2/src/lib.rs | 120 +------------ bevy_renet2/src/{transport.rs => netcode.rs} | 9 +- bevy_renet2/src/renet2.rs | 67 +++++++ bevy_renet2/src/run_conditions.rs | 49 +++++ .../src/bevy.rs => bevy_renet2/src/steam.rs | 6 +- bevy_renet2/tests/memory_sockets.rs | 20 +-- bevy_replicon_renet2/Cargo.toml | 14 +- bevy_replicon_renet2/examples/simple_box.rs | 8 +- bevy_replicon_renet2/examples/tic_tac_toe.rs | 8 +- bevy_replicon_renet2/src/client.rs | 29 ++- bevy_replicon_renet2/src/lib.rs | 35 +--- bevy_replicon_renet2/src/server.rs | 18 +- demo_bevy/Cargo.toml | 9 +- demo_bevy/src/bin/client.rs | 21 +-- demo_bevy/src/bin/server.rs | 17 +- demo_bevy/src/lib.rs | 8 +- demo_chat/Cargo.toml | 5 +- demo_chat/src/client.rs | 3 +- demo_chat/src/main.rs | 3 +- demo_chat/src/server.rs | 10 +- demo_chat/src/ui.rs | 6 +- examples/echo_client_native/Cargo.toml | 3 +- examples/echo_client_native/src/main.rs | 6 +- .../.gitignore | 0 .../Cargo.toml | 5 +- .../README.md | 0 .../src/lib.rs | 8 +- .../wasm-app/.gitignore | 0 .../wasm-app/.travis.yml | 0 .../wasm-app/bootstrap.js | 0 .../wasm-app/index.html | 0 .../wasm-app/index.js | 0 .../wasm-app/package.json | 0 .../wasm-app/webpack.config.js | 0 examples/echo_server_cross/Cargo.toml | 3 +- examples/echo_server_cross/src/main.rs | 10 +- renet2/Cargo.toml | 155 +--------------- renet2/src/lib.rs | 51 +----- renet2/tests/lib.rs | 4 +- renet2_netcode/Cargo.toml | 168 ++++++++++++++++++ .../examples/echo_native.rs | 10 +- .../src}/client.rs | 4 +- .../mod.rs => renet2_netcode/src/lib.rs | 10 +- .../src}/memory_socket/client.rs | 2 +- .../src}/memory_socket/mod.rs | 0 .../src}/memory_socket/server.rs | 2 +- .../src}/native_socket.rs | 0 .../src}/server.rs | 21 +-- .../src}/sockets.rs | 0 .../src}/websocket_socket/client/mod.rs | 0 .../src}/websocket_socket/client/socket.rs | 2 +- .../src}/websocket_socket/mod.rs | 0 .../src}/websocket_socket/server/mod.rs | 0 .../src}/websocket_socket/server/socket.rs | 2 +- .../client/availability_utils.rs | 2 +- .../webtransport_socket/client/bindings.rs | 0 .../src}/webtransport_socket/client/mod.rs | 0 .../src}/webtransport_socket/client/socket.rs | 2 +- .../src}/webtransport_socket/mod.rs | 0 .../webtransport_socket/server/cert_utils.rs | 2 +- .../src}/webtransport_socket/server/mod.rs | 0 .../src}/webtransport_socket/server/socket.rs | 6 +- .../src}/webtransport_socket/utils.rs | 0 renet2_steam/Cargo.toml | 6 +- renet2_steam/README.md | 6 +- renet2_steam/src/lib.rs | 3 - renet2_steam/src/server.rs | 4 +- 71 files changed, 477 insertions(+), 546 deletions(-) rename bevy_renet2/src/{transport.rs => netcode.rs} (94%) create mode 100644 bevy_renet2/src/renet2.rs create mode 100644 bevy_renet2/src/run_conditions.rs rename renet2_steam/src/bevy.rs => bevy_renet2/src/steam.rs (94%) rename examples/{echo_client_wt => echo_client_wasm}/.gitignore (100%) rename examples/{echo_client_wt => echo_client_wasm}/Cargo.toml (77%) rename examples/{echo_client_wt => echo_client_wasm}/README.md (100%) rename examples/{echo_client_wt => echo_client_wasm}/src/lib.rs (93%) rename examples/{echo_client_wt => echo_client_wasm}/wasm-app/.gitignore (100%) rename examples/{echo_client_wt => echo_client_wasm}/wasm-app/.travis.yml (100%) rename examples/{echo_client_wt => echo_client_wasm}/wasm-app/bootstrap.js (100%) rename examples/{echo_client_wt => echo_client_wasm}/wasm-app/index.html (100%) rename examples/{echo_client_wt => echo_client_wasm}/wasm-app/index.js (100%) rename examples/{echo_client_wt => echo_client_wasm}/wasm-app/package.json (100%) rename examples/{echo_client_wt => echo_client_wasm}/wasm-app/webpack.config.js (100%) create mode 100644 renet2_netcode/Cargo.toml rename {renet2 => renet2_netcode}/examples/echo_native.rs (95%) rename {renet2/src/transport => renet2_netcode/src}/client.rs (98%) rename renet2/src/transport/mod.rs => renet2_netcode/src/lib.rs (86%) rename {renet2/src/transport => renet2_netcode/src}/memory_socket/client.rs (97%) rename {renet2/src/transport => renet2_netcode/src}/memory_socket/mod.rs (100%) rename {renet2/src/transport => renet2_netcode/src}/memory_socket/server.rs (98%) rename {renet2/src/transport => renet2_netcode/src}/native_socket.rs (100%) rename {renet2/src/transport => renet2_netcode/src}/server.rs (95%) rename {renet2/src/transport => renet2_netcode/src}/sockets.rs (100%) rename {renet2/src/transport => renet2_netcode/src}/websocket_socket/client/mod.rs (100%) rename {renet2/src/transport => renet2_netcode/src}/websocket_socket/client/socket.rs (99%) rename {renet2/src/transport => renet2_netcode/src}/websocket_socket/mod.rs (100%) rename {renet2/src/transport => renet2_netcode/src}/websocket_socket/server/mod.rs (100%) rename {renet2/src/transport => renet2_netcode/src}/websocket_socket/server/socket.rs (99%) rename {renet2/src/transport => renet2_netcode/src}/webtransport_socket/client/availability_utils.rs (95%) rename {renet2/src/transport => renet2_netcode/src}/webtransport_socket/client/bindings.rs (100%) rename {renet2/src/transport => renet2_netcode/src}/webtransport_socket/client/mod.rs (100%) rename {renet2/src/transport => renet2_netcode/src}/webtransport_socket/client/socket.rs (99%) rename {renet2/src/transport => renet2_netcode/src}/webtransport_socket/mod.rs (100%) rename {renet2/src/transport => renet2_netcode/src}/webtransport_socket/server/cert_utils.rs (98%) rename {renet2/src/transport => renet2_netcode/src}/webtransport_socket/server/mod.rs (100%) rename {renet2/src/transport => renet2_netcode/src}/webtransport_socket/server/socket.rs (99%) rename {renet2/src/transport => renet2_netcode/src}/webtransport_socket/utils.rs (100%) diff --git a/Cargo.toml b/Cargo.toml index 514bb6e4..6ac50511 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,18 +1,19 @@ [workspace] members = [ "examples/echo_client_native", - #"examples/echo_client_wt", # requires wasm32-unknown-unknown target + #"examples/echo_client_wasm", # requires wasm32-unknown-unknown target "examples/echo_server_cross", "demo_chat", "demo_bevy", "bevy_renet2", "bevy_replicon_renet2", "renet2", + "renet2_netcode", "renet2_visualizer", "renet2_steam", "renetcode2", ] exclude = [ - "examples/echo_client_wt", + "examples/echo_client_wasm", ] resolver = "2" diff --git a/README.md b/README.md index fc63748a..e3516891 100644 --- a/README.md +++ b/README.md @@ -28,13 +28,15 @@ Provides the following features: Renet2 extends the original [netcode](https://github.com/networkprotocol/netcode) protocol with: - Optional packet encryption. This supports data transports that do their own encryption. -- Servers with multiple concurrent data sources (e.g. UDP sockets and WebTransport). +- Optional transport reliability. This supports data transports that are automatically reliable. +- Servers with multiple concurrent data transports (e.g. UDP sockets and WebTransport). See `renetcode2/NETCODE_EXTENSIONS.md`. ### Features - Includes built-in data transports: UDP, memory channels, WebTransport, WebSockets. + - See `src/examples` for a fully cross-platform demo. ## Building docs @@ -44,10 +46,10 @@ Build workspace docs (no WASM): cargo doc --open --no-deps --all-features ``` -Build WASM docs (`renet2` workspace crate only): +Build WASM docs (`renet2_netcode` workspace crate only): ``` -cd renet2 &&\ -cargo doc --open --no-deps --no-default-features --features=wt_client_transport,ws_client_transport,transport --target wasm32-unknown-unknown +cd renet2_netcode &&\ +cargo doc --open --no-deps --no-default-features --features=wt_client_transport,ws_client_transport --target wasm32-unknown-unknown ``` @@ -133,7 +135,7 @@ loop { // Send a text message for all clients server.broadcast_message(DefaultChannel::ReliableOrdered, "server message"); - let client_id = ClientId::from_raw(0); + let client_id = 0; // Send a text message for all clients except for Client 0 server.broadcast_message_except(client_id, DefaultChannel::ReliableOrdered, "server message"); diff --git a/bevy_renet2/Cargo.toml b/bevy_renet2/Cargo.toml index 0284db9a..8e156463 100644 --- a/bevy_renet2/Cargo.toml +++ b/bevy_renet2/Cargo.toml @@ -9,32 +9,39 @@ readme = "README.md" repository = "https://github.com/UkoeHB/renet2" [package.metadata.docs.rs] -features = ["default", "serde", "native_transport", "memory_transport", "wt_server_transport"] +features = ["default", "serde"] rustdoc-args = ["-Zunstable-options", "--cfg", "docsrs"] [features] -default = ["transport"] -serde = ["renet2/serde"] -transport = ["renet2/transport"] -native_transport = ["transport", "renet2/native_transport"] -memory_transport = ["transport", "renet2/memory_transport"] -wt_server_transport = ["transport", "renet2/wt_server_transport"] -wt_client_transport = ["transport", "renet2/wt_client_transport"] +default = ["netcode"] +serde = ["renet2_netcode/serde"] +steam = ["dep:renet2_steam", "dep:steamworks"] +netcode = ["dep:renet2_netcode"] +native_transport = ["netcode", "renet2_netcode/native_transport"] +memory_transport = ["netcode", "renet2_netcode/memory_transport"] +wt_server_transport = ["netcode", "renet2_netcode/wt_server_transport"] +wt_client_transport = ["netcode", "renet2_netcode/wt_client_transport"] +ws_server_transport = ["netcode", "renet2_netcode/ws_server_transport"] +ws_client_transport = ["netcode", "renet2_netcode/ws_client_transport"] [[example]] name = "simple" -required-features = ["serde", "transport"] +required-features = ["serde", "netcode"] [dependencies] bevy_app = {version = "0.15", default-features = false} bevy_ecs = {version = "0.15", default-features = false} bevy_time = {version = "0.15", default-features = false} renet2 = {path = "../renet2", version = "0.0.7", default-features = false, features = ["bevy"]} +renet2_netcode = {path = "../renet2_netcode", version = "0.0.7", optional = true, default-features = false, features = ["bevy"]} +renet2_steam = {path = "../renet2_steam", version = "0.0.7", optional = true, default-features = false, features = ["bevy"]} +steamworks = {version = "0.11", optional = true} [dev-dependencies] bevy = {version = "0.15", default-features = false, features = ["bevy_core_pipeline", "bevy_render", "bevy_asset", "bevy_pbr", "x11", "tonemapping_luts", "ktx2", "zstd"]} bincode = "1.3" env_logger = "0.11" -renet2 = {path = "../renet2", version = "0.0.7", default-features = false, features = ["bevy", "memory_transport"]} +renet2 = {path = "../renet2", version = "0.0.7", default-features = false, features = ["bevy"] } +renet2_netcode = {path = "../renet2_netcode", version = "0.0.7", default-features = false, features = ["bevy", "memory_transport"]} serde = {version = "1.0", features = ["derive"]} tracing-subscriber = { version = "0.3", features = [ "env-filter", "std", "tracing-log" ] } diff --git a/bevy_renet2/examples/simple.rs b/bevy_renet2/examples/simple.rs index b5a3ea91..8891ada3 100644 --- a/bevy_renet2/examples/simple.rs +++ b/bevy_renet2/examples/simple.rs @@ -1,16 +1,11 @@ use bevy::{prelude::*, render::mesh::PlaneMeshBuilder}; -use bevy_renet2::{ - client_connected, - renet2::{ - transport::{ClientAuthentication, ServerAuthentication, ServerSetupConfig}, - ConnectionConfig, DefaultChannel, RenetClient, RenetServer, ServerEvent, - }, - transport::{NetcodeClientPlugin, NetcodeServerPlugin}, - RenetClientPlugin, RenetServerPlugin, +use bevy_renet2::netcode::{ + ClientAuthentication, NativeSocket, NetcodeClientPlugin, NetcodeClientTransport, NetcodeServerPlugin, NetcodeServerTransport, + NetcodeTransportError, ServerAuthentication, ServerSetupConfig, }; -use renet2::{ - transport::{NativeSocket, NetcodeClientTransport, NetcodeServerTransport, NetcodeTransportError}, - ClientId, +use bevy_renet2::prelude::{ + client_connected, ClientId, ConnectionConfig, DefaultChannel, RenetClient, RenetClientPlugin, RenetServer, RenetServerPlugin, + ServerEvent, }; use std::time::SystemTime; diff --git a/bevy_renet2/src/lib.rs b/bevy_renet2/src/lib.rs index db7460f3..f614995e 100644 --- a/bevy_renet2/src/lib.rs +++ b/bevy_renet2/src/lib.rs @@ -1,117 +1,15 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] -pub use renet2; -use bevy_app::prelude::*; -use bevy_ecs::prelude::*; -use bevy_time::prelude::*; +#[cfg(feature = "netcode")] +pub mod netcode; -use renet2::{RenetClient, RenetServer, ServerEvent}; +#[cfg(feature = "steam")] +pub mod steam; -#[cfg(feature = "transport")] -pub mod transport; +mod renet2; +mod run_conditions; -/// This system set is where all transports receive messages -/// -/// If you want to ensure data has arrived in the [`RenetClient`] or [`RenetServer`], then schedule your -/// system after this set. -/// -/// This system set runs in PreUpdate. -#[derive(Debug, SystemSet, Clone, Copy, PartialEq, Eq, Hash)] -pub struct RenetReceive; - -/// This system set is where all transports send messages -/// -/// If you want to ensure your packets have been registered by the [`RenetClient`] or [`RenetServer`], then -/// schedule your system before this set. -/// -/// This system set runs in PostUpdate. -#[derive(Debug, SystemSet, Clone, Copy, PartialEq, Eq, Hash)] -pub struct RenetSend; - -pub struct RenetServerPlugin; - -pub struct RenetClientPlugin; - -impl Plugin for RenetServerPlugin { - fn build(&self, app: &mut App) { - app.init_resource::>(); - app.add_systems(PreUpdate, Self::update_system.run_if(resource_exists::)); - app.add_systems( - PreUpdate, - Self::emit_server_events_system - .in_set(RenetReceive) - .run_if(resource_exists::) - .after(Self::update_system), - ); - } -} - -impl RenetServerPlugin { - pub fn update_system(mut server: ResMut, time: Res