コード例 #1
0
    /// <summary>
    /// 客户端发送给服务器 同步玩家帧信息,如 player.syncFrameId
    /// </summary>
    public void OnNextFrameEvent(NextFrameOpts _nextFrameOpts)
    {
        int seatId = _nextFrameOpts.SeatId;
        //同步player信息
        GamePlayerInfo player = players.Find(p => p.SeatId == seatId);

        if (player == null)
        {
            return;
        }

        //同步客户端已同步帧id
        if (player.SyncFrameId < _nextFrameOpts.FrameId - 1)
        {
            player.SetSyncFrameId(_nextFrameOpts.FrameId - 1);
        }
        //客户端发送的帧id未达到最新帧,丢弃
        if (_nextFrameOpts.FrameId != frameId)
        {
            return;
        }
        nextFrameOpt.SetFrameId(_nextFrameOpts.FrameId);

        for (int i = 0; i < _nextFrameOpts.optsCount; i++)
        {
            //Console.WriteLine("收到:..." + _nextFrameOpts.GetOpts(i).SeatId);
            nextFrameOpt.AddOpts(_nextFrameOpts.GetOpts(i));
        }
    }
コード例 #2
0
ファイル: BaseGame.cs プロジェクト: tuita520/LockstepPlatform
        //net status
        public void OnPlayerReconnect(GamePlayerInfo playerInfo)
        {
            var localId = _userId2LocalId[playerInfo.UserId];
            var player  = CreatePlayer(playerInfo, localId);

            Players[localId] = player;
        }
コード例 #3
0
ファイル: User.cs プロジェクト: CrispyServal/GameOff2020
        ////////////////////////////////////// 响应 ////////////////////////////////////
        private void LoginResponse(bool send, DecodeRspResult res, Action <ResponseEvent> callback)
        {
            if (send)
            {
                UserStatus.SetStatus(UserStatus.StatusType.Logout);
            }

            var rsp = (LoginRsp)res.Body;
            var eve = new ResponseEvent(res.RspWrap1.ErrCode, res.RspWrap1.ErrMsg, res.RspWrap1.Seq, rsp);

            Debugger.Log("LoginResponse {0}", eve);

            NetClient.HandleSuccess(eve.Code, () => {
                if (eve.Code == ErrCode.EcOk)
                {
                    RequestHeader.AuthKey  = rsp.Token;
                    RequestHeader.PlayerId = rsp.PlayerId;
                    var messageData        = rsp;

                    // 更新状态
                    UserStatus.SetStatus(UserStatus.StatusType.Login);

                    // 设置 PlayerInfo
                    if (string.IsNullOrEmpty(GamePlayerInfo.GetInfo().Id))
                    {
                        GamePlayerInfo.SetInfo(messageData.PlayerId);
                    }
                }
            });
            UserStatus.SetErrCode(eve.Code, eve.Msg);
            callback?.Invoke(eve);
        }
コード例 #4
0
ファイル: Net.cs プロジェクト: moto2002/FrameLock
        private int GetReadyCode(ProtoCmd subcmd)
        {
            if (!SdkStatus.IsInited() && subcmd != ProtoCmd.ECmdLoginReq)
            {
                // 发送失败: 没有初始化 (login不需要初始化)
                var info = new PlayerInfo {
                    Id = ""
                };
                GamePlayerInfo.SetInfo(info);
                UserStatus.SetStatus(UserStatus.StatusType.Logout);
                return(ErrCode.EcSdkUninit);
            }

            // 检测 socket
            if (Socket == null || string.IsNullOrEmpty(Socket.Url))
            {
                return((int)QAppProtoErrCode.EcSdkSendFail);
            }

            if (!UserStatus.IsStatus(UserStatus.StatusType.Login) && subcmd != ProtoCmd.ECmdLoginReq && subcmd != ProtoCmd.ECmdLogoutReq)
            {
                return((int)QAppProtoErrCode.EcSdkNoLogin);
            }

            if (Socket.Id == (int)ConnectionType.Relay && !CheckLoginStatus.IsChecked() &&
                (subcmd == ProtoCmd.ECmdRelaySendFrameReq || subcmd == ProtoCmd.ECmdRelayRequestFrameReq ||
                 subcmd == ProtoCmd.ECmdHeartBeatReq || subcmd == ProtoCmd.ECmdRelayClientSendtoGamesvrReq))
            {
                return((int)QAppProtoErrCode.EcSdkNoCheckLogin);
            }

            // 发送消息
            return(0);
        }
