예제 #1
0
파일: BaseLobby.cs 프로젝트: jraicr/MST
        public virtual bool StartGame()
        {
            if (IsDestroyed)
            {
                return(false);
            }

            string region = "";

            propertiesList.Set(MstDictKeys.ROOM_IS_PUBLIC, false);

            // Extract the region if available
            if (propertiesList.Has(MstDictKeys.ROOM_REGION))
            {
                region = propertiesList.AsString(MstDictKeys.ROOM_REGION);
            }

            var task = Module.SpawnersModule.Spawn(propertiesList, region, GenerateOptions());

            if (task == null)
            {
                BroadcastChatMessage("Servers are busy", true);
                return(false);
            }

            State = LobbyState.StartingGameServer;

            SetGameSpawnTask(task);

            return(true);
        }
예제 #2
0
        /// <summary>
        /// Start process on spawner side with given spawn <paramref name="options"/>, <paramref name="region"/> and <paramref name="customOptions"/>
        /// </summary>
        /// <param name="options"></param>
        /// <param name="region"></param>
        /// <param name="customOptions"></param>
        /// <returns></returns>
        public virtual SpawnTask Spawn(MstProperties options, string region, MstProperties customOptions)
        {
            // Get registered spawner by options and region
            var spawners = GetFilteredSpawners(options, region);

            if (spawners.Count == 0)
            {
                logger.Warn($"No spawner was returned after filtering. Region: {options.AsString(MstDictKeys.ROOM_REGION, "International")}");
                return(null);
            }

            // Order from least busy server
            var orderedSpawners  = spawners.OrderByDescending(s => s.CalculateFreeSlotsCount());
            var availableSpawner = orderedSpawners.FirstOrDefault(s => s.CanSpawnAnotherProcess());

            // Ignore, if all of the spawners are busy
            if (availableSpawner == null)
            {
                return(null);
            }

            return(Spawn(options, customOptions, availableSpawner));
        }