@@ -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