コード例 #5
0
    public override bool HandleMessage()
    {
        GamePlayerInfo msg = GetParam <GamePlayerInfo>(0);

        Program.EnterRoom(msg);
        return(true);
    }
コード例 #6
0
    public static PacketDistributed CreatePacket(MessageID packetID)
    {
        PacketDistributed packet = null;

        switch (packetID)
        {
        case MessageID.GCErrorBack: { packet = new GCErrorBack(); } break;

        case MessageID.CGheartbeatClientSend: { packet = new CGheartbeatClientSend(); } break;

        case MessageID.GCheartbeatServerBack: { packet = new GCheartbeatServerBack(); } break;

        case MessageID.GCServerMsg: { packet = new GCServerMsg(); } break;

        case MessageID.OptionEvent: { packet = new OptionEvent(); } break;

        case MessageID.FrameOpts: { packet = new FrameOpts(); } break;

        case MessageID.LogicFrame: { packet = new LogicFrame(); } break;

        case MessageID.NextFrameOpts: { packet = new NextFrameOpts(); } break;

        case MessageID.GamePlayerInfo: { packet = new GamePlayerInfo(); } break;

        case MessageID.EnterGame: { packet = new EnterGame(); } break;
        }
        if (null != packet)
        {
            packet.packetID = packetID;
        }
        //netActionTime = DateTime.Now.ToFileTimeUtc();
        return(packet);
    }
コード例 #7
0
    public override void OnLobbyServerSceneLoadedForPlayer(NetworkManager manager, GameObject lobbyPlayer, GameObject gamePlayer)
    {
        LobbyPlayer    lobby  = lobbyPlayer.GetComponent <LobbyPlayer>();
        GamePlayerInfo player = gamePlayer.GetComponent <GamePlayerInfo>();
        PlayerColor    pc     = gamePlayer.GetComponent <PlayerColor>();

        player.playerName = lobby.playerName;
        pc.color          = lobby.playerColor;
    }
コード例 #8
0
    public void AddPlayer(GamePlayerInfo player)
    {
        GamePlayerInfo ret = players.Find(p => p.SeatId == player.SeatId);

        if (ret != null)
        {
            players.Remove(ret);
        }
        players.Add(player);
        Console.WriteLine("player 个数: " + players.Count + " seatId:" + player.SeatId);
    }
コード例 #9
0
 private void OnCollisionEnter(Collision o)
 {
     if (!isServer)
     {
         return;
     }
     if (o.gameObject.GetComponent <GamePlayerInfo>() != null)
     {
         lastHit = o.gameObject.GetComponent <GamePlayerInfo>();
     }
 }
コード例 #10
0
ファイル: BaseGame.cs プロジェクト: tuita520/LockstepPlatform
        Player CreatePlayer(GamePlayerInfo playerInfo, byte localId)
        {
            var player = Pool.Get <Player>();

            player.UserId    = playerInfo.UserId;
            player.Account   = playerInfo.Account;
            player.LoginHash = playerInfo.LoginHash;
            player.LocalId   = localId;
            player.Game      = this;
            return(player);
        }
コード例 #11
0
            public int CheckAndGetUserLocalId(GamePlayerInfo user)
            {
                if (userId2LocalId.TryGetValue(user.UserId, out var id))
                {
                    if (Players[id].LoginHash == user.LoginHash)
                    {
                        return(id);
                    }
                }

                return(-1);
            }
コード例 #12
0
    /// <summary>
    /// 发送未同步的帧
    /// </summary>
    /// <param name="player"></param>
    public void SendUnsyncFrames(GamePlayerInfo player)
    {
        //发送消息给客户端
        LogicFrame logicFrame = new LogicFrame();

        logicFrame.SetFrameId(frameId);

        for (int i = player.SyncFrameId + 1; i < matchFrames.Count; i++)
        {
            logicFrame.AddUnSyncFrames(matchFrames[i]);
        }


        //TODO
        //UDP发送消息给客户端
        //upd_send_cmd(Stype.Logic,Cmd.eLogicFrame,body)
        Program.SendMessage(MessageID.LogicFrame, logicFrame);
    }
