private void UpdateAllClients() { if (_knownPlayers.Count < 1) { return; // no need to update a single player on his own location (or should we? perhaps later). } //create the snapshot once and then send to all players ServerSnapshotPacket snapshot = new ServerSnapshotPacket(); snapshot.Players = _nextPlayerId; snapshot.X = new int[snapshot.Players]; snapshot.Y = new int[snapshot.Players]; //suboptimal LINQ query for snapshot data.. fill the snapshot for (int i = 0; i < snapshot.Players; i++) { var p = _knownPlayers.Values.Where(x => x.PlayerNumber == (i + 1)).FirstOrDefault(); if (p == null) { break; } ; snapshot.X[i] = p.PlayerLocation.X; snapshot.Y[i] = p.PlayerLocation.Y; } foreach (var client in _knownPlayers.Values) { //send a snapshot to every player if (client._clientRef.ConnectionState == ConnectionState.Connected) { _packetProcessor.Send <ServerSnapshotPacket>(client._clientRef, snapshot, DeliveryMethod.ReliableOrdered); } } }
public void SnapshotHandler(ServerSnapshotPacket sp) { if (sp != null) { Console.Write($"Server snapshot!:"); for (int i = 0; i < sp.Players; i++) { Console.Write($"P[{i+1}] is X{sp.X[i]},Y{sp.Y[i]}"); //update all players var players = _allPlayers(); players[i].Location = new Point(sp.X[i], sp.Y[i]); players[i].IsPresent = true; } Console.Write("\n"); } }