Allow host clients to change game options

This commit is contained in:
Sofia 2026-08-14 23:25:52 +03:00
parent 5a04e82a11
commit 0a1fdce192
3 changed files with 62 additions and 12 deletions

View File

@ -539,29 +539,57 @@ 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 {
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 {
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));
}
}
}
});
}

View File

@ -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);
}
}
}
_ => {}
},
},

View File

@ -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);
}
}