コード例 #1
0
ファイル: Server.cs プロジェクト: MCBTay/XLMultiplayer
        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;
            }
        }