diff --git a/crates/hedz_reloaded/src/client/steam.rs b/crates/hedz_reloaded/src/client/steam.rs index 7c4f87d..e58e9df 100644 --- a/crates/hedz_reloaded/src/client/steam.rs +++ b/crates/hedz_reloaded/src/client/steam.rs @@ -61,6 +61,14 @@ fn test_steam_system(steam_client: Res) { }, ); + let id = steam_client.user().steam_id(); + + info!("Steam ID: {:?}", id); + + steam_client + .friends() + .set_rich_presence("connect", Some(id.raw().to_string().as_str())); + for friend in steam_client.friends().get_friends(FriendFlags::IMMEDIATE) { info!( "Steam Friend: {:?} - {}({:?})", diff --git a/crates/hedz_reloaded/src/lib.rs b/crates/hedz_reloaded/src/lib.rs index 511e02a..91a89c8 100644 --- a/crates/hedz_reloaded/src/lib.rs +++ b/crates/hedz_reloaded/src/lib.rs @@ -45,12 +45,14 @@ use bevy::app::ScheduleRunnerPlugin; use bevy::{core_pipeline::tonemapping::Tonemapping, prelude::*}; use bevy_common_assets::ron::RonAssetPlugin; use bevy_replicon::{RepliconPlugins, prelude::ClientId}; -use bevy_replicon_renet::RepliconRenetPlugins; +use bevy_replicon_renet::{RepliconRenetPlugins, steam::SteamServerPlugin}; use bevy_sprite3d::Sprite3dPlugin; +use bevy_steamworks::SteamworksEvent; use bevy_trenchbroom::{ TrenchBroomPlugins, config::TrenchBroomConfig, prelude::TrenchBroomPhysicsPlugin, }; use bevy_trenchbroom_avian::AvianPhysicsBackend; +use steamworks::{CallbackResult, P2PSessionRequest}; use utils::{billboards, squish_animation}; pub const HEDZ_GREEN: Srgba = Srgba::rgb(0.0, 1.0, 0.0); @@ -90,6 +92,7 @@ pub fn launch() { .auto_open_threshold(bevy::log::tracing::level_filters::LevelFilter::OFF), ); + app.add_plugins(SteamServerPlugin); app.add_plugins(PhysicsPlugins::default()); app.add_plugins((RepliconPlugins, RepliconRenetPlugins)); app.add_plugins(Sprite3dPlugin); @@ -163,6 +166,8 @@ pub fn plugin(app: &mut App) { } else { app.add_systems(OnEnter(GameState::Waiting), start_dedicated_server); } + + app.add_systems(Update, accept_p2p_sessions); } #[derive(Resource, Reflect, Debug)] @@ -192,6 +197,23 @@ pub enum GameState { Playing, } +fn accept_p2p_sessions( + mut events: MessageReader, + steam_client: Res, +) { + for event in events.read() { + if let SteamworksEvent::CallbackResult(CallbackResult::P2PSessionRequest( + P2PSessionRequest { remote }, + )) = event + { + info!("Accepting P2P session from: {:?}", remote); + steam_client.networking().accept_p2p_session(*remote); + } else { + info!("steamworks event: {:?}", event); + } + } +} + fn start_solo_client( commands: Commands, mut next: ResMut>, diff --git a/crates/hedz_reloaded/src/server.rs b/crates/hedz_reloaded/src/server.rs index 2a4dc97..3ed6d6b 100644 --- a/crates/hedz_reloaded/src/server.rs +++ b/crates/hedz_reloaded/src/server.rs @@ -76,10 +76,10 @@ fn open_renet_server( let client = (**steam_client).clone(); let transport = SteamServerTransport::new(client, steam_config)?; - commands.insert_resource(server); - commands.insert_resource(transport); - - info!("hosting a server"); + commands.queue(|w: &mut World| { + w.insert_resource(server); + w.insert_non_send_resource(transport); + }); next.set(GameState::Playing);