From ec566b3ecfbc2bc96b9f87335e28cffa1e64acaf Mon Sep 17 00:00:00 2001 From: Sofia Date: Wed, 29 Jul 2026 20:37:13 +0300 Subject: [PATCH] Add goal scoring chat message --- rust/src/chat.rs | 22 ++++++++++++++++++++++ rust/src/game/mod.rs | 9 +++++++-- rust/src/goal.rs | 3 ++- rust/src/net/network_manager.rs | 2 +- rust/src/net/protocol.rs | 4 ++-- 5 files changed, 34 insertions(+), 6 deletions(-) diff --git a/rust/src/chat.rs b/rust/src/chat.rs index d5af6a0..7045a78 100644 --- a/rust/src/chat.rs +++ b/rust/src/chat.rs @@ -38,6 +38,7 @@ pub enum ChatMessage { Death(DamageSource, u16), Announcement(u16, Announcement), ChatMessage(String, Color, String), + Goal(u16, Vec), } impl ChatMessage { @@ -89,6 +90,27 @@ impl ChatMessage { label.pop(); label.add_text(message); } + ChatMessage::Goal(player_id, team_ids) => { + if let Some(game) = Game::singleton() + && let Some(player) = game.bind().find_player(*player_id) + { + let teams = game.bind().get_teams(); + let teams = teams + .iter_shared() + .enumerate() + .filter(|(id, _)| team_ids.contains(&((*id) as u8))); + add_player(&mut label, &player); + label.add_text(" scored a goal for "); + for (idx, (_, team)) in teams.enumerate() { + if idx > 0 { + label.add_text(" and "); + } + label.push_color(team.bind().color); + label.add_text(&team.bind().name); + label.pop(); + } + } + } } label } diff --git a/rust/src/game/mod.rs b/rust/src/game/mod.rs index 1a231ac..7421b14 100644 --- a/rust/src/game/mod.rs +++ b/rust/src/game/mod.rs @@ -729,16 +729,21 @@ impl Game { self.spawn_ball(None, None, None); } - pub fn handle_goal(&mut self, teams: Vec) { + pub fn handle_goal(&mut self, scorer: u16, teams: Vec) { for team in &teams { self.goals .insert(*team, self.goals.get(&team).copied().unwrap_or(0) + 1); } self.run_deferred(move |s| { + if let Some(mut chat) = Chat::singleton() { + chat.bind_mut() + .new_message(ChatMessage::Goal(0, teams.clone())); + } + s.signals().on_goal().emit(); if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer { if let PeerKind::Server(peer, _) = peer { - peer.broadcast_reliable(Package::Goal(teams)); + peer.broadcast_reliable(Package::Goal(scorer, teams)); } } if NetworkManager::singleton().bind().is_host() { diff --git a/rust/src/goal.rs b/rust/src/goal.rs index 2d2d2a6..9a6f881 100644 --- a/rust/src/goal.rs +++ b/rust/src/goal.rs @@ -53,7 +53,8 @@ impl Goal { .collect(); if NetworkManager::singleton().bind().is_host() { game.bind_mut().respawn_ball(); - game.bind_mut().handle_goal(teams); + game.bind_mut() + .handle_goal(ball.bind().dropper.unwrap_or(0), teams); } } } diff --git a/rust/src/net/network_manager.rs b/rust/src/net/network_manager.rs index 97d3590..2d8545f 100644 --- a/rust/src/net/network_manager.rs +++ b/rust/src/net/network_manager.rs @@ -342,7 +342,7 @@ pub enum Package { SpawnBall(NetTransform, NetVector3, Option), DespawnBall, SwapWeapon(u16, WeaponType), - Goal(Vec), + Goal(u16, Vec), Announcement(u16, Announcement), Pickup(u8, u16), ThrowTelegrenade(u16, NetVector3), diff --git a/rust/src/net/protocol.rs b/rust/src/net/protocol.rs index 063850e..56185d7 100644 --- a/rust/src/net/protocol.rs +++ b/rust/src/net/protocol.rs @@ -202,9 +202,9 @@ impl NetworkManager { game.bind_mut().change_option(opt, value); } } - Package::Goal(teams) => { + Package::Goal(scorer, teams) => { if let Some(game) = &mut Game::singleton() { - game.bind_mut().handle_goal(teams); + game.bind_mut().handle_goal(scorer, teams); } } Package::FinishGame => {