await SendObjectSpawnAsync(playerInfo);
}
+ private async ValueTask DespawnPlayerInfoAsync(InnerPlayerInfo playerInfo)
+ {
+ if (playerInfo.OwnerId == ServerOwned)
+ {
+ _logger.LogDebug("Despawning PlayerInfo {nid}", playerInfo.NetId);
+ GameNet.GameData.RemovePlayer(playerInfo.PlayerId);
+ RemoveNetObject(playerInfo);
+
+ await SendObjectDespawnAsync(playerInfo);
+ }
+ }
+
private bool AddNetObject(InnerNetObject obj)
{
if (_allObjectsFast.ContainsKey(obj.NetId))
using System;
+using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Impostor.Api.Games;
player.Value.Limbo = LimboStates.PreSpawn;
}
+ // Delete all PlayerInfo objects
+ foreach (var playerInfo in GameNet.GameData.Players.Values.ToArray())
+ {
+ await DespawnPlayerInfoAsync(playerInfo);
+ }
+
await _eventManager.CallAsync(new GameEndedEvent(this, gameOverReason));
}
writer.EndMessage();
await FinishGameDataAsync(writer, targetClientId);
}
+
+ private async ValueTask SendObjectDespawnAsync(InnerNetObject obj, int? targetClientId = null)
+ {
+ using var writer = StartGameData(targetClientId);
+ writer.StartMessage(GameDataTag.DespawnFlag);
+ writer.WritePacked(obj.NetId);
+ writer.EndMessage();
+ await FinishGameDataAsync(writer, targetClientId);
+ }
}
}
}
});
+ // Clean up the PlayerInfo if we own it and we're still in the lobby
+ if (GameState == GameStates.NotStarted)
+ {
+ var playerInfo = GameNet.GameData.PlayersByClientId[playerId];
+ await DespawnPlayerInfoAsync(playerInfo);
+ }
+
return true;
}