use std::net::SocketAddr; use bevy::prelude::*; use bevy_rapier2d::prelude::Velocity; use crate::{module::component::{Attach, PartFlags}, planet::PlanetType, ws::WsEvent, Packet}; 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: crate::packet::MessageType::Direct, actor: player.username.clone(), content, }; event_queue.push(WsEvent::Send { to: target_player.addr, message: packet.clone().into(), }); event_queue.push(WsEvent::Send { to: *from, message: packet.into(), }); } else { // send to general chat let packet = Packet::Message { message_type: crate::packet::MessageType::Chat, actor: player.username.clone(), content, }; event_queue.push(WsEvent::Broadcast { message: packet.into(), }); } }