switch out renet netcode with renet_steam

This commit is contained in:
2025-12-19 20:03:45 -05:00
parent a4488cc072
commit 4fb37e27c5
6 changed files with 40 additions and 193 deletions

143
Cargo.lock generated
View File

@@ -85,16 +85,6 @@ version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 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]] [[package]]
name = "ahash" name = "ahash"
version = "0.8.12" version = "0.8.12"
@@ -1518,7 +1508,7 @@ dependencies = [
"bevy_ecs", "bevy_ecs",
"bevy_time", "bevy_time",
"renet", "renet",
"renet_netcode", "renet_steam",
] ]
[[package]] [[package]]
@@ -2165,41 +2155,6 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 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]] [[package]]
name = "clang-sys" name = "clang-sys"
version = "1.8.1" version = "1.8.1"
@@ -2488,15 +2443,6 @@ dependencies = [
"windows 0.54.0", "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]] [[package]]
name = "crc32fast" name = "crc32fast"
version = "1.5.0" version = "1.5.0"
@@ -2561,17 +2507,6 @@ version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 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]] [[package]]
name = "csv" name = "csv"
version = "1.4.0" version = "1.4.0"
@@ -3262,16 +3197,6 @@ dependencies = [
"thread_local", "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]] [[package]]
name = "gethostname" name = "gethostname"
version = "1.1.0" version = "1.1.0"
@@ -3890,15 +3815,6 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "inout"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01"
dependencies = [
"generic-array",
]
[[package]] [[package]]
name = "inventory" name = "inventory"
version = "0.3.21" version = "0.3.21"
@@ -4894,12 +4810,6 @@ version = "1.70.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
[[package]]
name = "opaque-debug"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]] [[package]]
name = "opener" name = "opener"
version = "0.8.3" version = "0.8.3"
@@ -5144,17 +5054,6 @@ dependencies = [
"windows-sys 0.61.2", "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]] [[package]]
name = "portable-atomic" name = "portable-atomic"
version = "1.11.1" version = "1.11.1"
@@ -5553,25 +5452,15 @@ dependencies = [
] ]
[[package]] [[package]]
name = "renet_netcode" name = "renet_steam"
version = "1.2.0" version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d73ffa79c2081fe93286acac186a20d49657b93b8cfa4e0e8b79b1f3ee81241" checksum = "1f6018afe469d3d2d49fab8fd1cecc46c588ac61498cad879d5781c44b277421"
dependencies = [ dependencies = [
"bevy_ecs", "bevy_ecs",
"log", "log",
"renet", "renet",
"renetcode", "steamworks",
]
[[package]]
name = "renetcode"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "118d456f815f7fd5bd12713a9e69a0b0f8b45806bd515e05bb60146f1867310d"
dependencies = [
"chacha20poly1305",
"log",
] ]
[[package]] [[package]]
@@ -6052,12 +5941,6 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "subtle"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]] [[package]]
name = "svg_fmt" name = "svg_fmt"
version = "0.4.5" version = "0.4.5"
@@ -6517,16 +6400,6 @@ version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" 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]] [[package]]
name = "url" name = "url"
version = "2.5.7" version = "2.5.7"
@@ -7597,12 +7470,6 @@ dependencies = [
"synstructure", "synstructure",
] ]
[[package]]
name = "zeroize"
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0"
[[package]] [[package]]
name = "zerotrie" name = "zerotrie"
version = "0.2.3" version = "0.2.3"

View File

