/// <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)); } }
//net status public void OnPlayerReconnect(GamePlayerInfo playerInfo) { var localId = _userId2LocalId[playerInfo.UserId]; var player = CreatePlayer(playerInfo, localId); Players[localId] = player; }
////////////////////////////////////// 响应 //////////////////////////////////// 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); }
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); }
public override bool HandleMessage() { GamePlayerInfo msg = GetParam <GamePlayerInfo>(0); Program.EnterRoom(msg); return(true); }
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); }
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; }
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); }
private void OnCollisionEnter(Collision o) { if (!isServer) { return; } if (o.gameObject.GetComponent <GamePlayerInfo>() != null) { lastHit = o.gameObject.GetComponent <GamePlayerInfo>(); } }
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); }
public int CheckAndGetUserLocalId(GamePlayerInfo user) { if (userId2LocalId.TryGetValue(user.UserId, out var id)) { if (Players[id].LoginHash == user.LoginHash) { return(id); } } return(-1); }
/// <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); }
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(); }
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); }
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); }
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); }
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); }
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); } } } ); }
/// <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); }
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(); } } }
public static void Execute(object p) { GamePlayerInfo msg = p as GamePlayerInfo; NetMsgManager.Instance.HandleMessage(MessageID.GamePlayerInfo, msg); }