M crates/client/src/networking/mod.rs => crates/client/src/networking/mod.rs +1 -0
@@ 75,6 75,7 @@ pub fn send_packet_event(packet: Packet, world: &mut World) {
Packet::PlayerInput(e) => send_event(e, world),
Packet::PlayerMouseInput(e) => send_event(e, world),
Packet::RequestSave(e) => send_event(e, world),
+ Packet::RequestMining(e) => send_event(e, world),
Packet::_SpecialDisconnect(e) => send_event(e, world),
LoginResponse(e) => send_event(e, world),
SpawnPlayer(e) => send_event(e, world),
M crates/client/src/ui/mod.rs => crates/client/src/ui/mod.rs +14 -7
@@ 3,14 3,14 @@ mod widgets;
use std::f32;
-use crate::components::{Camera, Chat, Menu, Player, PlayerResources, SendPacket, Transform};
+use crate::components::{Camera, Chat, Menu, Player, PlayerResources, SendPacket, ServerId, Transform};
use crate::ui::widgets::{progress_bar, RichTextExt};
use bevy_ecs::entity::Entity;
use bevy_ecs::event::Events;
use bevy_ecs::prelude::With;
use bevy_ecs::world::World;
use egui::{Align, Align2, CursorIcon, Layout, Margin, Order, RichText, Shadow, Visuals};
-use starkingdoms_common::packet::{Packet, SendMessagePacket};
+use starkingdoms_common::packet::{Packet, RequestMiningPacket, SendMessagePacket};
pub fn init_ui(ctx: egui::Context) {
// set colors
@@ 56,7 56,7 @@ pub fn draw_ui(
) {
draw_status_bar(ctx, world);
draw_chat(ctx, world, send_packet_events);
- draw_crafting(ctx, world);
+ draw_crafting(ctx, world, send_packet_events);
}
pub fn draw_status_bar(ctx: &egui::Context, world: &mut World) {
@@ 149,10 149,10 @@ pub fn draw_chat(
});
}
-pub fn draw_crafting(ctx: &egui::Context, world: &mut World) {
- let mut menus = world.query_filtered::<(Entity, &Transform), With<Menu>>();
+pub fn draw_crafting(ctx: &egui::Context, world: &mut World, send_packet_events: &mut Events<SendPacket>) {
+ let mut menus = world.query_filtered::<(Entity, &ServerId, &Transform), With<Menu>>();
let camera = world.resource::<Camera>();
- for (entity, menu) in menus.iter(world) {
+ for (entity, server_id, menu) in menus.iter(world) {
egui::Window::new("Crafting")
.id(format!("Crafting{}", entity.index()).into())
.pivot(Align2::LEFT_BOTTOM)
@@ 160,6 160,13 @@ pub fn draw_crafting(ctx: &egui::Context, world: &mut World) {
(menu.translation.x + camera.x) * camera.zoom + camera.width as f32 / 2.0,
(menu.translation.y + camera.y) * camera.zoom + camera.height as f32 / 2.0,
))
- .show(ctx, |ui| {});
+ .show(ctx, |ui| {
+ if ui.button("Mining").clicked() {
+ send_packet_events.send(SendPacket(Packet::RequestMining(RequestMiningPacket {
+ id: server_id.0,
+ is_mining: true,
+ })));
+ }
+ });
}
}
M crates/common/src/packet.rs => crates/common/src/packet.rs +13 -0
@@ 75,6 75,7 @@ pub enum ButtonType {
Right,
}
+// serverbound
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))]
pub struct ClientLoginPacket {
@@ 114,8 115,16 @@ pub struct RequestSavePacket {
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))]
+pub struct RequestMiningPacket {
+ pub id: u32,
+ pub is_mining: bool,
+}
+
+#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
+#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))]
pub struct SpecialDisconnectPacket {}
+// clientbound
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))]
pub struct LoginResponsePacket {
@@ 216,6 225,7 @@ pub enum Packet {
PlayerInput(PlayerInputPacket),
PlayerMouseInput(PlayerMouseInputPacket),
RequestSave(RequestSavePacket),
+ RequestMining(RequestMiningPacket),
_SpecialDisconnect(SpecialDisconnectPacket),
// clientbound
@@ 237,12 247,15 @@ pub enum Packet {
#[cfg(feature = "bevy")]
pub fn register_packet_events(world: &mut bevy_ecs::prelude::World) {
+ // serverbound
bevy_ecs::event::EventRegistry::register_event::<ClientLoginPacket>(world);
bevy_ecs::event::EventRegistry::register_event::<SendMessagePacket>(world);
bevy_ecs::event::EventRegistry::register_event::<PlayerInputPacket>(world);
bevy_ecs::event::EventRegistry::register_event::<PlayerMouseInputPacket>(world);
bevy_ecs::event::EventRegistry::register_event::<RequestSavePacket>(world);
+ bevy_ecs::event::EventRegistry::register_event::<RequestMiningPacket>(world);
bevy_ecs::event::EventRegistry::register_event::<SpecialDisconnectPacket>(world);
+ // clientbound
bevy_ecs::event::EventRegistry::register_event::<LoginResponsePacket>(world);
bevy_ecs::event::EventRegistry::register_event::<PlayerListPacket>(world);
bevy_ecs::event::EventRegistry::register_event::<PlanetPositionsPacket>(world);
M crates/server/src/player/mod.rs => crates/server/src/player/mod.rs +9 -2
@@ 20,8 20,7 @@ use player_mouse_input::{attach_or_detach, mouse_picking};
use request_save::request_save;
use send_message::send_message;
use starkingdoms_common::packet::{
- ClientLoginPacket, PlayerInputPacket, PlayerMouseInputPacket, RequestSavePacket,
- SendMessagePacket,
+ ClientLoginPacket, PlayerInputPacket, PlayerMouseInputPacket, RequestMiningPacket, RequestSavePacket, SendMessagePacket
};
use starkingdoms_common::{packet::Packet, PartType as c_PartType};
@@ 228,6 227,14 @@ pub fn on_message(
}
}
}
+ Packet::RequestMining(RequestMiningPacket { id, is_mining }) => {
+ match mining_query.get_mut(Entity::from_raw(id)) {
+ Ok(mut mining) => {
+ mining.0 = is_mining;
+ }
+ Err(e) => {}
+ }
+ }
_ => continue,
}
}