コード例 #1
0
        public static Int16 FindRoomID(this ThePalaceEntities dbContext, Int16 roomID = (Int16)0, bool isAuthorized = false)
        {
            var maxRoomOccupancy = ConfigManager.GetValue <int>("MaxRoomOccupancy", 45);
            var entryRoomIDKeys  = ServerState.entryRoomIDs.ToArray();
            var roomCacheKeys    = ServerState.roomsCache.Keys.ToArray();
            var fullRoomIDs      = new List <Int16>();

            var roomIDs = dbContext.Rooms.AsNoTracking()
                          .OrderBy(r => r.OrderID)
                          .Select(r => r.RoomId)
                          .ToList();

            Func <bool> findRoom = () =>
            {
                if (roomID != 0)
                {
                    var roomCount = isAuthorized ? 0 : SessionManager.GetRoomUserCount(roomID);

                    try
                    {
                        if (
                            isAuthorized ||
                            (entryRoomIDKeys.Contains(roomID) && !roomCacheKeys.Contains(roomID)) ||
                            (roomCacheKeys.Contains(roomID) && ServerState.roomsCache[roomID].MaxOccupancy == 0 && roomCount < maxRoomOccupancy) ||
                            (roomCacheKeys.Contains(roomID) && (ServerState.roomsCache[roomID].MaxOccupancy > 0) && roomCount < ServerState.roomsCache[roomID].MaxOccupancy))
                        {
                            return(true);
                        }
                    }
                    catch (Exception ex)
                    {
                        ex.DebugLog();
                    }

                    fullRoomIDs.Add(roomID);
                }

                return(false);
            };

            if (roomID > 0)
            {
                if (findRoom())
                {
                    return(roomID);
                }
            }

            while (true)
            {
                entryRoomIDKeys = ServerState.entryRoomIDs
                                  .Where(r => !fullRoomIDs.Contains(r))
                                  .ToArray();
                roomCacheKeys = ServerState.roomsCache.Keys
                                .Where(r => !fullRoomIDs.Contains(r))
                                .ToArray();

                if (entryRoomIDKeys.Length > 0)
                {
                    roomID = entryRoomIDKeys[RndGenerator.NextSecure((uint)entryRoomIDKeys.Length)];

                    if (findRoom())
                    {
                        return(roomID);
                    }
                }
                else if (roomCacheKeys.Length > 0)
                {
                    roomID = roomCacheKeys[RndGenerator.NextSecure((uint)roomCacheKeys.Length)];

                    if (findRoom())
                    {
                        return(roomID);
                    }
                }
                else
                {
                    roomID = roomIDs
                             .Where(ID => !fullRoomIDs.Contains(ID))
                             .FirstOrDefault();

                    if (roomID == 0)
                    {
                        break;
                    }
                    else
                    {
                        var room = dbContext.GetRoom(roomID);
                        if (!room.NotFound)
                        {
                            if (findRoom())
                            {
                                return(roomID);
                            }
                        }
                    }
                }
            }

            return(0);
        }