Skip to content

Commit b239f2a

Browse files
committed
fixed connection_killer.rs merge issues
1 parent 061388f commit b239f2a

File tree

2 files changed

+64
-84
lines changed

2 files changed

+64
-84
lines changed

src/bin/src/systems/connection_killer.rs

Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -12,58 +12,62 @@ pub fn connection_killer(
1212
&StreamWriter,
1313
&PlayerIdentity,
1414
&mut DisconnectHandle,
15-
)>, // Mutable query
15+
)>,
1616
mut cmd: Commands,
1717
state: Res<GlobalStateResource>,
1818
) {
1919
while let Some((disconnecting_entity, reason)) = state.0.players.disconnection_queue.pop() {
20-
let entity_result = query.get(disconnecting_entity);
21-
match entity_result {
22-
Ok(disconnecting_player) => {
23-
for (entity, conn, player_identity, mut disconnect_handle) in query.iter_mut() {
24-
if disconnecting_entity == entity {
25-
info!(
26-
"Player {} ({}) disconnected: {}",
27-
player_identity.username,
28-
player_identity.uuid,
29-
reason.as_deref().unwrap_or("No reason")
20+
let disconnecting_player_identity = query
21+
.get(disconnecting_entity)
22+
.ok()
23+
.map(|(_, _, identity, _)| identity.clone());
24+
25+
if disconnecting_player_identity.is_none() {
26+
warn!("Player's entity has already been removed");
27+
continue;
28+
}
29+
30+
let disconnecting_player_identity = disconnecting_player_identity.unwrap();
31+
32+
for (entity, conn, player_identity, mut disconnect_handle) in query.iter_mut() {
33+
if disconnecting_entity == entity {
34+
info!(
35+
"Player {} ({}) disconnected: {}",
36+
player_identity.username,
37+
player_identity.uuid,
38+
reason.as_deref().unwrap_or("No reason")
39+
);
40+
if conn.running.load(std::sync::atomic::Ordering::Relaxed) {
41+
trace!(
42+
"Sending disconnect packet to player {}",
43+
player_identity.username
44+
);
45+
if let Err(e) = conn.send_packet_ref(
46+
&ferrumc_net::packets::outgoing::disconnect::DisconnectPacket {
47+
reason: TextComponent::from(
48+
reason.as_deref().unwrap_or("Disconnected"),
49+
),
50+
},
51+
) {
52+
warn!(
53+
"Failed to send disconnect packet to player {}: {:?}",
54+
player_identity.username, e
3055
);
31-
if conn.running.load(std::sync::atomic::Ordering::Relaxed) {
32-
trace!(
33-
"Sending disconnect packet to player {}",
34-
player_identity.username
35-
);
36-
if let Err(e) = conn.send_packet_ref(
37-
&ferrumc_net::packets::outgoing::disconnect::DisconnectPacket {
38-
reason: TextComponent::from(
39-
reason.as_deref().unwrap_or("Disconnected"),
40-
),
41-
},
42-
) {
43-
warn!(
44-
"Failed to send disconnect packet to player {}: {:?}",
45-
player_identity.username, e
46-
);
47-
}
48-
if let Some(sender) = disconnect_handle.sender.take() {
49-
if let Err(_) = sender.send(()) {
50-
trace!("Failed to send disconnect signal (receiver already dropped)");
51-
}
52-
}
53-
} else {
54-
trace!(
55-
"Connection for player {} is not running, skipping disconnect packet",
56-
player_identity.username
57-
);
56+
}
57+
if let Some(sender) = disconnect_handle.sender.take() {
58+
if sender.send(()).is_err() {
59+
trace!("Failed to send disconnect signal (receiver already dropped)");
5860
}
59-
} else {
60-
system_messages::player_leave::handle(disconnecting_player.2, entity);
6161
}
62-
cmd.entity(entity).despawn();
62+
} else {
63+
trace!(
64+
"Connection for player {} is not running, skipping disconnect packet",
65+
player_identity.username
66+
);
6367
}
64-
}
65-
Err(e) => {
66-
warn!("Player's entity has already been removed: {}", e);
68+
cmd.entity(entity).despawn();
69+
} else {
70+
system_messages::player_leave::handle(&disconnecting_player_identity, entity);
6771
}
6872
}
6973
}

src/lib/net/src/connection.rs

Lines changed: 16 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -269,31 +269,28 @@ pub async fn handle_connection(
269269

270270
// Read next packet
271271
let mut packet_skele;
272-
'play_receive: loop {
273-
tokio::select! {
274-
packet_result = PacketSkeleton::new(&mut tcp_reader, login_result.compression, Play) => {
275-
match packet_result {
276-
Ok(packet) => {
277-
packet_skele = packet;
278-
break 'play_receive
279-
},
280-
Err(err) => {
281-
if let NetError::ConnectionDropped = err {
282-
trace!("Connection dropped for entity {:?}", entity);
283-
running.store(false, Ordering::Relaxed);
284-
break 'recv;
285-
}
286-
error!("Failed to read packet skeleton: {:?} for {:?}", err, entity);
272+
tokio::select! {
273+
packet_result = PacketSkeleton::new(&mut tcp_reader, login_result.compression, Play) => {
274+
match packet_result {
275+
Ok(packet) => {
276+
packet_skele = packet;
277+
},
278+
Err(err) => {
279+
if let NetError::ConnectionDropped = err {
280+
trace!("Connection dropped for entity {:?}", entity);
287281
running.store(false, Ordering::Relaxed);
288282
break 'recv;
289283
}
284+
error!("Failed to read packet skeleton: {:?} for {:?}", err, entity);
285+
running.store(false, Ordering::Relaxed);
286+
break 'recv;
290287
}
291288
}
289+
}
292290

293-
_ = &mut disconnect_receiver => {
294-
debug!("Received disconnect signal");
295-
break 'recv;
296-
}
291+
_ = &mut disconnect_receiver => {
292+
debug!("Received disconnect signal");
293+
break 'recv;
297294
}
298295
}
299296

@@ -333,24 +330,3 @@ pub async fn handle_connection(
333330

334331
Ok(())
335332
}
336-
337-
impl StreamWriter {
338-
/// Gracefully closes the connection, optionally sending a disconnect reason packet.
339-
///
340-
/// Note: This does not despawn the associated ECS entity. The caller
341-
/// is responsible for removing the entity separately.
342-
pub fn kill(&self, reason: Option<String>) -> Result<(), NetError> {
343-
self.running.store(false, Ordering::Relaxed);
344-
if let Err(err) = self.send_packet(crate::packets::outgoing::disconnect::DisconnectPacket {
345-
reason: ferrumc_text::TextComponent::from(reason.unwrap_or("Disconnected".to_string())),
346-
}) {
347-
if matches!(err, NetError::ConnectionDropped) {
348-
trace!("Connection already dropped, skipping disconnect packet");
349-
} else {
350-
error!("Failed to send disconnect packet: {:?}", err);
351-
return Err(err);
352-
}
353-
}
354-
Ok(())
355-
}
356-
}

0 commit comments

Comments
 (0)