@@ -61,7 +61,9 @@ bevy_pkv = { version = "0.14", default-features = false, features = [
"redb", "redb",
] } ] }
bevy_replicon = "0.37.1" 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_sprite3d = "7.0.0"
bevy_trenchbroom = { version = "0.10", default-features = false, features = [ bevy_trenchbroom = { version = "0.10", default-features = false, features = [
"physics-integration", "physics-integration",

View File

@@ -17,14 +17,12 @@ use bevy_replicon::{
}; };
use bevy_replicon_renet::{ use bevy_replicon_renet::{
RenetChannelsExt, RenetChannelsExt,
netcode::{ClientAuthentication, NetcodeClientTransport, NetcodeError},
renet::{ConnectionConfig, RenetClient}, renet::{ConnectionConfig, RenetClient},
steam::SteamClientTransport,
}; };
use bevy_steamworks::Client;
use bevy_trenchbroom::geometry::Brushes; use bevy_trenchbroom::geometry::Brushes;
use std::{ use steamworks::SteamId;
net::{Ipv4Addr, UdpSocket},
time::SystemTime,
};
pub mod audio; pub mod audio;
pub mod backpack; pub mod backpack;
@@ -55,7 +53,7 @@ pub fn plugin(app: &mut App) {
app.add_systems( app.add_systems(
OnEnter(GameState::Connecting), OnEnter(GameState::Connecting),
connect_to_server.run_if(|config: Res<NetworkingConfig>| config.server.is_some()), connect_to_server.run_if(|config: Res<NetworkingConfig>| config.connect_to_host()),
); );
app.add_systems(Update, despawn_absent_map_entities); app.add_systems(Update, despawn_absent_map_entities);
app.add_systems( app.add_systems(
@@ -91,6 +89,7 @@ fn connect_to_server(
mut commands: Commands, mut commands: Commands,
config: Res<NetworkingConfig>, config: Res<NetworkingConfig>,
channels: Res<RepliconChannels>, channels: Res<RepliconChannels>,
steam_client: Res<Client>,
) -> Result { ) -> Result {
let server_channels_config = channels.server_configs(); let server_channels_config = channels.server_configs();
let client_channels_config = channels.client_configs(); let client_channels_config = channels.client_configs();
@@ -101,33 +100,18 @@ fn connect_to_server(
..Default::default() ..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);
commands.insert_resource(client_transport(&config)?); commands.insert_resource(transport);
Ok(()) Ok(())
} }
fn client_transport(config: &NetworkingConfig) -> Result<NetcodeClientTransport, NetcodeError> {
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)] #[allow(clippy::type_complexity)]
fn migrate_remote_entities( fn migrate_remote_entities(
query: Query<(Entity, &TbMapEntityId), (Added<TbMapEntityId>, With<ConfirmHistory>)>, query: Query<(Entity, &TbMapEntityId), (Added<TbMapEntityId>, With<ConfirmHistory>)>,

View File

@@ -1,6 +1,5 @@
use bevy::prelude::*; use bevy::prelude::*;
use clap::Parser; use clap::Parser;
use std::net::SocketAddr;
pub fn plugin(app: &mut App) { pub fn plugin(app: &mut App) {
let config = NetworkingConfig::parse(); let config = NetworkingConfig::parse();
@@ -11,15 +10,17 @@ pub fn plugin(app: &mut App) {
#[derive(Resource, Parser, Debug)] #[derive(Resource, Parser, Debug)]
#[command(version, about, long_about = None)] #[command(version, about, long_about = None)]
pub struct NetworkingConfig { pub struct NetworkingConfig {
/// The IP/port to connect to. /// Steam id of the host 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.
#[arg(long)] #[arg(long)]
pub server: Option<Option<SocketAddr>>, pub steam_id: Option<String>,
/// Whether or not to open a port when opening the client, for other clients /// Whether or not to open a port when opening the client, for other clients
/// to connect. Does nothing if `server` is set. /// to connect. Does nothing if `server` is set.
#[arg(long)] #[arg(long)]
pub host: bool, pub host: bool,
} }
impl NetworkingConfig {
pub fn connect_to_host(&self) -> bool {
self.steam_id.is_some()
}
}

View File

@@ -149,16 +149,16 @@ pub fn plugin(app: &mut App) {
app.add_systems( app.add_systems(
OnEnter(GameState::Waiting), OnEnter(GameState::Waiting),
start_solo_client start_solo_client
.run_if(|config: Res<NetworkingConfig>| config.server.is_none() && !config.host), .run_if(|config: Res<NetworkingConfig>| !config.connect_to_host() && !config.host),
); );
app.add_systems( app.add_systems(
OnEnter(GameState::Waiting), OnEnter(GameState::Waiting),
start_listen_server start_listen_server
.run_if(|config: Res<NetworkingConfig>| config.server.is_none() && config.host), .run_if(|config: Res<NetworkingConfig>| config.connect_to_host() && config.host),
); );
app.add_systems( app.add_systems(
OnEnter(GameState::Waiting), OnEnter(GameState::Waiting),
start_client.run_if(|config: Res<NetworkingConfig>| config.server.is_some()), start_client.run_if(|config: Res<NetworkingConfig>| config.connect_to_host()),
); );
} else { } else {
app.add_systems(OnEnter(GameState::Waiting), start_dedicated_server); app.add_systems(OnEnter(GameState::Waiting), start_dedicated_server);

View File

@@ -16,12 +16,8 @@ use bevy_replicon::{
}; };
use bevy_replicon_renet::{ use bevy_replicon_renet::{
RenetChannelsExt, RenetChannelsExt,
netcode::{NetcodeServerTransport, ServerAuthentication},
renet::{ConnectionConfig, RenetServer}, renet::{ConnectionConfig, RenetServer},
}; steam::SteamServerTransport,
use std::{
net::{Ipv4Addr, UdpSocket},
time::SystemTime,
}; };
pub fn plugin(app: &mut App) { pub fn plugin(app: &mut App) {
@@ -57,6 +53,7 @@ fn open_renet_server(
mut commands: Commands, mut commands: Commands,
channels: Res<RepliconChannels>, channels: Res<RepliconChannels>,
mut next: ResMut<NextState<GameState>>, mut next: ResMut<NextState<GameState>>,
steam_client: Res<bevy_steamworks::Client>,
) -> Result<(), BevyError> { ) -> Result<(), BevyError> {
info!("opening server"); info!("opening server");
@@ -69,22 +66,18 @@ fn open_renet_server(
..Default::default() ..Default::default()
}); });
let current_time = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH)?; let steam_config = bevy_replicon_renet::steam::SteamServerConfig {
let port = 31111; access_permission: bevy_replicon_renet::steam::AccessPermission::FriendsOnly,
let socket = UdpSocket::bind((Ipv4Addr::UNSPECIFIED, port))?; max_clients: 16,
let server_config = bevy_replicon_renet::netcode::ServerConfig {
current_time,
max_clients: 1,
protocol_id: 0,
authentication: ServerAuthentication::Unsecure,
public_addresses: Default::default(),
}; };
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(server);
commands.insert_resource(transport); commands.insert_resource(transport);
info!("hosting a server on port {port}"); info!("hosting a server");
next.set(GameState::Playing); next.set(GameState::Playing);