diff --git a/rc_multiplayer/src/matches/generic.rs b/rc_multiplayer/src/matches/generic.rs index c16378e..cd60669 100644 --- a/rc_multiplayer/src/matches/generic.rs +++ b/rc_multiplayer/src/matches/generic.rs @@ -1617,7 +1617,10 @@ fn is_any_users_in_mode<'a>(wants_mode: ConnectionMode, mut descriptors: impl st fn is_all_users_in_mode<'a>(wants_mode: ConnectionMode, mut descriptors: impl std::iter::Iterator) -> bool { descriptors.all(|desc| { let mode = ConnectionMode::from_u8(desc.state.mode.load(std::sync::atomic::Ordering::Relaxed)); - desc.descriptor.user_id.is_some() + desc.descriptor.user_id.is_none() + || ( + desc.descriptor.user_id.is_some() && (mode.to_u8() == wants_mode.to_u8() || matches!(mode, ConnectionMode::Disconnected)) + ) }) } diff --git a/rc_multiplayer/src/matches/modes/battle_arena.rs b/rc_multiplayer/src/matches/modes/battle_arena.rs index 902c95c..7abc2db 100644 --- a/rc_multiplayer/src/matches/modes/battle_arena.rs +++ b/rc_multiplayer/src/matches/modes/battle_arena.rs @@ -1352,7 +1352,7 @@ impl CustomGameLogic for BattleArenaLogic { true } - async fn extra_sync_events(&self, generic: &crate::matches::GenericGamemodeEngine, _connection: &crate::matches::generic::UserConnection, _player: &crate::matches::generic::UserDescriptor) -> Vec { + async fn extra_sync_events(&self, generic: &crate::matches::GenericGamemodeEngine, _connection: &crate::matches::generic::UserConnection, player: &crate::matches::generic::UserDescriptor) -> Vec { vec![ Some(crate::matches::RlnlPacket { event: rlnl::event_code::NetworkEvent::GameModeSettings, @@ -1363,7 +1363,7 @@ impl CustomGameLogic for BattleArenaLogic { }), }), // TeamBase - if generic.map_config.bases.is_empty() { + if generic.map_config.bases.is_empty() || player.descriptor.user_id.is_none() { None } else { Some(crate::matches::RlnlPacket { @@ -1383,7 +1383,7 @@ impl CustomGameLogic for BattleArenaLogic { }) }, // RegisterCapturePoints - if generic.map_config.capture_points.is_empty() { + if generic.map_config.capture_points.is_empty() || player.descriptor.user_id.is_none() { None } else { Some(crate::matches::RlnlPacket { @@ -1399,17 +1399,21 @@ impl CustomGameLogic for BattleArenaLogic { }) }, // RegisterEqualizer - Some(crate::matches::RlnlPacket { - event: rlnl::event_code::NetworkEvent::RegisterEqualizer, - property: literustlib::packet::Property::ReliableOrdered, - data: Box::new(rlnl::events::sync::GetEqualizer { - pos: rlnl::types::PosQuatPair { - pos: (generic.map_config.equalizer.x, generic.map_config.equalizer.y, generic.map_config.equalizer.z).into(), - rot: (0.0, 0.0, 0.0, 0.0).into(), - }, - total_health: self.config.equalizer_health as i32, - }), - }), + if player.descriptor.user_id.is_none() { + None + } else { + Some(crate::matches::RlnlPacket { + event: rlnl::event_code::NetworkEvent::RegisterEqualizer, + property: literustlib::packet::Property::ReliableOrdered, + data: Box::new(rlnl::events::sync::GetEqualizer { + pos: rlnl::types::PosQuatPair { + pos: (generic.map_config.equalizer.x, generic.map_config.equalizer.y, generic.map_config.equalizer.z).into(), + rot: (0.0, 0.0, 0.0, 0.0).into(), + }, + total_health: self.config.equalizer_health as i32, + }), + }) + }, // SetShieldState /*if generic.map_config.bases.contains_key(&0) { Some(crate::matches::RlnlPacket {