From 830d0b9543b30e419d6b00d66a9bfdc2411524ae Mon Sep 17 00:00:00 2001 From: ghostly_zsh Date: Thu, 27 Mar 2025 01:08:44 -0500 Subject: [PATCH] mostly working chatbox and inputs to egui windows no longer go to the game --- crates/client/src/components.rs | 6 ++++ crates/client/src/lib.rs | 9 +++-- crates/client/src/networking/mod.rs | 6 +++- crates/client/src/rendering/mod.rs | 15 ++++---- crates/client/src/ui/mod.rs | 54 +++++++++++++++++++++++++---- 5 files changed, 74 insertions(+), 16 deletions(-) diff --git a/crates/client/src/components.rs b/crates/client/src/components.rs index d46c900f0e8e8ebec2d23cccce3c1b72068c3a56..836ce30438ef4d966bc9b75407370ae90da9d03b 100644 --- a/crates/client/src/components.rs +++ b/crates/client/src/components.rs @@ -86,3 +86,9 @@ pub struct ServerId(pub u32); pub struct SendPacket(pub Packet); #[derive(Event, Clone, PartialEq)] pub struct RecvPacket(pub Packet); + +#[derive(Resource, Clone)] +pub struct Chat { + pub messages: Vec, + pub textbox: String, +} diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index 7fdbd424632db9ec1e6bdcbb8ef0cfb653a8ca7d..0f3618acbf5a5060421b7aefeb316b1cda223102 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -1,5 +1,5 @@ use bevy_ecs::{event::Events, world::World}; -use components::{Camera, Part, Player, RecvPacket, SendPacket, Texture, Transform}; +use components::{Camera, Chat, Part, Player, RecvPacket, SendPacket, Texture, Transform}; use nalgebra::{Rotation2, Rotation3, Scale2, Scale3, Translation2, Translation3, Vector3}; use networking::ws::Ws; use rendering::{assets::Assets, App}; @@ -49,8 +49,13 @@ pub fn start() { fuel_amount: 0, fuel_max: 0, }); + world.insert_resource(Chat { + messages: vec![ + ], + textbox: String::new(), + }); - let mut send_packet_events = Events::::default(); + let send_packet_events = Events::::default(); let recv_packet_events = Events::::default(); world.spawn(( diff --git a/crates/client/src/networking/mod.rs b/crates/client/src/networking/mod.rs index 915fd71b124cdca86f89274cd3732651ca242a28..36b717d4996db2883ea91475c1f21f68d5ed6dc1 100644 --- a/crates/client/src/networking/mod.rs +++ b/crates/client/src/networking/mod.rs @@ -9,7 +9,7 @@ use bevy_ecs::{ use nalgebra::{Rotation2, Scale2, Scale3, Translation3}; use starkingdoms_common::{packet::Packet, PartType, PlanetType}; -use crate::components::{Camera, Part, Planet, Player, PlayerResources, RecvPacket, SendPacket, ServerId, SpriteBundle, Texture, Transform}; +use crate::components::{Camera, Chat, Part, Planet, Player, PlayerResources, RecvPacket, SendPacket, ServerId, SpriteBundle, Texture, Transform}; #[cfg(target_arch = "wasm32")] #[path = "ws_wasm.rs"] @@ -203,6 +203,10 @@ pub fn process_packets( r.fuel_amount = *amount; r.fuel_max = *max; } + Message { message_type, actor, content } => { + let mut chat = world.get_resource_mut::().unwrap(); + chat.messages.push(format!("{}: {}", actor.clone(), content.clone())); + } PlayerLeave { id } => { let mut part_query = world.query_filtered::<(Entity, &ServerId), With>(); let mut entity_to_remove = None; diff --git a/crates/client/src/rendering/mod.rs b/crates/client/src/rendering/mod.rs index 44a8819e76992e6a26553e5a3e206cc2c2b32401..ec1140f256fce6f221390e974084f338055ea990 100644 --- a/crates/client/src/rendering/mod.rs +++ b/crates/client/src/rendering/mod.rs @@ -344,6 +344,14 @@ impl ApplicationHandler for App { window_id: winit::window::WindowId, event: winit::event::WindowEvent, ) { + let event_response = self + .egui_glow + .as_mut() + .unwrap() + .on_window_event(self.window.as_ref().unwrap(), &event); + if event_response.consumed { + return; + } match event { WindowEvent::CloseRequested => { event_loop.exit(); @@ -460,11 +468,6 @@ impl ApplicationHandler for App { } _ => {} } - let event_response = self - .egui_glow - .as_mut() - .unwrap() - .on_window_event(self.window.as_ref().unwrap(), &event); } fn about_to_wait(&mut self, event_loop: &ActiveEventLoop) { let mut ws = self @@ -498,7 +501,7 @@ impl ApplicationHandler for App { .as_mut() .unwrap() .run(self.window.as_ref().unwrap(), |ctx| { - draw_ui(ctx, &mut self.world); + draw_ui(ctx, &mut self.world, &mut self.send_packet_events); }); let camera = self.world.get_resource::().unwrap(); diff --git a/crates/client/src/ui/mod.rs b/crates/client/src/ui/mod.rs index a901dba95ea75f4de6281c1aeacbc40b78c9d6d5..2cfbfd28d1e9bc0d78345897ee6db7cba565bfbc 100644 --- a/crates/client/src/ui/mod.rs +++ b/crates/client/src/ui/mod.rs @@ -1,10 +1,14 @@ mod colors; mod widgets; +use std::f32; + +use bevy_ecs::event::Events; use bevy_ecs::prelude::With; use bevy_ecs::world::World; -use egui::{Align, Align2, CornerRadius, CursorIcon, Layout, Order, ProgressBar, RichText, Shadow, Stroke, Visuals}; -use crate::components::{Player, PlayerResources, Transform}; +use egui::{Align, Align2, CornerRadius, CursorIcon, Layout, Margin, Order, ProgressBar, RichText, Shadow, Stroke, Visuals}; +use starkingdoms_common::packet::Packet; +use crate::components::{Chat, Player, PlayerResources, SendPacket, Transform}; use crate::ui::widgets::{progress_bar, RichTextExt}; pub fn init_ui(ctx: egui::Context) { @@ -48,16 +52,17 @@ pub fn init_ui(ctx: egui::Context) { ctx.set_style(style); } -pub fn draw_ui(ctx: &egui::Context, world: &mut World) { - draw_hud(ctx, world); +pub fn draw_ui(ctx: &egui::Context, world: &mut World, send_packet_events: &mut Events) { + draw_status_bar(ctx, world); + draw_chat(ctx, world, send_packet_events); } -pub fn draw_hud(ctx: &egui::Context, world: &mut World) { +pub fn draw_status_bar(ctx: &egui::Context, world: &mut World) { let mut player = world.query_filtered::<&Transform, With>(); let player_position = player.single(&world); let player_resources = world.resource::(); - egui::Window::new("hud") + egui::Window::new("status_bar") .title_bar(false) .movable(false) .resizable(false) @@ -88,4 +93,39 @@ pub fn draw_hud(ctx: &egui::Context, world: &mut World) { }) }); }); -} \ No newline at end of file +} + +pub fn draw_chat(ctx: &egui::Context, world: &mut World, send_packet_events: &mut Events) { + let mut chat = world.get_resource_mut::().unwrap(); + + egui::Window::new("Chat") + .movable(true) + .order(Order::Foreground) + .show(ctx, |ui| { + egui::Frame::new() + .inner_margin(Margin::same(5)) + .corner_radius(2) + .fill(colors::CRUST) + .show(ui, |ui| { + egui::ScrollArea::vertical() + .max_width(f32::INFINITY) + .max_height(100.0) + .auto_shrink(false) + .stick_to_bottom(true) + .show(ui, |ui| { + for message in &chat.messages { + ui.label(message); + } + }); + }); + ui.horizontal(|ui| { + egui::TextEdit::singleline(&mut chat.textbox).show(ui); + if ui.button("Send").clicked() { + send_packet_events.send(SendPacket(Packet::SendMessage { + target: None, + content: chat.textbox.clone(), + })); + } + }); + }); +}