Пример #1
0
        void enableDecoupler(IntegratedDecoupler id, ModuleToggleCrossfeed crossfeedToggleModule)
        {
            KSPActionParam kap = null;

            base.enabled = true;
            if (id.decouplerModule != null)
            {
                id.decouplerModule.SetStaging(true);
                id.decouplerModule.Events["ToggleStaging"].guiActiveEditor        = true; // Only seen when AdvancedTweakables is enabled
                id.decouplerModule.Fields["ejectionForcePercent"].guiActiveEditor = true;
                id.decouplerModule.enabled = true;
                //id.decouplerModule.stagingEnabled = true;
                if (integratedDecoupler == DecouplerType.Enabled)
                {
                    id.decouplerModule.SetStaging(true);
                }
                else
                {
                    id.decouplerModule.SetStaging(false);
                }
                if (crossfeedToggleModule != null)
                {
                    crossfeedToggleModule.DisableAction(kap);
                }

                // if (decouplerModule.part != null)
                SetToggleName(id.pmEvents);
                //id.pmEvents["ToggleIntegratedDecoupler"].guiName = "Integrated Decoupler";
                id.decouplerModule.Events["ToggleStaging"].guiActiveEditor = true;
                id.decouplerModule.Events["ToggleStaging"].guiActiveEditor = false;
                id.part.UpdateStageability(true, true);
            }
        }
Пример #2
0
        /// <summary>
        /// run whenever part is created (used in editor), which in the editor is as soon as part list is clicked or symmetry count increases
        /// </summary>
        void Start()
        {
            crossfeedToggleModule = part.FindModuleImplementing <ModuleToggleCrossfeed>();
            if (crossfeedToggleModule == null)
            {
                Log.Info("Missing ModuleToggleCrossfeed in part: " + this.part.partInfo.title);

                Events["ToggleBiDirectional"].active          = false;
                Events["ToggleBiDirectional"].guiActive       = false;
                Events["ToggleBiDirectional"].guiActiveEditor = false;
                return;
            }
            isActive = true;
            if (crossfeedToggleModule.crossfeedStatus)
            {
                crossfeedToggleModule.ToggleEvent();
            }
            GameEvents.onEditorShipModified.Add(onEditorShipModified);
            GameEvents.onVesselWasModified.Add(onVesselWasModified);

#if true
            crossfeedToggleModule.Events["ToggleEvent"].guiActive = false;
            crossfeedToggleModule.Events["ToggleEvent"].active    = false;
            crossfeedToggleModule.Actions["ToggleAction"].active  = false;
            crossfeedToggleModule.Actions["EnableAction"].active  = false;
            crossfeedToggleModule.Actions["DisableAction"].active = false;
#endif

            if (!HighLogic.LoadedSceneIsEditor)
            {
                return;
            }

            zAwake();
            this.part.OnEditorAttach += new Callback(UpdateOnEditorAttach);
            this.part.OnEditorDetach += new Callback(UpdateOnEditorDetach);

            if (base.part.partInfo == null || base.part.partInfo.partPrefab == null)
            {
                this.defaultCrossfeedType = FuelFlowtype.none;
            }

            if (!this.moduleIsEnabled)
            {
                CrossfeedType = defaultCrossfeedType;
            }
        }
Пример #3
0
        /// <summary>
        /// Set the decoupler status
        /// </summary>
        /// <param name="status"></param>
        /// <param name="symIntegratedDecoupler"></param>
        void SetStatus(DecouplerType status, IntegratedDecoupler symIntegratedDecoupler)
        {
            Part counterpart = symIntegratedDecoupler.part;

            ModuleToggleCrossfeed symCrossfeedToggleModule = counterpart.FindModuleImplementing <ModuleToggleCrossfeed>();

            symIntegratedDecoupler.integratedDecoupler = status;
            if (integratedDecoupler != DecouplerType.none)
            {
                enableDecoupler(symIntegratedDecoupler, symCrossfeedToggleModule);
            }
            else
            {
                disableDecoupler(symIntegratedDecoupler, symCrossfeedToggleModule);
            }

            SetEvents(status, symIntegratedDecoupler.decouplerModule, symCrossfeedToggleModule);
        }
Пример #4
0
        void SetEvents(DecouplerType decouplerType, ModuleDecouple decouplerModule, ModuleToggleCrossfeed crossfeedToggleModule)
        {
            bool status = (decouplerType != DecouplerType.none);

            crossfeedToggleModule.Events["ToggleEvent"].guiActive = status;
            crossfeedToggleModule.Events["ToggleEvent"].active    = status;
            crossfeedToggleModule.Actions["ToggleAction"].active  = status;
            crossfeedToggleModule.Actions["EnableAction"].active  = status;
            crossfeedToggleModule.Actions["DisableAction"].active = status;

            //crossfeedToggleModule.Actions["ToggleStaging"].active = false;
#if false
            if (decouplerModule != null &&
                (topNode != null || topNode01 != null || topNode02 != null))
            {
                decouplerModule.part.UpdateStageability(true, true);
            }
            else
            {
                Log.Error("No ModuleDecouple to update");
            }
#endif
        }
