diff --git a/rust/src/game/mod.rs b/rust/src/game/mod.rs index 8103ad3..59acb6b 100644 --- a/rust/src/game/mod.rs +++ b/rust/src/game/mod.rs @@ -539,27 +539,55 @@ impl Game { unregister_commands(&mut cli); } - pub fn change_option(&mut self, opt: GameOption, value: GameOptionValue) { + pub fn change_option(&mut self, opt: GameOption, value: GameOptionValue, send: bool) { + godot_print!("Option changed"); self.opts.values.insert(opt, value); self.run_deferred(move |s| { s.signals().options_changed().emit(); - if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer { - if let PeerKind::Server(peer, _) = peer { - peer.broadcast_reliable(Package::GameOptionChanged(opt, value)); + if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer + && send + { + match peer { + PeerKind::Client(peer, socket_addr) => { + if s.has_host_privileges() { + peer.send_reliable(socket_addr, Package::GameOptionChanged(opt, value)); + } + } + PeerKind::Server(peer, _) => { + peer.broadcast_reliable(Package::GameOptionChanged(opt, value)); + } } } }); } - pub fn change_team_option(&mut self, team: u8, opt: GameOption, value: GameOptionValue) { + pub fn change_team_option( + &mut self, + team: u8, + opt: GameOption, + value: GameOptionValue, + send: bool, + ) { if let Some(team) = self.opts.teams.get_mut(team as usize) { team.values.insert(opt, value); } self.run_deferred(move |s| { s.signals().team_options_changed().emit(team); - if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer { - if let PeerKind::Server(peer, _) = peer { - peer.broadcast_reliable(Package::TeamGameOptionChanged(team, opt, value)); + if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer + && send + { + match peer { + PeerKind::Client(peer, socket_addr) => { + if s.has_host_privileges() { + peer.send_reliable( + socket_addr, + Package::TeamGameOptionChanged(team, opt, value), + ); + } + } + PeerKind::Server(peer, _) => { + peer.broadcast_reliable(Package::TeamGameOptionChanged(team, opt, value)); + } } } }); diff --git a/rust/src/net/protocol.rs b/rust/src/net/protocol.rs index 91b9bef..ae3799b 100644 --- a/rust/src/net/protocol.rs +++ b/rust/src/net/protocol.rs @@ -243,12 +243,12 @@ impl NetworkManager { } Package::GameOptionChanged(opt, value) => { if let Some(game) = &mut Game::singleton() { - game.bind_mut().change_option(opt, value); + game.bind_mut().change_option(opt, value, false); } } Package::TeamGameOptionChanged(team, opt, value) => { if let Some(game) = &mut Game::singleton() { - game.bind_mut().change_team_option(team, opt, value); + game.bind_mut().change_team_option(team, opt, value, false); } } Package::Goal(scorer, teams) => { @@ -568,6 +568,28 @@ impl NetworkManager { } } } + Package::GameOptionChanged(key, value) => { + if let Some(game) = &mut Game::singleton() { + let player = + game.bind().find_player_by_addr(&conn.address).cloned(); + if let Some(player) = player + && player.has_host_privileges + { + game.bind_mut().change_option(key, value, false); + } + } + } + Package::TeamGameOptionChanged(team, key, value) => { + if let Some(game) = &mut Game::singleton() { + let player = + game.bind().find_player_by_addr(&conn.address).cloned(); + if let Some(player) = player + && player.has_host_privileges + { + game.bind_mut().change_team_option(team, key, value, false); + } + } + } _ => {} }, }, diff --git a/rust/src/ui/lobby.rs b/rust/src/ui/lobby.rs index 31e4aac..3380074 100644 --- a/rust/src/ui/lobby.rs +++ b/rust/src/ui/lobby.rs @@ -270,13 +270,13 @@ impl LobbyPanel { fn option_changed(&mut self, key: GameOption, value: GameOptionValue) { if let Some(game) = &mut Game::singleton() { - game.bind_mut().change_option(key, value); + game.bind_mut().change_option(key, value, true); } } fn team_option_changed(&mut self, team: u8, key: GameOption, value: GameOptionValue) { if let Some(game) = &mut Game::singleton() { - game.bind_mut().change_team_option(team, key, value); + game.bind_mut().change_team_option(team, key, value, true); } }