Add host-privileges toggle

This commit is contained in:
Sofia 2026-08-14 22:28:45 +03:00
parent 30b64ab475
commit abc89c1e3e
3 changed files with 31 additions and 5 deletions

View File

@ -175,6 +175,7 @@ pub struct Game {
pub private_opts: PrivateGameOptions, pub private_opts: PrivateGameOptions,
is_host: bool, is_host: bool,
host_privileges: bool,
player_counter: u16, player_counter: u16,
pub self_id: Option<u16>, pub self_id: Option<u16>,
pub players: Vec<Player>, pub players: Vec<Player>,
@ -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) { pub fn start_playback(&mut self, time_delta: f64, spectated_id: u16) {
if let Some(recorder) = &self.replay_recorder if let Some(recorder) = &self.replay_recorder
&& self.self_id.is_some() && self.self_id.is_some()
@ -618,7 +623,13 @@ impl Game {
self.self_id = Some(id); self.self_id = Some(id);
} }
pub fn new_player(&mut self, addr: SocketAddr, name: Option<String>, id: Option<u16>) -> u16 { pub fn new_player(
&mut self,
addr: SocketAddr,
name: Option<String>,
id: Option<u16>,
host_privileges: bool,
) -> u16 {
let id = if let Some(id) = id { let id = if let Some(id) = id {
id id
} else { } else {
@ -641,6 +652,7 @@ impl Game {
character: None, character: None,
last_held_weapon: WeaponType::Raygun, last_held_weapon: WeaponType::Raygun,
last_position: Vector3::ZERO, last_position: Vector3::ZERO,
has_host_privileges: host_privileges,
}); });
self.run_deferred(move |s| s.signals().on_new_player().emit(id)); 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 killing_spree_cd: f64,
pub last_held_weapon: WeaponType, pub last_held_weapon: WeaponType,
pub last_position: Vector3, pub last_position: Vector3,
pub has_host_privileges: bool,
} }
impl Player { impl Player {
@ -1814,6 +1827,7 @@ impl From<NetPlayer> for Player {
killing_spree_cd: 0., killing_spree_cd: 0.,
last_held_weapon: WeaponType::Raygun, last_held_weapon: WeaponType::Raygun,
last_position: Vector3::ZERO, last_position: Vector3::ZERO,
has_host_privileges: false,
} }
} }
} }

View File

@ -223,6 +223,7 @@ impl NetworkManager {
SocketAddr::from(([0, 0, 0, 0], 0)), SocketAddr::from(([0, 0, 0, 0], 0)),
Some(default_name), Some(default_name),
None, None,
true,
); );
game.bind_mut().update_player_ready(id, true); game.bind_mut().update_player_ready(id, true);
game.bind_mut().set_self(id); game.bind_mut().set_self(id);
@ -350,7 +351,7 @@ pub enum Package {
Hello, Hello,
// Meta values // Meta values
Players(Vec<NetPlayer>, u16), Players(Vec<NetPlayer>, u16, bool),
UpdatePings(HashMap<u16, u128>), UpdatePings(HashMap<u16, u128>),
SetNick(u16, String), SetNick(u16, String),
SetSelfNick(String), SetSelfNick(String),

View File

@ -95,13 +95,17 @@ impl NetworkManager {
cli.bind_mut() cli.bind_mut()
.publish_message(format!("Got \"Hello\"!"), CliColor::Info); .publish_message(format!("Got \"Hello\"!"), CliColor::Info);
} }
Package::Players(players, self_id) => { Package::Players(players, self_id, host_privileges) => {
cli.bind_mut() cli.bind_mut()
.publish_message(format!("Got players"), CliColor::Info); .publish_message(format!("Got players"), CliColor::Info);
if let Some(game) = &mut Game::singleton() { if let Some(game) = &mut Game::singleton() {
game.bind_mut().set_players( game.bind_mut().set_players(
players.into_iter().map(|p| p.clone().into()).collect(), 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); game.bind_mut().set_self(self_id);
} }
} }
@ -129,6 +133,7 @@ impl NetworkManager {
SocketAddr::from(([0, 0, 0, 0], 0)), SocketAddr::from(([0, 0, 0, 0], 0)),
Some(player.name), Some(player.name),
Some(player.id), Some(player.id),
false,
); );
} }
} }
@ -321,8 +326,13 @@ impl NetworkManager {
); );
if let Some(game) = &mut Game::singleton() { if let Some(game) = &mut Game::singleton() {
let self_id = let is_first = game.bind().players.is_empty();
game.bind_mut().new_player(connection.address, None, None); let self_id = game.bind_mut().new_player(
connection.address,
None,
None,
is_first,
);
peer.send_reliable( peer.send_reliable(
&connection.address, &connection.address,
Package::Players( Package::Players(
@ -333,6 +343,7 @@ impl NetworkManager {
.map(|p| p.into()) .map(|p| p.into())
.collect(), .collect(),
self_id, self_id,
is_first,
), ),
); );
peer.send_reliable( peer.send_reliable(