static void ASK_JOIN_ROOM_REPLY(byte[] bytes) { UIManager.Instance.EndConnecting(); AskJoinRoomReply input = AskJoinRoomReply.Parser.ParseFrom(bytes); if (input.Ret) { // 根据大厅传递回来的RoomServer的地址,链接RoomServer // 这个类是Room场景初始化的时候,GameRoomManager需要的数据,因为跨场景了,所以需要一个全局的地方进行传递 EnterRoomData roomData = new EnterRoomData() { Address = input.RoomServerAddress, Port = input.RoomServerPort, RoomId = input.RoomId, IsCreatingRoom = false, // 加入房间 }; ClientManager.Instance.EnterRoom = roomData; // 正式进入房间了。。。加载Room场景 ClientManager.Instance.StateMachine.TriggerTransition(ConnectionFSMStateEnum.StateEnum.CONNECTING_ROOM); ClientManager.Instance.LobbyManager.Log($"MSG: ASK_JOIN_ROOM_REPLY OK - 大厅回复可以加入房间。RoomServer:{roomData.Address}:{roomData.Port} - Room Name:{roomData.RoomId}"); } else { string msg = $"大厅发现没有多余的房间服务器可以分配!"; UIManager.Instance.SystemTips(msg, PanelSystemTips.MessageType.Error); ClientManager.Instance.LobbyManager.Log("MSG: ASK_JOIN_ROOM_REPLY - Error " + msg); } }
public bool Serialize(EnterRoomData data) { bool ret = true; ret &= Serialize(data.roomNum); return(ret); }
//방 입장 -> Server public void EnterRoom(int roomNum) { Debug.Log("방 입장 : " + roomNum); EnterRoomData enterRoomData = new EnterRoomData(roomNum); EnterRoomPacket enterRoomPacket = new EnterRoomPacket(enterRoomData); enterRoomPacket.SetPacketId((int)ClientPacketId.EnterRoom); DataPacket packet = new DataPacket(CreatePacket(enterRoomPacket), null); sendMsgs.Enqueue(packet); }
public void CreateJoinRoom(EnterRoomData roomData) { Debug.Log("GameRoomManager CreateJoinRoom() Begin..."); if (roomData.IsCreatingRoom) {// 创建房间流程 Log($"MSG: CreateJoinRoom - 创建房间:{roomData.RoomName}"); // 把地图数据上传到房间服务器保存。后面的和加入房间一样了。 BinaryReader reader = HexmapHelper.BeginLoadBuffer(roomData.RoomName); if (reader != null) { const int CHUNK_SIZE = 900; byte[] bytes = new byte[CHUNK_SIZE]; int size = CHUNK_SIZE; bool isFileEnd = false; int index = 0; while (!isFileEnd) { if (!HexmapHelper.LoadBuffer(reader, out bytes, ref size, ref isFileEnd)) { Log($"Load Buffer Failed - {roomData.RoomName}"); } UploadMap output = new UploadMap() { RoomName = roomData.RoomName, MaxPlayerCount = roomData.MaxPlayerCount, MapData = ByteString.CopyFrom(bytes), PackageIndex = index++, IsLastPackage = isFileEnd, }; SendMsg(ROOM.UploadMap, output.ToByteArray()); } Log($"MSG: 发送地图数据 - 地图名:{roomData.RoomName} - Total Size:{reader.BaseStream.Length}"); HexmapHelper.EndLoadBuffer(ref reader); } } else {// 直接申请进入房间 // 发出EnterRoom消息,进入房间 EnterRoom output = new EnterRoom() { RoomId = roomData.RoomId, }; SendMsg(ROOM.EnterRoom, output.ToByteArray()); Log($"MSG: CreateJoinRoom - 申请进入房间:{roomData.RoomName}"); } }
public bool Deserialize(ref EnterRoomData element) { if (GetDataSize() == 0) { // 데이터가 설정되지 않았다. return(false); } bool ret = true; byte roomNum = 0; ret &= Deserialize(ref roomNum); element.roomNum = roomNum; return(ret); }
private void EnterRoom(string roomName = "broadcast") { var obj = new EnterRoomData() { Mode = "EnterRoom", RoomName = roomName, }; Debug.Log($"Entering room ({roomName})"); if (ws.IsAlive) { ws.Send(JsonUtility.ToJson(obj)); Debug.Log($"Entered room ({roomName})"); } else { Debug.Log($"Failed to enter room ({roomName})"); } }
IEnumerator DownloadDataFiles() { // 这个函数仅在单独调试房间服务器的时候才被调用, 所以做如下判定 // 单独运行本场景的时候,CliengtManager不存在 if (ClientManager.Instance != null) { yield break; } yield return(StartCoroutine(CsvDataManager.LoadDataAllAndroid())); CommandManager.LoadCommands(); roomData = new EnterRoomData(); { long defaultRoomId = 0; // 从[server_config]表里读取服务器地址和端口 var csv = CsvDataManager.Instance.GetTable("server_config_client"); if (csv != null) { _address = csv.GetValue(1, "RoomServerAddress"); _port = csv.GetValueInt(1, "RoomServerPort"); defaultRoomId = csv.GetValueLong(1, "DefaultRoomId"); } roomData.Address = _address; roomData.Port = _port; roomData.RoomName = "遗落の战境3"; roomData.IsCreatingRoom = false; roomData.RoomId = defaultRoomId; } // 读取了数据表才能开始连接房间服务器 Log($"GameRoomManager.Start()! 开始链接RoomServer - {_address}:{_port}"); Connect(); //初始化结束 Debug.Log("GameRoomManager DowloadDataFiles - OK!"); }
//방 입장 public void EnterRoom(DataPacket packet) { Console.WriteLine(packet.client.RemoteEndPoint.ToString() + "방 입장"); EnterRoomPacket enterRoomPacket = new EnterRoomPacket(packet.msg); EnterRoomData enterRoomData = enterRoomPacket.GetData(); string id = ""; try { id = loginUser[packet.client]; } catch { Console.WriteLine("현재 로그인 되어있지 않은 아이디 입니다."); return; } int characterId = userState[id].characterId; if (characterId == -1) { Console.WriteLine("캐릭터가 선택되지 않았습니다."); return; } int result = -1; try { Console.WriteLine(enterRoomData.RoomNum + "번 방에 " + packet.client.RemoteEndPoint.ToString() + "유저 입장"); result = roomManager.Room[enterRoomData.RoomNum].AddPlayer(packet.client, database.GetHeroData(id, characterId)); if (result != -1) { userState[id].state = enterRoomData.RoomNum; } } catch { Console.WriteLine("DataHandler::EnterRoom.AddPlayer 에러"); result = -1; } if (result == -1) { return; } RoomNumberData resultData = new RoomNumberData(result); RoomNumberPacket resultPacket = new RoomNumberPacket(resultData); resultPacket.SetPacketId((int)ServerPacketId.EnterRoomNumber); byte[] msg = CreatePacket(resultPacket); packet = new DataPacket(msg, packet.client); lock (sendLock) { sendMsgs.Enqueue(packet); } for (int playerIndex = 0; playerIndex < RoomManager.maxPlayerNum; playerIndex++) { if (roomManager.Room[enterRoomData.RoomNum].Socket[playerIndex] != null && playerIndex != result) { packet = new DataPacket(new byte[0], roomManager.Room[enterRoomData.RoomNum].Socket[playerIndex]); RequestRoomUserData(packet); } } }