Add sending chat messages as well
This commit is contained in:
parent
95bd5d9365
commit
46bc9115ae
@ -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")]
|
||||
messages = NodePath("panel/scroll_container/v_box_container")
|
||||
line_edit = NodePath("line_edit")
|
||||
show_edit = true
|
||||
custom_minimum_size = Vector2(500, 300)
|
||||
custom_maximum_size = Vector2(500, 300)
|
||||
offset_right = 500.0
|
||||
|
||||
@ -37,6 +37,7 @@ impl Chat {
|
||||
pub enum ChatMessage {
|
||||
Death(DamageSource, u16),
|
||||
Announcement(u16, Announcement),
|
||||
ChatMessage(u16, String),
|
||||
}
|
||||
|
||||
impl ChatMessage {
|
||||
@ -78,6 +79,14 @@ impl ChatMessage {
|
||||
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
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
if let Some(chat) = &mut Chat::singleton() {
|
||||
chat.bind_mut()
|
||||
|
||||
@ -292,6 +292,7 @@ pub enum Package {
|
||||
PlayerLeft(NetPlayer),
|
||||
SetTeam(u16, u8),
|
||||
GameOptionChanged(GameOption, GameOptionValue),
|
||||
ChatMessage(u16, String),
|
||||
|
||||
// Lobby packages
|
||||
SetReady(u16, bool),
|
||||
|
||||
@ -205,6 +205,11 @@ impl NetworkManager {
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
},
|
||||
|
||||
@ -1,15 +1,22 @@
|
||||
use godot::{
|
||||
classes::{
|
||||
Engine, IVBoxContainer, InputEvent, LineEdit, Panel, RichTextLabel, TextEdit, VBoxContainer,
|
||||
Engine, IVBoxContainer, InputEvent, LineEdit, Panel, RichTextLabel, ScrollContainer,
|
||||
TextEdit, VBoxContainer,
|
||||
},
|
||||
prelude::*,
|
||||
};
|
||||
|
||||
use crate::chat::Chat;
|
||||
use crate::{
|
||||
chat::Chat,
|
||||
game_manager::Game,
|
||||
net::network_manager::{NetworkManager, Package, PeerKind},
|
||||
};
|
||||
|
||||
#[derive(GodotClass)]
|
||||
#[class(base=VBoxContainer, init, tool)]
|
||||
pub struct ChatBox {
|
||||
#[export]
|
||||
scroll: Option<Gd<ScrollContainer>>,
|
||||
#[export]
|
||||
messages: Option<Gd<VBoxContainer>>,
|
||||
#[export]
|
||||
@ -81,10 +88,15 @@ impl ChatBox {
|
||||
if let Some(messages) = &mut self.messages {
|
||||
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) {
|
||||
godot_print!("{}", message);
|
||||
if let Some(line_edit) = &mut self.line_edit {
|
||||
line_edit.clear();
|
||||
if self.in_game {
|
||||
@ -92,6 +104,22 @@ impl ChatBox {
|
||||
}
|
||||
}
|
||||
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 {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user