@@ -4,8 +4,8 @@ use bvh::{Aabb, Bvh};
44use bytes:: Bytes ;
55use glam:: I16Vec2 ;
66use hyperion_proto:: {
7- ArchivedSetReceiveBroadcasts , ArchivedUnicast , ArchivedUpdatePlayerChunkPositions ,
8- ChunkPosition ,
7+ ArchivedSetReceiveBroadcasts , ArchivedShutdown , ArchivedUnicast ,
8+ ArchivedUpdatePlayerChunkPositions , ChunkPosition ,
99} ;
1010use rustc_hash:: FxBuildHasher ;
1111use tracing:: { Instrument , debug, error, info_span, instrument, warn} ;
@@ -19,8 +19,6 @@ use crate::{
1919pub struct Egress {
2020 // todo: can we do some type of EntityId and SlotMap
2121 player_registry : & ' static papaya:: HashMap < u64 , PlayerHandle , FxBuildHasher > ,
22-
23- // todo: remove positions when player leaves
2422 positions : & ' static papaya:: HashMap < u64 , ChunkPosition , FxBuildHasher > ,
2523}
2624
@@ -81,7 +79,7 @@ impl Egress {
8179
8280 // imo it makes sense to read once... it is a fast loop
8381 #[ allow( clippy:: significant_drop_in_scrutinee) ]
84- for ( player_id , player) in & players {
82+ for ( _ , player) in & players {
8583 if !player. can_receive_broadcasts ( ) {
8684 continue ;
8785 }
@@ -91,9 +89,7 @@ impl Egress {
9189
9290 if let Err ( e) = player. send ( to_send) {
9391 warn ! ( "Failed to send data to player: {:?}" , e) ;
94- if let Some ( result) = players. remove ( player_id) {
95- result. shutdown ( ) ;
96- }
92+ player. shutdown ( ) ;
9793 }
9894 }
9995 }
@@ -107,12 +103,10 @@ impl Egress {
107103
108104 tokio:: spawn (
109105 async move {
110- for ( id , player) in & players {
106+ for ( _ , player) in & players {
111107 if let Err ( e) = player. send ( OrderedBytes :: FLUSH ) {
112108 warn ! ( "Failed to send data to player: {:?}" , e) ;
113- if let Some ( result) = players. remove ( id) {
114- result. shutdown ( ) ;
115- }
109+ player. shutdown ( ) ;
116110 }
117111 }
118112 }
@@ -171,9 +165,7 @@ impl Egress {
171165
172166 if let Err ( e) = player. send ( to_send) {
173167 warn ! ( "Failed to send data to player: {:?}" , e) ;
174- if let Some ( result) = players. remove ( id) {
175- result. shutdown ( ) ;
176- }
168+ player. shutdown ( ) ;
177169 }
178170 }
179171 }
@@ -202,16 +194,14 @@ impl Egress {
202194
203195 let Some ( player) = players. get ( & id) else {
204196 // expected to still happen infrequently
205- debug ! ( "Player not found for id {id:?}" ) ;
197+ warn ! ( "Player not found for id {id:?}" ) ;
206198 return ;
207199 } ;
208200
209201 // todo: handle error; kick player if cannot send (buffer full)
210202 if let Err ( e) = player. send ( ordered) {
211203 warn ! ( "Failed to send data to player: {:?}" , e) ;
212- if let Some ( result) = players. remove ( & id) {
213- result. shutdown ( ) ;
214- }
204+ player. shutdown ( ) ;
215205 }
216206
217207 drop ( players) ;
@@ -230,4 +220,17 @@ impl Egress {
230220
231221 player. enable_receive_broadcasts ( ) ;
232222 }
223+
224+ #[ instrument( skip_all) ]
225+ pub fn handle_shutdown ( & self , pkt : & ArchivedShutdown ) {
226+ let player_registry = self . player_registry ;
227+ let players = player_registry. pin ( ) ;
228+ let Ok ( stream) = rkyv:: deserialize :: < u64 , !> ( & pkt. stream ) ;
229+
230+ if let Some ( result) = players. get ( & stream) {
231+ result. shutdown ( ) ;
232+ } else {
233+ error ! ( "Player not found for stream {stream:?}" ) ;
234+ }
235+ }
233236}
0 commit comments