Add sending chat messages as well

This commit is contained in:
Sofia 2026-07-24 04:11:18 +03:00
parent 1664ee7973
commit c44b419f9f
6 changed files with 69 additions and 4 deletions

View File

@ -6,7 +6,6 @@ bg_color = Color(0.6, 0.6, 0.6, 0)
[node name="chat_box" type="ChatBox" unique_id=1125601400 node_paths=PackedStringArray("messages", "line_edit")] [node name="chat_box" type="ChatBox" unique_id=1125601400 node_paths=PackedStringArray("messages", "line_edit")]
messages = NodePath("panel/scroll_container/v_box_container") messages = NodePath("panel/scroll_container/v_box_container")
line_edit = NodePath("line_edit") line_edit = NodePath("line_edit")
show_edit = true
custom_minimum_size = Vector2(500, 300) custom_minimum_size = Vector2(500, 300)
custom_maximum_size = Vector2(500, 300) custom_maximum_size = Vector2(500, 300)
offset_right = 500.0 offset_right = 500.0

View File

@ -37,6 +37,7 @@ impl Chat {
pub enum ChatMessage { pub enum ChatMessage {
Death(DamageSource, u16), Death(DamageSource, u16),
Announcement(u16, Announcement), Announcement(u16, Announcement),
ChatMessage(u16, String),
} }
impl ChatMessage { impl ChatMessage {
@ -78,6 +79,14 @@ impl ChatMessage {
label.append_text(&format!("[color=red]{}[/color]", what)); label.append_text(&format!("[color=red]{}[/color]", what));
} }
} }
ChatMessage::ChatMessage(player_id, message) => {
if let Some(game) = Game::singleton()
&& let Some(player) = game.bind().find_player(*player_id)
{
add_player(&mut label, &player);
label.add_text(message);
}
}
} }
label label
} }

View File

@ -907,6 +907,20 @@ impl Game {
}); });
} }
pub fn on_chat_message(&mut self, player_id: u16, message: String) {
if let Some(chat) = &mut Chat::singleton() {
chat.bind_mut()
.new_message(ChatMessage::ChatMessage(player_id, message.clone()));
}
self.run_deferred(move |_| {
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
&& let PeerKind::Server(peer, _) = peer
{
peer.broadcast_reliable(Package::ChatMessage(player_id, message.clone()));
}
});
}
pub fn on_announcement(&mut self, player_id: u16, announcement: Announcement) { pub fn on_announcement(&mut self, player_id: u16, announcement: Announcement) {
if let Some(chat) = &mut Chat::singleton() { if let Some(chat) = &mut Chat::singleton() {
chat.bind_mut() chat.bind_mut()

View File

@ -292,6 +292,7 @@ pub enum Package {
PlayerLeft(NetPlayer), PlayerLeft(NetPlayer),
SetTeam(u16, u8), SetTeam(u16, u8),
GameOptionChanged(GameOption, GameOptionValue), GameOptionChanged(GameOption, GameOptionValue),
ChatMessage(u16, String),
// Lobby packages // Lobby packages
SetReady(u16, bool), SetReady(u16, bool),

View File

@ -205,6 +205,11 @@ impl NetworkManager {
game.bind_mut().on_announcement(source_id, announcement); game.bind_mut().on_announcement(source_id, announcement);
} }
} }
Package::ChatMessage(source_id, message) => {
if let Some(game) = &mut Game::singleton() {
game.bind_mut().on_chat_message(source_id, message);
}
}
_ => {} _ => {}
}, },
}, },
@ -372,6 +377,15 @@ impl NetworkManager {
} }
} }
} }
Package::ChatMessage(_, message) => {
if let Some(game) = &mut Game::singleton() {
let player =
game.bind().find_player_by_addr(&conn.address).cloned();
if let Some(player) = player {
game.bind_mut().on_chat_message(player.id(), message);
}
}
}
_ => {} _ => {}
}, },
}, },

View File

@ -1,15 +1,22 @@
use godot::{ use godot::{
classes::{ classes::{
Engine, IVBoxContainer, InputEvent, LineEdit, Panel, RichTextLabel, TextEdit, VBoxContainer, Engine, IVBoxContainer, InputEvent, LineEdit, Panel, RichTextLabel, ScrollContainer,
TextEdit, VBoxContainer,
}, },
prelude::*, prelude::*,
}; };
use crate::chat::Chat; use crate::{
chat::Chat,
game_manager::Game,
net::network_manager::{NetworkManager, Package, PeerKind},
};
#[derive(GodotClass)] #[derive(GodotClass)]
#[class(base=VBoxContainer, init, tool)] #[class(base=VBoxContainer, init, tool)]
pub struct ChatBox { pub struct ChatBox {
#[export]
scroll: Option<Gd<ScrollContainer>>,
#[export] #[export]
messages: Option<Gd<VBoxContainer>>, messages: Option<Gd<VBoxContainer>>,
#[export] #[export]
@ -81,10 +88,15 @@ impl ChatBox {
if let Some(messages) = &mut self.messages { if let Some(messages) = &mut self.messages {
messages.add_child(&message); messages.add_child(&message);
} }
self.run_deferred(|s| {
if let Some(scroll) = &mut s.scroll {
scroll.set_h_scroll(i32::MAX);
scroll.set_v_scroll(i32::MAX);
}
});
} }
pub fn on_submit(&mut self, message: GString) { pub fn on_submit(&mut self, message: GString) {
godot_print!("{}", message);
if let Some(line_edit) = &mut self.line_edit { if let Some(line_edit) = &mut self.line_edit {
line_edit.clear(); line_edit.clear();
if self.in_game { if self.in_game {
@ -92,6 +104,22 @@ impl ChatBox {
} }
} }
self.signals().on_closed().emit(); self.signals().on_closed().emit();
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer {
match peer {
PeerKind::Client(peer, socket_addr) => {
peer.send_reliable(socket_addr, Package::ChatMessage(0, message.to_string()));
}
PeerKind::Server(..) => {
self.run_deferred(move |_| {
if let Some(game) = &mut Game::singleton() {
let self_id = game.bind().self_id;
game.bind_mut()
.on_chat_message(self_id.unwrap_or(0), message.to_string());
}
});
}
}
}
} }
pub fn is_editing(&self) -> bool { pub fn is_editing(&self) -> bool {