コード例 #13
0
 public void CmdRespawn()
 {
     if (isSpawning)
     {
         return;
     }
     if (lastHit != null)
     {
         lastHit.score++;
         Leaderboard.instance.AddScore(playerName, 1);
         lastHit = null;
     }
     else
     {
         score--;
         Leaderboard.instance.AddScore(playerName, -1);
     }
     RpcRespawn();
 }
コード例 #14
0
ファイル: RoomUtil.cs プロジェクト: moto2002/FrameLock
        public void SetRoomInfo(RoomInfo roomInfo)
        {
            // if(roomInfo!=null) Debugger.Log("setRoomInfo {0}", roomInfo.PlayerList);
            if (roomInfo == null)
            {
                roomInfo = new RoomInfo();
            }
            var oldRoomInfo = _room.RoomInfo ?? new RoomInfo();

            _room.RoomInfo = roomInfo;

            // 更新玩家信息
            if (_room.IsInRoom())
            {
                foreach (var info in _room.RoomInfo.PlayerList.Where(info => info.Id == RequestHeader.PlayerId))
                {
                    GamePlayerInfo.SetInfo((PlayerInfo)info);
                    break;
                }
            }

            // 重置帧广播信息:
            // 1 切换房间
            // 2 不存在房间id
            // 3 不在房间中
            // 4 房间的开始帧同步时间发生变化
            if (!oldRoomInfo.Id.Equals(_room.RoomInfo.Id) || string.IsNullOrEmpty(_room.RoomInfo.Id) || !_room.IsInRoom() || oldRoomInfo.StartGameTime != this._room.RoomInfo.StartGameTime)
            {
                _room.RoomBroadcast?.FrameBroadcastFrameIdReset(0);
            }

            // 激活第二条链接
            if (_room.RoomInfo != null && _room.RoomInfo.PlayerList != null)
            {
                if (_room.RoomInfo.PlayerList.Any(info => Listener.IsMe(info.Id)))
                {
                    this.ActiveFrame();
                }
            }
            _room.OnUpdate(this._room);
        }
コード例 #15
0
    void Start()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else if (Instance != this)
        {
            Destroy(gameObject);
            Destroy(this);
            return;
        }
        DontDestroyOnLoad(gameObject);
        SceneManager.activeSceneChanged += OnSceneChange;

        NetworkTransport.Init();
        ConnectionConfig config = new ConnectionConfig();

        tcpID = config.AddChannel(QosType.Reliable);
        udpID = config.AddChannel(QosType.Unreliable);

        int          maxConnections = 10;
        HostTopology topology       = new HostTopology(config, maxConnections);

        socketID = NetworkTransport.AddHost(topology, socketPort); // Creates a socket

        seed = System.DateTime.Now.Millisecond;                    //Creating level generating seed.
        LevelGenerator.Seed = seed;

        GamePlayerInfo hostGPI = new GamePlayerInfo(-1);

        hostGPI.username = username;
        playerInfos.Add(hostGPI); //Add host player

        stopwatch = System.Diagnostics.Stopwatch.StartNew();

        StartCoroutine(PingGameSession()); //Start pinging game session.

        Debug.Log("Our socket ID is: " + socketID);
    }
コード例 #16
0
ファイル: GameManager.cs プロジェクト: Lunedrashia/IceBrawl
    public void ShowScoreboard()
    {
        if (scoreboard.activeInHierarchy)
        {
            return;
        }
        clockUI.SetActive(false);
        scoreUI.SetActive(false);
        GameObject[] p       = GameObject.FindGameObjectsWithTag("Player");
        int          pAmount = p.Length;

        GamePlayerInfo[] d = new GamePlayerInfo[p.Length];
        for (int i = 0; i < pAmount; i++)
        {
            int highest      = 0;
            int scoreHighest = -9999;
            for (int j = 0; j < p.Length; j++)
            {
                if (p[j] != null && p[j].GetComponent <GamePlayerInfo>().score > scoreHighest)
                {
                    highest      = j;
                    scoreHighest = p[j].GetComponent <GamePlayerInfo>().score;
                }
            }
            d[i]       = p[highest].GetComponent <GamePlayerInfo>();
            p[highest] = null;
        }
        int k = 0;

        foreach (GamePlayerInfo player in d)
        {
            playersNameInScoreboard[k].text = player.playerName;
            k++;
        }
        scoreboard.SetActive(true);
        PlayTadaSound();
        Invoke("BackToMenu", 10);
    }
