private static void ProcessMessage(byte[] buffer, byte fromID, NetworkingSockets server) { if (!Enum.IsDefined(typeof(OpCode), (OpCode)buffer[0]) || players[fromID] == null) { return; } players[fromID].timeoutWatch.Restart(); switch ((OpCode)buffer[0]) { case OpCode.Settings: Thread usernameThread = new Thread(new ParameterizedThreadStart(Server.HandleUsername)); usernameThread.IsBackground = true; usernameThread.Start(Tuple.Create(buffer, fromID)); break; case OpCode.Texture: { Console.WriteLine("Received Texture from " + fromID); Player player = players[fromID]; if (player != null && player.playerID == fromID) { player.AddGear(buffer); if (player.allGearUploaded) { foreach (Player player2 in players) { if (player2 != null && player2.playerID != fromID) { foreach (KeyValuePair <string, byte[]> value in player.gear) { server.SendMessageToConnection(player2.connection, value.Value, SendFlags.Reliable); } server.FlushMessagesOnConnection(player2.connection); } } } } } break; case OpCode.Animation: if (players[fromID] != null) { bool reliable = buffer[buffer.Length - 1] == (byte)1 ? true : false; buffer[buffer.Length - 1] = fromID; foreach (Player player in players) { if (player != null && player.playerID != fromID) { ConnectionStatus status = new ConnectionStatus(); if (server.GetQuickConnectionStatus(player.connection, ref status)) { int bytesPending = status.pendingReliable + status.sentUnackedReliable; if (reliable && bytesPending >= MAX_BYTES_PENDING) { Console.WriteLine($"Sending animation unreliably to ({player.playerID}) because pending bytes is higher than max"); reliable = false; } } server.SendMessageToConnection(player.connection, buffer, reliable ? SendFlags.Reliable | SendFlags.NoNagle : SendFlags.Unreliable | SendFlags.NoNagle); } } } break; case OpCode.Chat: string contents = ASCIIEncoding.ASCII.GetString(buffer, 1, buffer.Length - 1); Console.WriteLine("Chat Message from {0} saying: {1}", fromID, contents); byte[] sendBuffer = new byte[buffer.Length + 1]; Array.Copy(buffer, 0, sendBuffer, 0, buffer.Length); sendBuffer[buffer.Length] = fromID; foreach (Player player in players) { if (player != null) { server.SendMessageToConnection(player.connection, sendBuffer, SendFlags.Reliable); } } break; case OpCode.MapVote: if (ENFORCE_MAPS) { string vote = ASCIIEncoding.ASCII.GetString(buffer, 1, buffer.Length - 1); if (mapList.ContainsKey(vote) || vote.ToLower().Equals("current")) { vote = mapList.ContainsKey(vote) && mapList[vote].Equals(currentMapHash) ? "current" : vote; players[fromID].currentVote = vote; Console.WriteLine("{0} voted for the map {1}", fromID, mapList.ContainsKey(vote) ? mapList[vote] : vote); } } break; case OpCode.StillAlive: if (players[fromID] != null) { server.SendMessageToConnection(players[fromID].connection, buffer, SendFlags.Unreliable | SendFlags.NoNagle); } break; } }