diff --git a/rc_multiplayer/src/events/map_ping.rs b/rc_multiplayer/src/events/map_ping.rs new file mode 100644 index 0000000..b565315 --- /dev/null +++ b/rc_multiplayer/src/events/map_ping.rs @@ -0,0 +1,30 @@ +pub struct PingMap { + msg_router: tokio::sync::mpsc::Sender, +} + +pub(super) fn handler(init_ctx: &crate::InitConfig) -> crate::handlers::SimpleRlnl { + crate::handlers::SimpleRlnl::new(PingMap::new(init_ctx)) +} + +impl PingMap { + fn new(init_ctx: &crate::InitConfig) -> Self { + Self { + msg_router: init_ctx.matches_chann.clone(), + } + } +} + +#[async_trait::async_trait] +impl crate::handlers::RlnlEventCodeHandler for PingMap { + type In = rlnl::events::ingame::MapPing; + const CODE: rlnl::event_code::NetworkEvent = rlnl::event_code::NetworkEvent::MapPingEvent; + + async fn handle(&self, data: Self::In, _peer: &std::sync::Arc>, user: &crate::UserData, _sender: &std::sync::Arc>) { + if let Some(user_info) = user.user().await { + super::log_channel_send_failure(self.msg_router.send(crate::matches::GameMessage::MapPing { + user_id: user_info.user_id(), + ping: data, + }).await); + } + } +} diff --git a/rc_multiplayer/src/events/mod.rs b/rc_multiplayer/src/events/mod.rs index 05074ce..c385c22 100644 --- a/rc_multiplayer/src/events/mod.rs +++ b/rc_multiplayer/src/events/mod.rs @@ -10,6 +10,7 @@ mod kill_player; mod client_unregister; mod flipper_start; mod self_destruct_elimination; +mod map_ping; pub async fn handler(init_ctx: &crate::InitConfig) -> crate::handler::LnlEventHandler { crate::handler::LnlEventHandler::new(init_ctx.users.clone(), crate::vehicle_motion::handler(init_ctx)) @@ -173,6 +174,7 @@ pub async fn handler(init_ctx: &crate::InitConfig) -> crate::handler::LnlEventHa rlnl::events::ingame::UpdateVotingAfterBattle, >::handler(init_ctx)) .add(self_destruct_elimination::handler(init_ctx)) + .add(map_ping::handler(init_ctx)) } #[inline] @@ -208,6 +210,7 @@ mod _broadcast_impls { impl Broadcastable for rlnl::events::ingame::CosmeticAction {} impl Broadcastable for rlnl::events::ingame::UpdateVotingAfterBattle {} impl Broadcastable for rlnl::events::ingame::TeleportActivateEffect {} + impl Broadcastable for rlnl::events::ingame::MapPing {} impl Broadcastable for rlnl::events::sync::UpdateGameModeSettings {} impl Broadcastable for rlnl::events::GameTime {} diff --git a/rc_multiplayer/src/matches/generic.rs b/rc_multiplayer/src/matches/generic.rs index 6aee65a..69b0ce0 100644 --- a/rc_multiplayer/src/matches/generic.rs +++ b/rc_multiplayer/src/matches/generic.rs @@ -535,6 +535,18 @@ impl GenericGamemodeEngine { ).await; } }, + super::GameMessage::MapPing { user_id: _, ping } => { + for (id, conn) in self.users.read().await.iter() { + if (*id as i32) != ping.sender && (conn.descriptor.team as i32) == ping.team_id { + crate::events::log_lnl_send_failure(conn.connection.rlnl().send_data( + &ping, + rlnl::event_code::NetworkEvent::PlayerQuitRequestComplete, + literustlib::packet::Property::ReliableOrdered, + &conn.connection.connection + ).await); + } + } + } super::GameMessage::BroadcastRlnl { user_id, event, event_in, property, data } => { if self.custom_logic_handler.on_broadcast(&self, user_id, event, event_in, property, &data, false).await { if let Some(data) = data { diff --git a/rc_multiplayer/src/matches/messages.rs b/rc_multiplayer/src/matches/messages.rs index 1bd04e9..a909395 100644 --- a/rc_multiplayer/src/matches/messages.rs +++ b/rc_multiplayer/src/matches/messages.rs @@ -45,6 +45,10 @@ pub enum GameMessage { FlippingStarted { // flip yeah! user_id: i32, }, + MapPing { + user_id: i32, + ping: rlnl::events::ingame::MapPing, + }, BroadcastRlnl { user_id: i32, event: rlnl::event_code::NetworkEvent, @@ -82,6 +86,7 @@ impl GameMessage { Self::DestroyVehicle { user_id, .. } => *user_id, Self::SelfDestruct { user_id, .. } => *user_id, Self::FlippingStarted { user_id, .. } => *user_id, + Self::MapPing { user_id, .. } => *user_id, Self::BroadcastRlnl { user_id, .. } => *user_id, Self::RebroadcastRlnl { skip_user_id, .. } => *skip_user_id, Self::Motion { user_id, .. } => *user_id,