Propagate team options to clients as well

This commit is contained in:
Sofia 2026-08-03 21:32:53 +03:00
parent 38a84588e5
commit 4c8c010174
3 changed files with 51 additions and 14 deletions

View File

@ -328,6 +328,8 @@ impl Game {
#[signal] #[signal]
pub fn options_changed(); pub fn options_changed();
#[signal] #[signal]
pub fn team_options_changed(team: u8);
#[signal]
pub fn on_goal(); pub fn on_goal();
#[signal] #[signal]
pub fn on_game_finished(); pub fn on_game_finished();
@ -495,7 +497,7 @@ impl Game {
team.values.insert(opt, value); team.values.insert(opt, value);
} }
self.run_deferred(move |s| { self.run_deferred(move |s| {
s.signals().options_changed().emit(); s.signals().team_options_changed().emit(team);
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer { if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer {
if let PeerKind::Server(peer, _) = peer { if let PeerKind::Server(peer, _) = peer {
peer.broadcast_reliable(Package::TeamGameOptionChanged(team, opt, value)); peer.broadcast_reliable(Package::TeamGameOptionChanged(team, opt, value));

View File

@ -202,6 +202,11 @@ impl NetworkManager {
game.bind_mut().change_option(opt, value); game.bind_mut().change_option(opt, value);
} }
} }
Package::TeamGameOptionChanged(team, opt, value) => {
if let Some(game) = &mut Game::singleton() {
game.bind_mut().change_team_option(team, opt, value);
}
}
Package::Goal(scorer, teams) => { Package::Goal(scorer, teams) => {
if let Some(game) = &mut Game::singleton() { if let Some(game) = &mut Game::singleton() {
game.bind_mut().handle_goal(scorer, teams); game.bind_mut().handle_goal(scorer, teams);

View File

@ -12,7 +12,7 @@ use crate::{
bgm::{Music, MusicManager}, bgm::{Music, MusicManager},
game::{ game::{
Game, GameManager, Game, GameManager,
opts::{GameOption, GameOptionValue, GameOptions}, opts::{GameOption, GameOptionValue, GameOptions, TeamOptions},
}, },
lobby_world::LobbyWorld, lobby_world::LobbyWorld,
net::network_manager::{NetworkManager, Package, PeerKind}, net::network_manager::{NetworkManager, Package, PeerKind},
@ -116,6 +116,18 @@ impl IPanel for LobbyPanel {
} }
}); });
}); });
game.signals()
.team_options_changed()
.connect_other(self, |s, team| {
s.run_deferred(move |s| {
if let Some(game) = Game::singleton() {
if let Some(opts) = game.bind().get_team_opts(team) {
s.on_team_opts_update(team, &opts);
}
}
});
});
game.signals().on_map_changed().connect_other(self, |s, _| { game.signals().on_map_changed().connect_other(self, |s, _| {
s.run_deferred(|s| { s.run_deferred(|s| {
s.generate_team_options(); s.generate_team_options();
@ -268,23 +280,26 @@ impl LobbyPanel {
self.run_deferred_gd(move |_| { self.run_deferred_gd(move |_| {
for (key, value) in values { for (key, value) in values {
if let Some(control) = nodes.get(&key).cloned() { if let Some(control) = nodes.get(&key).cloned() {
match value { update_control(control, value);
GameOptionValue::Boolean(value) => {
if let Ok(mut checkbox) = control.try_cast::<CheckBox>() {
checkbox.set_pressed(value);
}
}
GameOptionValue::Number(value) => {
if let Ok(mut spinbox) = control.try_cast::<SpinBox>() {
spinbox.set_value(value);
}
}
}
} }
} }
}); });
} }
fn on_team_opts_update(&mut self, team: u8, opts: &TeamOptions) {
let values = opts.values.clone();
if let Some(nodes) = self.team_option_nodes.get(&team) {
let nodes = nodes.clone();
self.run_deferred_gd(move |_| {
for (key, value) in values {
if let Some(control) = nodes.get(&key).cloned() {
update_control(control, value);
}
}
});
}
}
fn update_ready_button(&mut self) { fn update_ready_button(&mut self) {
if let Some(game) = Game::singleton() if let Some(game) = Game::singleton()
&& let Some(peer) = &NetworkManager::singleton().bind().peer && let Some(peer) = &NetworkManager::singleton().bind().peer
@ -520,3 +535,18 @@ impl LobbyPanel {
nodes nodes
} }
} }
fn update_control(control: Gd<Control>, value: GameOptionValue) {
match value {
GameOptionValue::Boolean(value) => {
if let Ok(mut checkbox) = control.try_cast::<CheckBox>() {
checkbox.set_pressed(value);
}
}
GameOptionValue::Number(value) => {
if let Ok(mut spinbox) = control.try_cast::<SpinBox>() {
spinbox.set_value(value);
}
}
}
}