1
0
mirror of https://git.ngram.ca/OpenJam/rc-servers synced 2026-08-23 23:08:52 +00:00

Add network-layer multiplayer disconnect handling

This commit is contained in:
NG (Graham)
2026-01-07 21:09:38 -05:00
parent 1d0831d307
commit ac9e2a9fcd
10 changed files with 64 additions and 18 deletions

View File

@@ -427,8 +427,8 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
super::GameMessage::NewConnection { user, game_guid, connection, response, sender } => {
self.on_new_connection(user, game_guid, connection, response, sender).await;
},
super::GameMessage::EndConnection { user_id } => {
is_engaged = self.on_end_connection(user_id).await;
super::GameMessage::EndConnection { user_id, is_unregister } => {
is_engaged = self.on_end_connection(user_id, is_unregister).await;
},
super::GameMessage::RequestLeave { user_id } => {
self.on_request_leave(user_id).await;
@@ -569,7 +569,7 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
}
}
async fn on_end_connection(&self, user_id: i32) -> bool {
async fn on_end_connection(&self, user_id: i32, _is_unregister: bool) -> bool {
if let Some(player_id) = self.user_key_by_user_id(user_id) {
let conn_opt = self.users.write().await.remove(&player_id);
if let Some(conn) = conn_opt {
@@ -642,7 +642,14 @@ impl <L: super::CustomGameLogic> GenericGamemodeEngine<L> {
}
}
}
true
for user in self.descriptors.values() {
if user.descriptor.user_id.is_none() { continue; } // skip non-players
let mode = ConnectionMode::from_u8(user.state.mode.load(std::sync::atomic::Ordering::Relaxed));
if !matches!(mode, ConnectionMode::Disconnected) {
return true;
}
}
false
}
async fn on_request_leave(&self, user_id: i32) {