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