private Task HandleUpdate(DatagramSocket socket, NetworkPacket packet) { if (packet != null) { switch (packet.Type) { case PacketType.Entity: _updateQueue.Add(packet as EntityPacket); break; case PacketType.GameServerDataUpdate: GameServerDataUpdate update = packet as GameServerDataUpdate; _playerList = update.PlayerList; _gameData = update.GameData; break; case PacketType.ShipCommand: _gameInstance.GameModel.InputManager.ProcessRemoteInput(packet as ShipCommand); break; case PacketType.DeadEntities: DeadEntitiesPacket newlyDead = packet as DeadEntitiesPacket; _updateQueue._deadEntities.AddRange(newlyDead.EntityList); break; } } return(Task.Delay(0)); }
// TODO: I don't like doing this on a timer... it can fall behind and start stepping on itself, leading // to crashes. internal async void SyncTimer(object stateInfo) { foreach (PlayerData player in _playerList.Values) { if (player != null && _gameData.HostID != player.PlayerID) { await SyncPlayer(player.PlayerID); } GameServerDataUpdate update = new GameServerDataUpdate(_playerList, _gameData); await SendUDPPacketToPlayer(player, update); } }