예제 #1
0
        public static HostGameRequest Deserialize(HazelBinaryReader reader)
        {
            var result = new HostGameRequest();

            result.gameOptions = GameOptionsData.Deserialize(reader.ReadBytesAndSize());
            return(result);
        }
예제 #2
0
        public static GetGameListV2Request Deserialize(HazelBinaryReader reader)
        {
            var msg = new GetGameListV2Request();

            reader.ReadPackedInt32(); // Hardcoded 0.
            msg.options = GameOptionsData.Deserialize(reader.ReadBytesAndSize());
            return(msg);
        }
예제 #3
0
        public static RpcSyncSettings Deserialize(HazelBinaryReader reader)
        {
            var msg = new RpcSyncSettings();

            var body = reader.ReadBytesToEnd();

            msg.gameOptions = GameOptionsData.Deserialize(body);

            return(msg);
        }
예제 #4
0
 public static void Deserialize(IMessageReader reader, GameOptionsData gameOptionsData)
 {
     gameOptionsData.Deserialize(reader.ReadBytesAndSize());
 }
예제 #5
0
 public static GameOptionsData Deserialize(MessageReader reader)
 {
     return(GameOptionsData.Deserialize(reader.ReadBytesAndSize()));
 }
예제 #6
0
 public static void Deserialize(MessageReader reader, out GameOptionsData options)
 {
     reader.ReadPackedInt32(); // Hardcoded 0.
     options = GameOptionsData.Deserialize(reader.ReadBytesAndSize());
 }
예제 #7
0
파일: Client.cs 프로젝트: zneix/Impostor
        private void OnMessageReceived(MessageReader message, SendOption sendOption)
        {
            var flag = (RequestFlag)message.Tag;

            Logger.Verbose("[{0}] Server got {1}.", Id, flag);

            switch (flag)
            {
            case RequestFlag.HostGame:
            {
                // Read game settings.
                var gameInfoBytes = message.ReadBytesAndSize();
                var gameInfo      = GameOptionsData.Deserialize(gameInfoBytes);

                // Create game.
                var game = _gameManager.Create(this, gameInfo);
                if (game == null)
                {
                    Connection.Send(new Message1DisconnectReason(DisconnectReason.ServerFull));
                    return;
                }

                // Code in the packet below will be used in JoinGame.
                using (var writer = MessageWriter.Get(SendOption.Reliable))
                {
                    writer.StartMessage(0);
                    writer.Write(game.Code);
                    writer.EndMessage();

                    Connection.Send(writer);
                }
                break;
            }

            case RequestFlag.JoinGame:
            {
                var gameCode = message.ReadInt32();
                var unknown  = message.ReadByte();
                var game     = _gameManager.Find(gameCode);
                if (game == null)
                {
                    Connection.Send(new Message1DisconnectReason(DisconnectReason.GameMissing));
                    return;
                }

                game.HandleJoinGame(Player);
                break;
            }

            case RequestFlag.StartGame:
            {
                if (!IsPacketAllowed(message, true))
                {
                    return;
                }

                Player.Game.HandleStartGame(message);
                break;
            }

            // No idea how this flag is triggered.
            case RequestFlag.RemoveGame:
                break;

            case RequestFlag.RemovePlayer:
            {
                if (!IsPacketAllowed(message, true))
                {
                    return;
                }

                var playerId = message.ReadPackedInt32();
                var reason   = message.ReadByte();

                Player.Game.HandleRemovePlayer(playerId, (DisconnectReason)reason);
                break;
            }

            case RequestFlag.GameData:
            case RequestFlag.GameDataTo:
            {
                if (!IsPacketAllowed(message, false))
                {
                    return;
                }

                // Broadcast packet to all other players.
                using (var writer = MessageWriter.Get(sendOption))
                {
                    if (flag == RequestFlag.GameDataTo)
                    {
                        var target = message.ReadPackedInt32();
                        writer.CopyFrom(message);
                        Player.Game.SendTo(writer, target);
                    }
                    else
                    {
                        writer.CopyFrom(message);
                        Player.Game.SendToAllExcept(writer, Player);
                    }
                }
                break;
            }

            case RequestFlag.EndGame:
            {
                if (!IsPacketAllowed(message, true))
                {
                    return;
                }

                Player.Game.HandleEndGame(message);
                break;
            }

            case RequestFlag.AlterGame:
            {
                if (!IsPacketAllowed(message, true))
                {
                    return;
                }

                if (message.ReadByte() != (byte)AlterGameTags.ChangePrivacy)
                {
                    return;
                }

                var isPublic = message.ReadByte() == 1;

                Player.Game.HandleAlterGame(message, Player, isPublic);
                break;
            }

            case RequestFlag.KickPlayer:
            {
                if (!IsPacketAllowed(message, true))
                {
                    return;
                }

                var playerId = message.ReadPackedInt32();
                var isBan    = message.ReadBoolean();

                Player.Game.HandleKickPlayer(playerId, isBan);
                break;
            }

            default:
                Logger.Warning("Server received unknown flag {0}.", flag);
                break;
            }

            if (flag != RequestFlag.GameData &&
                flag != RequestFlag.GameDataTo &&
                flag != RequestFlag.EndGame &&
                message.Position < message.Length)
            {
                Logger.Warning("Server did not consume all bytes from {0} ({1} < {2}).",
                               flag,
                               message.Position,
                               message.Length);
            }
        }