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}");
        }
    }
    private static void UPLOAD_MAP(byte[] bytes)
    {
        // 这个消息会有好多组
        UploadMap input = UploadMap.Parser.ParseFrom(bytes);

        if (input.PackageIndex == 0)
        {                                                                                                        // 第一条此类消息
            mapDataBuffers.Clear();
            ServerRoomManager.Instance.Log($"MSG:UPLOAD_MAP - Begin upload map data! MapName:{input.RoomName}"); // 开始上传地图数据!地图名
        }
        mapDataBuffers.Add(input.MapData.ToByteArray());

        bool ret    = true;
        long roomId = 0;

        if (input.IsLastPackage)
        {// 最后一条此类消息了
            // 生成唯一ID
            roomId = Utils.GuidToLongId();

            int totalSize = 0;
            foreach (var package in mapDataBuffers)
            {
                totalSize += package.Length;
            }

            byte[] totalMapData = new byte[totalSize];
            int    position     = 0;
            foreach (var package in mapDataBuffers)
            {
                Array.Copy(package, 0, totalMapData, position, package.Length);
                position += package.Length;
            }

            PlayerInfo pi = ServerRoomManager.Instance.GetPlayer(_args);
            if (pi == null)
            {
                ServerRoomManager.Instance.Log($"MSG:UPLOAD_MAP Error - Save map data failed! Creator not found! MapName:{input.RoomName}"); // 保存地图数据失败!创建者没有找到!地图名
                ret = false;
            }
            else
            {
                ret = true;
                string tableName = $"MAP:{roomId}";
                ServerRoomManager.Instance.Redis.CSRedis.HSet(tableName, "Creator", pi.Enter.TokenId);
                ServerRoomManager.Instance.Redis.CSRedis.HSet(tableName, "RoomId", roomId);
                ServerRoomManager.Instance.Redis.CSRedis.HSet(tableName, "RoomName", input.RoomName);
                ServerRoomManager.Instance.Redis.CSRedis.HSet(tableName, "MaxPlayerCount", input.MaxPlayerCount);
                ServerRoomManager.Instance.Redis.CSRedis.HSet(tableName, "MapData", totalMapData);
                ServerRoomManager.Instance.Redis.CSRedis.HSet(tableName, "MapDataSize", totalSize);
                ServerRoomManager.Instance.Redis.CSRedis.HSet(tableName, "CreateTime", DateTime.Now);

                ServerRoomManager.Instance.Log($"MSG: UPLOAD_MAP OK - Upload map data and save to redis succeeded! MapName:{input.RoomName} - Total Size:{totalSize}"); // 上传地图数据,并保存到Redis成功!地图名
            }
        }
        UploadMapReply output = new UploadMapReply()
        {
            Ret           = ret,
            IsLastPackage = input.IsLastPackage,
            RoomId        = roomId,
            RoomName      = input.RoomName,
        };

        ServerRoomManager.Instance.SendMsg(_args, ROOM_REPLY.UploadMapReply, output.ToByteArray());
    }