From cceecb0c3601abf977ff99c62dde6cee5a146fac Mon Sep 17 00:00:00 2001 From: miniduikboot Date: Thu, 20 Jun 2024 22:26:16 +0200 Subject: [PATCH] Clean up owned playerinfo's when disconnecting --- .../Net/State/Game.Outgoing.cs | 10 +++++++++ src/Impostor.Server/Net/State/Game.State.cs | 21 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/Impostor.Server/Net/State/Game.Outgoing.cs b/src/Impostor.Server/Net/State/Game.Outgoing.cs index b0569cc1..6e8dee2f 100644 --- a/src/Impostor.Server/Net/State/Game.Outgoing.cs +++ b/src/Impostor.Server/Net/State/Game.Outgoing.cs @@ -123,5 +123,15 @@ namespace Impostor.Server.Net.State message.EndMessage(); message.EndMessage(); } + + private void WriteObjectDespawn(IMessageWriter message, InnerNetObject obj) + { + message.StartMessage(MessageFlags.GameData); + Code.Serialize(message); + message.StartMessage(GameDataTag.DespawnFlag); + message.WritePacked(obj.NetId); + message.EndMessage(); + message.EndMessage(); + } } } diff --git a/src/Impostor.Server/Net/State/Game.State.cs b/src/Impostor.Server/Net/State/Game.State.cs index e570c98f..e5eeaa08 100644 --- a/src/Impostor.Server/Net/State/Game.State.cs +++ b/src/Impostor.Server/Net/State/Game.State.cs @@ -85,6 +85,27 @@ namespace Impostor.Server.Net.State } }); + // Clean up the PlayerInfo if we own it + foreach (var playerInfo in GameNet.GameData.Players.Values) + { + if (playerInfo.ClientId == playerId) + { + if (playerInfo.OwnerId == ServerOwned) + { + _logger.LogInformation("Destroying PlayerInfo {nid}", playerInfo.NetId); + GameNet.GameData.RemovePlayer(playerInfo.PlayerId); + RemoveNetObject(playerInfo); + + var writer = MessageWriter.Get(MessageType.Reliable); + WriteObjectDespawn(writer, playerInfo); + await SendToAllAsync(writer); + } + + break; + } + + } + return true; }