コード例 #17
0
ファイル: User.cs プロジェクト: CrispyServal/GameOff2020
        private static void LogoutResponse(bool send, DecodeRspResult res, Action <ResponseEvent> callback)
        {
            var wrap1 = res.RspWrap1;
            var eve   = new ResponseEvent(wrap1.ErrCode, wrap1.ErrMsg, wrap1.Seq, null);

            Debugger.Log("LogoutResponse {0}", eve);

            void HandleSuccess()
            {
                RequestHeader.AuthKey  = null;
                RequestHeader.PlayerId = null;

                UserStatus.SetStatus(UserStatus.StatusType.Logout);

                var playerInfo = new PlayerInfo {
                    Id = null
                };

                GamePlayerInfo.SetInfo(playerInfo);
            }

            NetClient.HandleSuccess(eve.Code, HandleSuccess);
            callback?.Invoke(eve);
        }
コード例 #18
0
        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);
                    }
                }
            }
                                );
        }
コード例 #19
0
        /// <summary>
        /// 接收发送给本机ip对应端口号的数据报
        /// </summary>
        //static void ReciveMsg()
        //{
        //    while (true)
        //    {
        //        EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号
        //        clientPoint = point;
        //        byte[] buffer = new byte[1024 * 10];
        //        int length = server.ReceiveFrom(buffer, ref point);//接收数据报
        //        string message = Encoding.UTF8.GetString(buffer, 0, length);
        //        dataParse.ParseData(message);
        //    }
        //}


        //////////////////////////游戏功能 start//////////////////////////////////


        //进入房间
        public static void EnterRoom(GamePlayerInfo p)
        {
            battleMgr.AddPlayer(p);
        }
