Exemple #1
0
        public void OpenRecordFile(string path)
        {
            var bytes     = File.ReadAllBytes(path);
            var reader    = new Deserializer(Compressor.Decompress(bytes));
            var TypeId    = reader.GetInt32();
            var RoomId    = reader.GetInt32();
            var Seed      = reader.GetInt32();
            var AllActors = reader.GetBytes_255();
            var msg       = new Msg_RepMissFrame();

            msg.startTick = 0;
            msg.Deserialize(reader);
            var msgStartGame = new Msg_L2C_StartGame();

            //msgStartGame.RoomID = RoomId;
            //msgStartGame.Seed = Seed;
            //msgStartGame.AllActors = AllActors;
            //msgStartGame.SimulationSpeed = 60;
            //MaxRunTick = msg.frames.Length + 1;
            IsVideoMode = true;
            framesInfo  = msg;
            gameInfo    = msgStartGame;
        }
        protected void C2L_StartGame(IIncommingMessage reader)
        {
            var msg = reader.Parse <Msg_C2L_StartGame>();

            Debug.Log("C2L_StartGame" + msg);
            var user = reader.Peer.GetExtension <User>();

            if (user == null)
            {
                return;
            }
            var room = user.Room;

            if (room?.Owner != user)
            {
                reader.Respond(1, EResponseStatus.Failed);
                return;
            }

            if (room.IsPlaying || _allGameServers.Count <= 0)
            {
                reader.Respond(room.IsPlaying ? 2 : 3, EResponseStatus.Failed);
                return;
            }

            var gameHash    = "game" + LRandom.Next();
            var playerInfos = new GamePlayerInfo[room.Users.Count];

            for (int i = 0; i < room.Users.Count; i++)
            {
                var pUser = room.Users[i];
                playerInfos[i] = new GamePlayerInfo()
                {
                    UserId    = pUser.UserId,
                    Account   = pUser.Account,
                    LoginHash = pUser.LoginHash,
                };
            }

            //TODO 使用平衡策略去获取服务器
            var server = _allGameServers[LRandom.Next(_allGameServers.Count)];

            server?.SendMessage((short)EMsgLS.L2G_CreateGame, new Msg_L2G_CreateGame()
            {
                GameType = user.GameType,
                Players  = playerInfos,
                MapId    = room.MapId,
                RoomId   = room.RoomId,
                GameHash = gameHash
            }, (status, response) => {
                if (status != EResponseStatus.Failed)
                {
                    var ipInfo      = server.GetExtension <ServerIpInfo>();
                    room.ServerPeer = server;
                    room.IsPlaying  = true;
                    room.GameHash   = gameHash;
                    var retMsg      = new Msg_L2C_StartGame()
                    {
                        GameServerEnd = new IPEndInfo()
                        {
                            Ip   = ipInfo.Ip,
                            Port = ipInfo.Port
                        },
                        GameHash    = gameHash,
                        RoomId      = room.RoomId,
                        GameId      = response.AsInt(),
                        IsReconnect = false
                    };
                    Log(" Msg_L2C_StartGame" + retMsg);
                    foreach (var roomUser in room.Users)
                    {
                        roomUser.Peer?.SendMessage((short)EMsgSC.L2C_StartGame, retMsg);
                    }
                }
            }
                                );
        }