コード例 #1
0
        /// <summary>
        /// This coroutine tries to ackquire the asteroid lock. If we have it spawn the needed asteroids.
        /// It also handles the asteroid track status between clients
        /// </summary>
        /// <returns></returns>
        private IEnumerator CheckAsteroids()
        {
            //TODO: Surround with try catch as other coroutines
            var seconds = new WaitForSeconds(AsteroidCheckInterval);

            while (true)
            {
                if (!Enabled)
                {
                    break;
                }

                //Try to acquire the asteroid-spawning lock if nobody else has it.
                if (!LockSystem.Singleton.LockExists("asteroid"))
                {
                    LockSystem.Singleton.AcquireLock("asteroid");
                }

                //We have the spawn lock, lets do stuff.
                if (LockSystem.Singleton.LockIsOurs("asteroid") && WarpSystem.Singleton.CurrentSubspace == 0 &&
                    Time.timeSinceLevelLoad > 1f && MainSystem.Singleton.GameRunning)
                {
                    var beforeSpawn      = GetAsteroidCount();
                    var asteroidsToSpawn = SettingsSystem.ServerSettings.MaxNumberOfAsteroids - beforeSpawn;
                    for (var asteroidsSpawned = 0; asteroidsSpawned < asteroidsToSpawn; asteroidsSpawned++)
                    {
                        Debug.Log($"[LMP]: Spawning asteroid, have {beforeSpawn + asteroidsSpawned}, need {SettingsSystem.ServerSettings.MaxNumberOfAsteroids}");
                        ScenarioController.SpawnAsteroid();
                        yield return(null); //Resume on next frame
                    }
                }

                //Check for changes to tracking
                foreach (var asteroid in GetCurrentAsteroids().Where(asteroid => asteroid.state != Vessel.State.DEAD))
                {
                    if (!ServerAsteroidTrackStatus.ContainsKey(asteroid.id.ToString()))
                    {
                        ServerAsteroidTrackStatus.Add(asteroid.id.ToString(), asteroid.DiscoveryInfo.trackingStatus.Value);
                    }
                    else
                    {
                        if (asteroid.DiscoveryInfo.trackingStatus.Value != ServerAsteroidTrackStatus[asteroid.id.ToString()])
                        {
                            Debug.Log($"[LMP]: Sending changed asteroid, new state: {asteroid.DiscoveryInfo.trackingStatus.Value}!");
                            ServerAsteroidTrackStatus[asteroid.id.ToString()] = asteroid.DiscoveryInfo.trackingStatus.Value;
                            VesselProtoSystem.Singleton.MessageSender.SendVesselMessage(asteroid);
                        }
                    }
                }

                yield return(seconds);
            }
        }
コード例 #2
0
        /// <summary>
        /// This routine tries to ackquire the asteroid lock. If we have it spawn the needed asteroids.
        /// </summary>
        /// <returns></returns>
        private void CheckAsteroidsToSpawn()
        {
            if (!Enabled || !AsteroidSystemReady)
            {
                return;
            }

            if (LockSystem.LockQuery.AsteroidLockBelongsToPlayer(SettingsSystem.CurrentSettings.PlayerName))
            {
                //We have the spawn lock so spawn some asteroids if there are less than expected
                var beforeSpawn      = GetAsteroidCount();
                var asteroidsToSpawn = SettingsSystem.ServerSettings.MaxNumberOfAsteroids - beforeSpawn;

                if (asteroidsToSpawn > 0)
                {
                    LunaLog.Log($"[LMP]: Spawning {asteroidsToSpawn} asteroids");
                    for (var i = 0; i < asteroidsToSpawn; i++)
                    {
                        ScenarioController?.SpawnAsteroid();
                    }
                }
            }
        }