diff --git a/Cargo.lock b/Cargo.lock index 4b7dbe4..8aa28cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -85,16 +85,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array", -] - [[package]] name = "ahash" version = "0.8.12" @@ -1518,7 +1508,7 @@ dependencies = [ "bevy_ecs", "bevy_time", "renet", - "renet_netcode", + "renet_steam", ] [[package]] @@ -2165,41 +2155,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "zeroize", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", - "zeroize", -] - [[package]] name = "clang-sys" version = "1.8.1" @@ -2488,15 +2443,6 @@ dependencies = [ "windows 0.54.0", ] -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - [[package]] name = "crc32fast" version = "1.5.0" @@ -2561,17 +2507,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - [[package]] name = "csv" version = "1.4.0" @@ -3262,16 +3197,6 @@ dependencies = [ "thread_local", ] -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - [[package]] name = "gethostname" version = "1.1.0" @@ -3890,15 +3815,6 @@ dependencies = [ "libc", ] -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - [[package]] name = "inventory" version = "0.3.21" @@ -4894,12 +4810,6 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - [[package]] name = "opener" version = "0.8.3" @@ -5144,17 +5054,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures", - "opaque-debug", - "universal-hash", -] - [[package]] name = "portable-atomic" version = "1.11.1" @@ -5553,25 +5452,15 @@ dependencies = [ ] [[package]] -name = "renet_netcode" -version = "1.2.0" +name = "renet_steam" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d73ffa79c2081fe93286acac186a20d49657b93b8cfa4e0e8b79b1f3ee81241" +checksum = "1f6018afe469d3d2d49fab8fd1cecc46c588ac61498cad879d5781c44b277421" dependencies = [ "bevy_ecs", "log", "renet", - "renetcode", -] - -[[package]] -name = "renetcode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "118d456f815f7fd5bd12713a9e69a0b0f8b45806bd515e05bb60146f1867310d" -dependencies = [ - "chacha20poly1305", - "log", + "steamworks", ] [[package]] @@ -6052,12 +5941,6 @@ dependencies = [ "syn", ] -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - [[package]] name = "svg_fmt" version = "0.4.5" @@ -6517,16 +6400,6 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - [[package]] name = "url" version = "2.5.7" @@ -7597,12 +7470,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" - [[package]] name = "zerotrie" version = "0.2.3" diff --git a/Cargo.toml b/Cargo.toml index 888b271..a606b3b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -61,7 +61,9 @@ bevy_pkv = { version = "0.14", default-features = false, features = [ "redb", ] } bevy_replicon = "0.37.1" -bevy_replicon_renet = "0.13.0" +bevy_replicon_renet = { version = "0.13.0", default-features = false, features = [ + "renet_steam", +] } bevy_sprite3d = "7.0.0" bevy_trenchbroom = { version = "0.10", default-features = false, features = [ "physics-integration", diff --git a/crates/hedz_reloaded/src/client/mod.rs b/crates/hedz_reloaded/src/client/mod.rs index 7749d2d..b36d6cb 100644 --- a/crates/hedz_reloaded/src/client/mod.rs +++ b/crates/hedz_reloaded/src/client/mod.rs @@ -17,14 +17,12 @@ use bevy_replicon::{ }; use bevy_replicon_renet::{ RenetChannelsExt, - netcode::{ClientAuthentication, NetcodeClientTransport, NetcodeError}, renet::{ConnectionConfig, RenetClient}, + steam::SteamClientTransport, }; +use bevy_steamworks::Client; use bevy_trenchbroom::geometry::Brushes; -use std::{ - net::{Ipv4Addr, UdpSocket}, - time::SystemTime, -}; +use steamworks::SteamId; pub mod audio; pub mod backpack; @@ -55,7 +53,7 @@ pub fn plugin(app: &mut App) { app.add_systems( OnEnter(GameState::Connecting), - connect_to_server.run_if(|config: Res| config.server.is_some()), + connect_to_server.run_if(|config: Res| config.connect_to_host()), ); app.add_systems(Update, despawn_absent_map_entities); app.add_systems( @@ -91,6 +89,7 @@ fn connect_to_server( mut commands: Commands, config: Res, channels: Res, + steam_client: Res, ) -> Result { let server_channels_config = channels.server_configs(); let client_channels_config = channels.client_configs(); @@ -101,33 +100,18 @@ fn connect_to_server( ..Default::default() }); + let steam_id: u64 = config.steam_id.clone().unwrap().parse().unwrap(); + let steam_id = SteamId::from_raw(steam_id); + + info!("attempting connection to {steam_id:?}"); + let transport = SteamClientTransport::new((**steam_client).clone(), &steam_id)?; + commands.insert_resource(client); - commands.insert_resource(client_transport(&config)?); + commands.insert_resource(transport); Ok(()) } -fn client_transport(config: &NetworkingConfig) -> Result { - let current_time = SystemTime::now() - .duration_since(SystemTime::UNIX_EPOCH) - .unwrap(); - let client_id = current_time.as_millis() as u64; - let socket = UdpSocket::bind((Ipv4Addr::UNSPECIFIED, 0))?; - let server_addr = config - .server - .flatten() - .unwrap_or_else(|| "127.0.0.1:31111".parse().unwrap()); - let authentication = ClientAuthentication::Unsecure { - client_id, - protocol_id: 0, - server_addr, - user_data: None, - }; - - info!("attempting connection to {server_addr}"); - NetcodeClientTransport::new(current_time, authentication, socket) -} - #[allow(clippy::type_complexity)] fn migrate_remote_entities( query: Query<(Entity, &TbMapEntityId), (Added, With)>, diff --git a/crates/hedz_reloaded/src/config.rs b/crates/hedz_reloaded/src/config.rs index 8d9970b..d1553f6 100644 --- a/crates/hedz_reloaded/src/config.rs +++ b/crates/hedz_reloaded/src/config.rs @@ -1,6 +1,5 @@ use bevy::prelude::*; use clap::Parser; -use std::net::SocketAddr; pub fn plugin(app: &mut App) { let config = NetworkingConfig::parse(); @@ -11,15 +10,17 @@ pub fn plugin(app: &mut App) { #[derive(Resource, Parser, Debug)] #[command(version, about, long_about = None)] pub struct NetworkingConfig { - /// The IP/port to connect to. - /// If `None`, host a local server. - /// If Some(None), connect to the default server (`127.0.0.1:31111`) - /// Otherwise, connect to the given server. - /// Does nothing on the server. + /// Steam id of the host to connect to #[arg(long)] - pub server: Option>, + pub steam_id: Option, /// Whether or not to open a port when opening the client, for other clients /// to connect. Does nothing if `server` is set. #[arg(long)] pub host: bool, } + +impl NetworkingConfig { + pub fn connect_to_host(&self) -> bool { + self.steam_id.is_some() + } +} diff --git a/crates/hedz_reloaded/src/lib.rs b/crates/hedz_reloaded/src/lib.rs index fe414ca..97984eb 100644 --- a/crates/hedz_reloaded/src/lib.rs +++ b/crates/hedz_reloaded/src/lib.rs @@ -149,16 +149,16 @@ pub fn plugin(app: &mut App) { app.add_systems( OnEnter(GameState::Waiting), start_solo_client - .run_if(|config: Res| config.server.is_none() && !config.host), + .run_if(|config: Res| !config.connect_to_host() && !config.host), ); app.add_systems( OnEnter(GameState::Waiting), start_listen_server - .run_if(|config: Res| config.server.is_none() && config.host), + .run_if(|config: Res| config.connect_to_host() && config.host), ); app.add_systems( OnEnter(GameState::Waiting), - start_client.run_if(|config: Res| config.server.is_some()), + start_client.run_if(|config: Res| config.connect_to_host()), ); } else { app.add_systems(OnEnter(GameState::Waiting), start_dedicated_server); diff --git a/crates/hedz_reloaded/src/server.rs b/crates/hedz_reloaded/src/server.rs index 2a84480..ea4ba8d 100644 --- a/crates/hedz_reloaded/src/server.rs +++ b/crates/hedz_reloaded/src/server.rs @@ -16,12 +16,8 @@ use bevy_replicon::{ }; use bevy_replicon_renet::{ RenetChannelsExt, - netcode::{NetcodeServerTransport, ServerAuthentication}, renet::{ConnectionConfig, RenetServer}, -}; -use std::{ - net::{Ipv4Addr, UdpSocket}, - time::SystemTime, + steam::SteamServerTransport, }; pub fn plugin(app: &mut App) { @@ -57,6 +53,7 @@ fn open_renet_server( mut commands: Commands, channels: Res, mut next: ResMut>, + steam_client: Res, ) -> Result<(), BevyError> { info!("opening server"); @@ -69,22 +66,18 @@ fn open_renet_server( ..Default::default() }); - let current_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)?; - let port = 31111; - let socket = UdpSocket::bind((Ipv4Addr::UNSPECIFIED, port))?; - let server_config = bevy_replicon_renet::netcode::ServerConfig { - current_time, - max_clients: 1, - protocol_id: 0, - authentication: ServerAuthentication::Unsecure, - public_addresses: Default::default(), + let steam_config = bevy_replicon_renet::steam::SteamServerConfig { + access_permission: bevy_replicon_renet::steam::AccessPermission::FriendsOnly, + max_clients: 16, }; - let transport = NetcodeServerTransport::new(server_config, socket)?; + + let client = (**steam_client).clone(); + let transport = SteamServerTransport::new(client, steam_config)?; commands.insert_resource(server); commands.insert_resource(transport); - info!("hosting a server on port {port}"); + info!("hosting a server"); next.set(GameState::Playing);