Пример #1
0
        public override void OnStart(StartState state)
        {
            base.OnStart(state);
            if (!HighLogic.LoadedSceneIsFlight)
            {
                return;
            }

            // Get the part modules
            moduleAsteroid = part.vessel.FindPartModuleImplementing <ModuleAsteroid>();
            moduleComet    = part.vessel.FindPartModuleImplementing <ModuleComet>();
            if (moduleAsteroid != null)
            {
                spaceObjectInfo = moduleAsteroid.part.FindModuleImplementing <ModuleSpaceObjectInfo>();
            }
            else if (moduleComet != null)
            {
                spaceObjectInfo = moduleComet.part.FindModuleImplementing <ModuleSpaceObjectInfo>();
            }

            if (spaceObjectInfo != null && originalMass < 0)
            {
                originalMass = spaceObjectInfo.currentMassVal;
                previousMass = originalMass;
            }

            // Setup storage capacity
            if (currentStorageCapacity > 0)
            {
                adjustedVolume = currentStorageCapacity;
            }
            else
            {
                currentStorageCapacity = adjustedVolume;
                previousMass           = spaceObjectInfo.currentMassVal;
            }

            getAbundances();

            // If we have no resources in the part and we have storage capacity then show the initial resources button.
            Events["SetObjectResources"].guiActive = part.Resources.Count == 0 || debugMode;

            GameEvents.OnResourceConverterOutput.Add(OnResourceConverterOutput);

            if (part.Resources.Count > 0)
            {
                ResourceScenario.Instance.gameSettings.MaxDeltaTime = 3600;
            }
        }
        private static bool MineAsteroidComet(IResourceManager resMan, ModuleSpaceObjectInfo spaceObjectInfo, List <ModuleSpaceObjectResource> asteroidCometResources, double drillSize, double effectiveness, double percentPower)
        {
            // TODO - can we add a bonus multiplier here? Perhaps based on asteroid mass?
            double bonusMultiplier = 0.05; // 0.0005
            double minedAmount     = bonusMultiplier * drillSize * effectiveness * percentPower;

            minedAmount = Math.Min(minedAmount, (spaceObjectInfo.currentMassVal - spaceObjectInfo.massThresholdVal));
            if (minedAmount < 1e-6)
            {
                spaceObjectInfo.currentMassVal = spaceObjectInfo.massThresholdVal;
                return(false);
            }

            foreach (var resource in asteroidCometResources)
            {
                var def = PartResourceLibrary.Instance.GetDefinition(resource.resourceName);
                if (def == null)
                {
                    continue;
                }

                var amount = (minedAmount * resource.abundance) * def.density;

                if (amount == 0)
                {
                    continue;
                }

                var resId = KITResourceSettings.NameToResource(resource.resourceName);
                resMan.Produce(resId, amount);
            }

            spaceObjectInfo.currentMassVal = Math.Max(spaceObjectInfo.massThresholdVal, spaceObjectInfo.currentMassVal - (minedAmount * resMan.FixedDeltaTime()));

            return(true);
        }