Skip to content

Commit e566534

Browse files
author
Sunnickel
committed
removed useless allocations and bug that would've removed only the first player in the queue
1 parent ce29677 commit e566534

File tree

1 file changed

+42
-46
lines changed

1 file changed

+42
-46
lines changed

src/bin/src/systems/connection_killer.rs

Lines changed: 42 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -11,59 +11,55 @@ pub fn connection_killer(
1111
mut cmd: Commands,
1212
state: Res<GlobalStateResource>,
1313
) {
14-
let mut disconnecting_player: Option<(Entity, &StreamWriter, &PlayerIdentity)> = None;
1514
while let Some((disconnecting_entity, reason)) = state.0.players.disconnection_queue.pop() {
16-
if query.contains(disconnecting_entity) && disconnecting_player.is_none() {
17-
let entity_result = query.get(disconnecting_entity);
18-
19-
match entity_result {
20-
Ok(player_result) => {
21-
disconnecting_player = Some(player_result);
22-
}
23-
Err(e) => {
24-
disconnecting_player = None;
25-
trace!("Disconnecting player not in query: {}", e);
26-
}
27-
}
28-
}
29-
30-
for (entity, conn, player_identity) in query.iter() {
31-
if disconnecting_entity == entity {
32-
info!(
33-
"Player {} ({}) disconnected: {}",
34-
player_identity.username,
35-
player_identity.uuid,
36-
reason.as_deref().unwrap_or("No reason")
37-
);
38-
if conn.running.load(std::sync::atomic::Ordering::Relaxed) {
39-
trace!(
40-
"Sending disconnect packet to player {}",
41-
player_identity.username
42-
);
43-
if let Err(e) = conn.send_packet_ref(
44-
&ferrumc_net::packets::outgoing::disconnect::DisconnectPacket {
45-
reason: TextComponent::from(
46-
reason.as_deref().unwrap_or("Disconnected"),
47-
),
48-
},
49-
) {
50-
warn!(
51-
"Failed to send disconnect packet to player {}: {:?}",
52-
player_identity.username, e
15+
let entity_result = query.get(disconnecting_entity);
16+
match entity_result {
17+
Ok(disconnecting_player) => {
18+
for (entity, conn, player_identity) in query.iter() {
19+
if disconnecting_entity == entity {
20+
info!(
21+
"Player {} ({}) disconnected: {}",
22+
player_identity.username,
23+
player_identity.uuid,
24+
reason.as_deref().unwrap_or("No reason")
5325
);
54-
}
55-
} else {
56-
trace!(
26+
if conn.running.load(std::sync::atomic::Ordering::Relaxed) {
27+
trace!(
28+
"Sending disconnect packet to player {}",
29+
player_identity.username
30+
);
31+
if let Err(e) = conn.send_packet_ref(
32+
&ferrumc_net::packets::outgoing::disconnect::DisconnectPacket {
33+
reason: TextComponent::from(
34+
reason.as_deref().unwrap_or("Disconnected"),
35+
),
36+
},
37+
) {
38+
warn!(
39+
"Failed to send disconnect packet to player {}: {:?}",
40+
player_identity.username, e
41+
);
42+
}
43+
} else {
44+
trace!(
5745
"Connection for player {} is not running, skipping disconnect packet",
5846
player_identity.username
5947
);
48+
}
49+
} else {
50+
if disconnecting_player.is_some() {
51+
system_messages::player_leave::handle(
52+
disconnecting_player.unwrap().2,
53+
entity,
54+
);
55+
}
56+
}
57+
cmd.entity(entity).despawn();
6058
}
61-
} else {
62-
if disconnecting_player.is_some() {
63-
system_messages::player_leave::handle(disconnecting_player.unwrap().2, entity);
64-
}
6559
}
66-
cmd.entity(entity).despawn();
60+
Err(e) => {
61+
warn!("Player's entity has already been removed: {}", e);
62+
}
6763
}
6864
}
6965
}

0 commit comments

Comments
 (0)