From abc89c1e3e4bc6e1f1008840f6c259f6c2b1651e Mon Sep 17 00:00:00 2001 From: Sofia Date: Fri, 14 Aug 2026 22:28:45 +0300 Subject: [PATCH] Add host-privileges toggle --- rust/src/game/mod.rs | 16 +++++++++++++++- rust/src/net/network_manager.rs | 3 ++- rust/src/net/protocol.rs | 17 ++++++++++++++--- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/rust/src/game/mod.rs b/rust/src/game/mod.rs index 71055ae..2e7bbc7 100644 --- a/rust/src/game/mod.rs +++ b/rust/src/game/mod.rs @@ -175,6 +175,7 @@ pub struct Game { pub private_opts: PrivateGameOptions, is_host: bool, + host_privileges: bool, player_counter: u16, pub self_id: Option, pub players: Vec, @@ -351,6 +352,10 @@ impl Game { } } + pub fn set_host_privileges(&mut self, privileges: bool) { + self.host_privileges = privileges; + } + pub fn start_playback(&mut self, time_delta: f64, spectated_id: u16) { if let Some(recorder) = &self.replay_recorder && self.self_id.is_some() @@ -618,7 +623,13 @@ impl Game { self.self_id = Some(id); } - pub fn new_player(&mut self, addr: SocketAddr, name: Option, id: Option) -> u16 { + pub fn new_player( + &mut self, + addr: SocketAddr, + name: Option, + id: Option, + host_privileges: bool, + ) -> u16 { let id = if let Some(id) = id { id } else { @@ -641,6 +652,7 @@ impl Game { character: None, last_held_weapon: WeaponType::Raygun, last_position: Vector3::ZERO, + has_host_privileges: host_privileges, }); self.run_deferred(move |s| s.signals().on_new_player().emit(id)); @@ -1628,6 +1640,7 @@ pub struct Player { pub killing_spree_cd: f64, pub last_held_weapon: WeaponType, pub last_position: Vector3, + pub has_host_privileges: bool, } impl Player { @@ -1814,6 +1827,7 @@ impl From for Player { killing_spree_cd: 0., last_held_weapon: WeaponType::Raygun, last_position: Vector3::ZERO, + has_host_privileges: false, } } } diff --git a/rust/src/net/network_manager.rs b/rust/src/net/network_manager.rs index 3da85e6..37422f7 100644 --- a/rust/src/net/network_manager.rs +++ b/rust/src/net/network_manager.rs @@ -223,6 +223,7 @@ impl NetworkManager { SocketAddr::from(([0, 0, 0, 0], 0)), Some(default_name), None, + true, ); game.bind_mut().update_player_ready(id, true); game.bind_mut().set_self(id); @@ -350,7 +351,7 @@ pub enum Package { Hello, // Meta values - Players(Vec, u16), + Players(Vec, u16, bool), UpdatePings(HashMap), SetNick(u16, String), SetSelfNick(String), diff --git a/rust/src/net/protocol.rs b/rust/src/net/protocol.rs index abed8f9..1ddf780 100644 --- a/rust/src/net/protocol.rs +++ b/rust/src/net/protocol.rs @@ -95,13 +95,17 @@ impl NetworkManager { cli.bind_mut() .publish_message(format!("Got \"Hello\"!"), CliColor::Info); } - Package::Players(players, self_id) => { + Package::Players(players, self_id, host_privileges) => { cli.bind_mut() .publish_message(format!("Got players"), CliColor::Info); if let Some(game) = &mut Game::singleton() { game.bind_mut().set_players( players.into_iter().map(|p| p.clone().into()).collect(), ); + if host_privileges { + game.bind_mut().set_host_privileges(true); + } + game.bind_mut().set_self(self_id); } } @@ -129,6 +133,7 @@ impl NetworkManager { SocketAddr::from(([0, 0, 0, 0], 0)), Some(player.name), Some(player.id), + false, ); } } @@ -321,8 +326,13 @@ impl NetworkManager { ); if let Some(game) = &mut Game::singleton() { - let self_id = - game.bind_mut().new_player(connection.address, None, None); + let is_first = game.bind().players.is_empty(); + let self_id = game.bind_mut().new_player( + connection.address, + None, + None, + is_first, + ); peer.send_reliable( &connection.address, Package::Players( @@ -333,6 +343,7 @@ impl NetworkManager { .map(|p| p.into()) .collect(), self_id, + is_first, ), ); peer.send_reliable(