use std::net::SocketAddr; use bevy::prelude::*; use bevy_rapier2d::prelude::Velocity; use starkingdoms_common::packet::Packet; use crate::{ module::component::{Attach, PartFlags}, planet::PlanetType, ws::{PacketMessageConvert, WsEvent}, }; use super::component::Player; pub fn send_message( player_query: &Query< ( Entity, &mut Player, &Transform, &Velocity, &mut Attach, &mut PartFlags, ), Without, >, from: &SocketAddr, event_queue: &mut Vec, target: Option, content: String, ) { // find our player let mut player = None; for (_, q_player, _, _, _, _) in player_query.iter() { if q_player.addr == *from { player = Some(q_player); } } let player = player.unwrap(); if let Some(target_username) = target { let mut target_player = None; for (_, q_player, _, _, _, _) in player_query.iter() { if q_player.username == target_username { target_player = Some(q_player); } } let target_player = target_player.unwrap(); let packet = Packet::Message { message_type: starkingdoms_common::packet::MessageType::Direct, actor: player.username.clone(), content, }; event_queue.push(WsEvent::Send { to: target_player.addr, message: packet.clone().into_message(), }); event_queue.push(WsEvent::Send { to: *from, message: packet.into_message(), }); } else { // send to general chat let packet = Packet::Message { message_type: starkingdoms_common::packet::MessageType::Chat, actor: player.username.clone(), content, }; event_queue.push(WsEvent::Broadcast { message: packet.into_message(), }); } }