Пример #5
0
        void disableDecoupler(IntegratedDecoupler id, ModuleToggleCrossfeed crossfeedToggleModule)
        {
            KSPActionParam kap = null;

            if (id.decouplerModule != null)
            {
                id.decouplerModule.SetStaging(false);
                id.decouplerModule.Events["ToggleStaging"].guiActiveEditor        = false; // Only seen when AdvancedTweakables is enabled
                id.decouplerModule.Fields["ejectionForcePercent"].guiActiveEditor = false;
                id.decouplerModule.enabled = false;
                //id.decouplerModule.stagingEnabled = false;
                id.SetStaging(false);

                if (part != null && part.Modules != null)
                {
                    foreach (PartModule m in part.Modules)
                    {
                        if (!ReferenceEquals(m, id.decouplerModule))
                        {
                            m.SetStaging(false);
                            m.Events["ToggleStaging"].guiActiveEditor = false;
                        }
                    }
                }

                if (crossfeedToggleModule != null)
                {
                    crossfeedToggleModule.EnableAction(kap);
                }

                //if (decouplerModule.part != null  && decouplerModule.part.Events != null)
                //id.pmEvents["ToggleIntegratedDecoupler"].guiName = "No decoupler";
                SetToggleName(id.pmEvents);
                id.decouplerModule.Events["ToggleStaging"].guiActiveEditor = false;
                id.part.UpdateStageability(true, true);
            }
        }
Пример #6
0
        private string GetPartInfo(Part part)
        {
            // Rebuilding the global part stats string :
            string basicInfo = "<color=#acfffc>";

            // Basic part stats in blue (note : added dry mass)
            float dryMass = part.mass + part.GetModuleMass(part.mass, ModifierStagingSituation.CURRENT);

            basicInfo += (part.GetResourceMass() < Single.Epsilon) ?
                         "<b>Mass: </b>" + dryMass.ToString("0.###") + "t\n" :
                         "<b>Mass: </b>" + (dryMass + part.GetResourceMass()).ToString("0.###") + "t (<b>Dry mass: </b>" + dryMass.ToString("0.###") + "t)\n";
            basicInfo +=
                "<b>Tolerance: </b>" + part.crashTolerance.ToString("G") + " m/s impact\n" +
                "<b>Tolerance: </b>" + part.gTolerance.ToString("G") + " G, " + part.maxPressure.ToString("G") + " kPA Pressure\n" +
                "<b>Max. Temp. Int / Skin: </b>" + part.maxTemp.ToString("G") + " / " + part.skinMaxTemp.ToString("G") + " K\n";

            if (part.CrewCapacity > 0)
            {
                basicInfo += "<b>Crew capacity: </b>" + part.CrewCapacity + "\n";
            }
            basicInfo += "</color>";

            // Crossfeed info in red
            ModuleToggleCrossfeed mtc = part.Modules.GetModule <ModuleToggleCrossfeed>();

            if (mtc != null)
            {
                basicInfo += "<color=#f3a413>";
                if (mtc.toggleEditor && mtc.toggleFlight)
                {
                    basicInfo += "Crossfeed toggles in Editor and Flight\n";
                }
                else if (mtc.toggleEditor)
                {
                    basicInfo += "Crossfeed toggles in Editor\n";
                }
                else if (mtc.toggleFlight)
                {
                    basicInfo += "Crossfeed toggles in Flight\n";
                }
                basicInfo += mtc.crossfeedStatus ? "Default On\n" : "Default Off\n";
                basicInfo += "</color>";
            }
            else if (!part.fuelCrossFeed)
            {
                basicInfo += "<color=#f3a413>No fuel crossfeed</color>\n";
            }

            // Module/resource info is in light green
            basicInfo += "\n<color=#b4d455>";

            // Info from modules (note : revamped engine test) :
            string moduleInfo = "";

            if (part.Modules.GetModule <MultiModeEngine>() != null)
            {
                moduleInfo += "<b>Multi-mode engine:</b>\n";
            }
            foreach (PartModule pm in part.Modules)
            {
                if (pm is ModuleEngines)
                {
                    ModuleEngines me = (ModuleEngines)pm;
                    moduleInfo += "<b>";
                    moduleInfo += (me.engineType != EngineType.Generic) ? me.engineType.ToString() + " engine" : "Engine";
                    moduleInfo += (part.Modules.GetModule <MultiModeEngine>() != null) ? " (" + me.engineID + "):</b>\n" : ":</b>\n";

                    if (me.engineType == EngineType.Turbine)
                    {
                        moduleInfo += "<b>Stationary Thrust:</b> " + me.maxThrust.ToString("F1") + "kN\n";
                    }
                    else
                    {
                        float ispVAC    = me.atmosphereCurve.Evaluate(0.0f);
                        float ispASL    = me.atmosphereCurve.Evaluate(1.0f);
                        float thrustASL = me.maxThrust * (ispASL / ispVAC);
                        moduleInfo +=
                            "<b>Thrust:</b> " + me.maxThrust.ToString("F1") + " kN, <b>ISP:</b> " + ispVAC.ToString("F0") + " (Vac.)\n" +
                            "<b>Thrust:</b> " + thrustASL.ToString("F1") + " kN, <b>ISP:</b> " + ispASL.ToString("F0") + " (ASL)\n";
                    }
                }
                else
                {
                    IModuleInfo info = pm as IModuleInfo;
                    if (info != null)
                    {
                        moduleInfo += info.GetPrimaryField();
                    }
                }
            }

            if (moduleInfo != "")
            {
                basicInfo += moduleInfo + "\n";
            }

            // Resource list in green (note : GetInfo() doesn't have the same format as stock)
            foreach (PartResource pr in part.Resources)
            {
                basicInfo += "<b>" + pr.info.title + ": </b>" + pr.maxAmount.ToString("F1") + "\n";
            }

            basicInfo += "</color>";
            return(basicInfo);
        }