예제 #1
0
    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);
        }
    }
예제 #2
0
        public bool Serialize(EnterRoomData data)
        {
            bool ret = true;

            ret &= Serialize(data.roomNum);

            return(ret);
        }
예제 #3
0
    //방 입장 -> 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}");
        }
    }
예제 #5
0
        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);
        }
예제 #6
0
    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!");
    }
예제 #8
0
    //방 입장
    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);
            }
        }
    }