コード例 #20
0
    void Update()
    {
        if (!dialogBox && SceneManager.GetActiveScene() == SceneManager.GetSceneByName("Game"))
        {
            dialogBox = GameObject.Find("Canvas").transform.Find("DialogBox").gameObject;
            yesButton = GameObject.Find("Canvas").transform.Find("DialogBox/YesButton").GetComponent <Button>();
            noButton  = GameObject.Find("Canvas").transform.Find("DialogBox/NoButton").GetComponent <Button>();
            yesButton.onClick.AddListener(SetEndGameBool);
            noButton.onClick.AddListener(ChangeToLobby);
        }
        if (AllReady)
        {
            AllReady = false;
            //Debug.Log(AllReady);
            gameStarted = true;
            StartCoroutine(checkIfCamMove());
        }

        if (inGameReady)
        {
            bool allReady = true;
            //Debug.Log(inGameReady);
            foreach (GamePlayerInfo p in playerInfos)
            {
                if (!p.GetReady())
                {
                    allReady = false;
                    break;
                }
            }
            if (allReady)
            {
                inGameReady = false;
                SendToClients("start: ", tcpID);
                AllReady = true;
                Dying    = false;
            }
        }

        if (clientReady && Ready)
        {
            Ready = false;

            CreateAnimatorList();
            Debug.Log(playerAnims);
            playerAnimators = playerAnims.Split(',').Select(int.Parse).ToList();
            SendToClients("anim: " + playerAnims, tcpID);
            SceneManager.LoadScene("Game");
        }

        if (gameStarted)
        {
            CheckIfWinner();
        }

        NetworkEventType recData = NetworkEventType.DataEvent;

        while (recData != NetworkEventType.Nothing)
        {
            recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);

            switch (recData)
            {
            case NetworkEventType.Nothing:
                break;

            case NetworkEventType.ConnectEvent:
                Debug.Log("incoming connection event received");

                GamePlayerInfo gpi = new GamePlayerInfo(connectionId);
                playerInfos.Add(gpi);
                if (gameStarted)
                {
                    gpi.SetInGame(false);
                    Debug.Log("specator");
                }
                else
                {
                    gpi.SetInGame(true);
                    Debug.Log("joiner");
                }

                Util.SendSocketMessage(socketID, connectionId, tcpID, "pnum: " + (playerInfos.Count - 1)); // Send player which player they are.
                Util.SendSocketMessage(socketID, connectionId, tcpID, "seed: " + seed);                    // Random seed for generation. TODO

                StartCoroutine(SetNumPlayers());

                // Update clients with how many players there are.
                Debug.Log(playerInfos.Count + "PinfoCount");
                inGamePlayersCount = 0;
                foreach (GamePlayerInfo p in playerInfos)
                {
                    if (p.GetInGame())
                    {
                        inGamePlayersCount++;
                    }
                }
                Debug.Log("inGamePlayersCount" + inGamePlayersCount);
                SendToClients("nump: " + playerInfos.Count, tcpID);
                SendToClients("numi: " + inGamePlayersCount, tcpID);

                if (gameStarted)
                {
                    Util.SendSocketMessage(socketID, connectionId, tcpID, "spectate: " + playerAnims);
                }


                break;

            case NetworkEventType.DataEvent:
                Stream          stream    = new MemoryStream(recBuffer);
                BinaryFormatter formatter = new BinaryFormatter();
                string          message   = formatter.Deserialize(stream) as string;
                //Debug.Log("incoming message event received: " + message);

                if (message.Contains("h: ") && gameStarted)
                {
                    long  horizTimestamp = long.Parse(message.Split(':')[1].Trim());    // Timestamp associated with this horizontal input msg.
                    float remoteHoriz    = float.Parse(message.Split(':')[2].Trim());

                    GamePlayerInfo clientGPI = getGamePlayerInfo(connectionId);
                    if (horizTimestamp > clientGPI.lastHorizTimestamp)
                    {
                        clientGPI.lastHorizTimestamp = horizTimestamp;
                        if (clientGPI.GetPlayer())
                        {
                            clientGPI.GetPlayer().RemotePlayerHorizontal = remoteHoriz;
                        }
                    }
                }
                else if (message.Contains("Ready"))
                {
                    clientReady = true;
                }
                else if (message.Contains("name: "))       // Username of client
                {
                    string playerNames = "pnames: ";
                    for (int i = 0; i < playerInfos.Count; i++)
                    {
                        if (playerInfos[i].GetConnectionID() == connectionId)
                        {
                            playerInfos[i].username = message.Replace("name: ", "");
                        }

                        playerNames += playerInfos[i].username;

                        if (playerInfos[i].username.Length > 0)     // No phantom players
                        {
                            LobbyManager.Instance.GetServerByName(GameHost.username).AddPlayer(new PlayerInfo(playerInfos[i].username, "Joined"));
                        }

                        if (i != playerInfos.Count - 1)
                        {
                            playerNames += ",";
                        }
                    }

                    SendToClients(playerNames, tcpID);
                }
                else if (message.Contains("dead: "))
                {
                    if (gameStarted)
                    {
                        int deadPlayerNum = Int32.Parse(message.Replace("dead: ", ""));
                        if (deadPlayerNum != 0)
                        {
                            //Debug.Log(deadPlayerNum);
                            playerInfos[deadPlayerNum].SetDead(true);
                            SendToClients("dead: " + deadPlayerNum, tcpID);
                            CheckIfWinner();
                        }
                    }
                }
                else if (message.Contains("start: "))
                {
                    Debug.Log("received start");
                    playerInfos[int.Parse(message.Replace("start: ", ""))].SetReady(true);
                }

                if (message.Contains("msg:"))
                {
                    SendToClients(message, tcpID);

                    string actualMsg = message.Replace("msg:", "");
                    Chatbox.Instance.ShowMessage(actualMsg);
                }

                break;

            case NetworkEventType.DisconnectEvent:
                Debug.Log("remote client event disconnected");
                int pnum = 0;
                for (int i = 0; i < playerInfos.Count; i++)
                {
                    if (playerInfos[i].GetConnectionID() == connectionId)
                    {
                        pnum = i;
                        playerInfos.RemoveAt(i);     // Removes client connection ID
                        break;
                    }
                }

                SendToClients("dc: " + pnum, tcpID);
                break;
            }
        }

        SendGameState();

        if (gameStarted)
        {
            if (playerInfos[0].GetPlayer())
            {
                playerInfos[0].GetPlayer().LocalPlayerHorizontal = Input.GetAxis("Horizontal");
            }
            //TODO artificial lag.
            if (dead)
            {
                dead = false;
                Debug.Log("Dying");
                Dying = true;
                playerInfos[0].SetDead(true);
                //MoveCamOnDeath();
                CheckIfWinner();
            }
        }
    }
コード例 #21
0
    public static void Execute(object p)
    {
        GamePlayerInfo msg = p as GamePlayerInfo;

        NetMsgManager.Instance.HandleMessage(MessageID.GamePlayerInfo, msg);
    }