Example #1
0
        public void Update()
        {
            this.enabled = true;
            AvailablePart intakePart = PartLoader.getPartInfoByName("CircularIntake");

            if (intakePart != null)
            {
                if (intakePart.partPrefab.FindModulesImplementing <AtmosphericIntake>().Count <= 0 && PartLoader.Instance.IsReady())
                {
                    plugin_init = false;
                }
            }

            if (!resources_configured)
            {
                ConfigNode plugin_settings = GameDatabase.Instance.GetConfigNode("WarpPlugin/WarpPluginSettings/WarpPluginSettings");
                if (plugin_settings != null)
                {
                    if (plugin_settings.HasValue("HydrogenResourceName"))
                    {
                        PluginHelper.hydrogen_resource_name = plugin_settings.GetValue("HydrogenResourceName");
                        Debug.Log("[KSP Interstellar] Hydrogen resource name set to " + PluginHelper.hydrogen_resource_name);
                    }
                    if (plugin_settings.HasValue("OxygenResourceName"))
                    {
                        PluginHelper.oxygen_resource_name = plugin_settings.GetValue("OxygenResourceName");
                        Debug.Log("[KSP Interstellar] Oxygen resource name set to " + PluginHelper.oxygen_resource_name);
                    }
                    if (plugin_settings.HasValue("AluminiumResourceName"))
                    {
                        PluginHelper.aluminium_resource_name = plugin_settings.GetValue("AluminiumResourceName");
                        Debug.Log("[KSP Interstellar] Aluminium resource name set to " + PluginHelper.aluminium_resource_name);
                    }
                    if (plugin_settings.HasValue("MethaneResourceName"))
                    {
                        PluginHelper.methane_resource_name = plugin_settings.GetValue("MethaneResourceName");
                        Debug.Log("[KSP Interstellar] Methane resource name set to " + PluginHelper.methane_resource_name);
                    }
                    if (plugin_settings.HasValue("ArgonResourceName"))
                    {
                        PluginHelper.argon_resource_name = plugin_settings.GetValue("ArgonResourceName");
                        Debug.Log("[KSP Interstellar] Argon resource name set to " + PluginHelper.argon_resource_name);
                    }
                    if (plugin_settings.HasValue("WaterResourceName"))
                    {
                        PluginHelper.water_resource_name = plugin_settings.GetValue("WaterResourceName");
                        Debug.Log("[KSP Interstellar] Water resource name set to " + PluginHelper.water_resource_name);
                    }
                    if (plugin_settings.HasValue("HydrogenPeroxideResourceName"))
                    {
                        PluginHelper.hydrogen_peroxide_resource_name = plugin_settings.GetValue("HydrogenPeroxideResourceName");
                        Debug.Log("[KSP Interstellar] Hydrogen Peroxide resource name set to " + PluginHelper.hydrogen_peroxide_resource_name);
                    }
                    if (plugin_settings.HasValue("AmmoniaResourceName"))
                    {
                        PluginHelper.ammonia_resource_name = plugin_settings.GetValue("AmmoniaResourceName");
                        Debug.Log("[KSP Interstellar] Ammonia resource name set to " + PluginHelper.ammonia_resource_name);
                    }
                    if (plugin_settings.HasValue("ThermalMechanicsDisabled"))
                    {
                        PluginHelper.is_thermal_dissip_disabled = bool.Parse(plugin_settings.GetValue("ThermalMechanicsDisabled"));
                        Debug.Log("[KSP Interstellar] ThermalMechanics set to enabled: " + !PluginHelper.is_thermal_dissip_disabled);
                    }
                    resources_configured = true;
                }
                else
                {
                    showInstallationErrorMessage();
                }
            }

            if (!plugin_init)
            {
                gdb         = GameDatabase.Instance;
                plugin_init = true;

                AvailablePart kerbalRadiationPart = PartLoader.getPartInfoByName("kerbalEVA");
                if (kerbalRadiationPart.partPrefab.Modules != null)
                {
                    if (kerbalRadiationPart.partPrefab.FindModulesImplementing <FNModuleRadiation>().Count == 0)
                    {
                        kerbalRadiationPart.partPrefab.gameObject.AddComponent <FNModuleRadiation>();
                    }
                }
                else
                {
                    kerbalRadiationPart.partPrefab.gameObject.AddComponent <FNModuleRadiation>();
                }

                List <AvailablePart> available_parts = PartLoader.LoadedPartsList;
                foreach (AvailablePart available_part in available_parts)
                {
                    Part prefab_available_part = available_part.partPrefab;
                    try {
                        if (prefab_available_part.Modules != null)
                        {
                            if (prefab_available_part.FindModulesImplementing <ModuleResourceIntake>().Count > 0)
                            {
                                ModuleResourceIntake intake = prefab_available_part.Modules["ModuleResourceIntake"] as ModuleResourceIntake;
                                if (intake.resourceName == "IntakeAir")
                                {
                                    Type type            = AssemblyLoader.GetClassByName(typeof(PartModule), "AtmosphericIntake");
                                    AtmosphericIntake pm = null;
                                    if (type != null)
                                    {
                                        pm = prefab_available_part.gameObject.AddComponent(type) as AtmosphericIntake;
                                        prefab_available_part.Modules.Add(pm);
                                        pm.area = intake.area * intake.unitScalar * intake.maxIntakeSpeed / 20;
                                    }

                                    PartResource intake_air_resource = prefab_available_part.Resources["IntakeAir"];

                                    if (intake_air_resource != null && !prefab_available_part.Resources.Contains("IntakeAtm"))
                                    {
                                        ConfigNode node = new ConfigNode("RESOURCE");
                                        node.AddValue("name", "IntakeAtm");
                                        node.AddValue("maxAmount", intake_air_resource.maxAmount);
                                        node.AddValue("amount", intake_air_resource.amount);
                                        prefab_available_part.AddResource(node);
                                    }
                                }
                            }

                            if (prefab_available_part.FindModulesImplementing <ModuleDeployableSolarPanel>().Count > 0)
                            {
                                ModuleDeployableSolarPanel panel = prefab_available_part.Modules["ModuleDeployableSolarPanel"] as ModuleDeployableSolarPanel;
                                if (panel.chargeRate > 0)
                                {
                                    Type type = AssemblyLoader.GetClassByName(typeof(PartModule), "FNSolarPanelWasteHeatModule");
                                    FNSolarPanelWasteHeatModule pm = null;
                                    if (type != null)
                                    {
                                        pm = prefab_available_part.gameObject.AddComponent(type) as FNSolarPanelWasteHeatModule;
                                        prefab_available_part.Modules.Add(pm);
                                    }
                                }


                                if (!prefab_available_part.Resources.Contains("WasteHeat") && panel.chargeRate > 0)
                                {
                                    ConfigNode node = new ConfigNode("RESOURCE");
                                    node.AddValue("name", "WasteHeat");
                                    node.AddValue("maxAmount", panel.chargeRate * 100);
                                    node.AddValue("amount", 0);
                                    PartResource pr = prefab_available_part.AddResource(node);

                                    if (available_part.resourceInfo != null && pr != null)
                                    {
                                        if (available_part.resourceInfo.Length == 0)
                                        {
                                            available_part.resourceInfo = pr.resourceName + ":" + pr.amount + " / " + pr.maxAmount;
                                        }
                                        else
                                        {
                                            available_part.resourceInfo = available_part.resourceInfo + "\n" + pr.resourceName + ":" + pr.amount + " / " + pr.maxAmount;
                                        }
                                    }
                                }
                            }

                            if (prefab_available_part.FindModulesImplementing <ElectricEngineController>().Count() > 0)
                            {
                                available_part.moduleInfo = prefab_available_part.FindModulesImplementing <ElectricEngineController>().First().GetInfo();
                                available_part.moduleInfos.RemoveAll(modi => modi.moduleName == "Engine");
                                AvailablePart.ModuleInfo mod_info = available_part.moduleInfos.Where(modi => modi.moduleName == "Electric Engine Controller").First();
                                mod_info.moduleName = "Electric Engine";
                            }

                            if (prefab_available_part.FindModulesImplementing <FNNozzleController>().Count() > 0)
                            {
                                available_part.moduleInfo = prefab_available_part.FindModulesImplementing <FNNozzleController>().First().GetInfo();
                                available_part.moduleInfos.RemoveAll(modi => modi.moduleName == "Engine");
                                AvailablePart.ModuleInfo mod_info = available_part.moduleInfos.Where(modi => modi.moduleName == "FNNozzle Controller").First();
                                mod_info.moduleName = "Thermal Nozzle";
                            }

                            if (prefab_available_part.CrewCapacity > 0)
                            {
                                Type type            = AssemblyLoader.GetClassByName(typeof(PartModule), "FNModuleRadiation");
                                FNModuleRadiation pm = null;
                                if (type != null)
                                {
                                    pm = prefab_available_part.gameObject.AddComponent(type) as FNModuleRadiation;
                                    prefab_available_part.Modules.Add(pm);
                                    double rad_hardness = prefab_available_part.mass / ((double)prefab_available_part.CrewCapacity) * 7.5;
                                    pm.rad_hardness = rad_hardness;
                                }
                                print("Adding ModuleRadiation to " + prefab_available_part.name);
                            }
                        }
                    }catch (Exception ex) {
                        if (prefab_available_part != null)
                        {
                            print("[KSP Interstellar] Exception caught adding to: " + prefab_available_part.name + " part: " + ex.ToString());
                        }
                        else
                        {
                            print("[KSP Interstellar] Exception caught adding to unknown module");
                        }
                    }
                }
            }

            //Destroy (this);
        }
        public override void OnStart(PartModule.StartState state)
        {
            Debug.Log("[KSPI]: FNModulePreecooler - Onstart start search for Air Intake module to cool");

            // first check if part itself has an air intake
            attachedIntake = part.FindModulesImplementing <AtmosphericIntake>().FirstOrDefault();

            if (attachedIntake != null)
            {
                Debug.Log("[KSPI]: FNModulePreecooler - Found Airintake on self");
            }

            if (state == StartState.Editor)
            {
                return;
            }

            if (attachedIntake == null)
            {
                // then look to connect radial attached children
                radialAttachedIntakes = part.children
                                        .Where(p => p.attachMode == AttachModes.SRF_ATTACH)
                                        .SelectMany(p => p.FindModulesImplementing <AtmosphericIntake>()).ToList();

                Debug.Log(radialAttachedIntakes.Count > 0
                    ? "[KSPI]: FNModulePreecooler - Found Airintake in children"
                    : "[KSPI]: FNModulePreecooler - Did not find Airintake in children");
            }

            // third look for stack attachable air intake
            if (attachedIntake == null && (radialAttachedIntakes == null || radialAttachedIntakes.Count == 0))
            {
                Debug.Log("[KSPI]: FNModulePreecooler - looking at attached nodes");

                foreach (var attachNode in part.attachNodes.Where(a => a.attachedPart != null))
                {
                    var attachedPart = attachNode.attachedPart;

                    // skip any parts that contain a precooler
                    if (attachedPart.FindModulesImplementing <FNModulePreecooler>().Any())
                    {
                        Debug.Log("[KSPI]: FNModulePreecooler - skipping Module Implementing FNModulePreecooler");
                        continue;
                    }

                    attachedIntake = attachedPart.FindModulesImplementing <AtmosphericIntake>().FirstOrDefault();

                    if (attachedIntake == null)
                    {
                        continue;
                    }

                    Debug.Log("[KSPI]: FNModulePreecooler - found Airintake in attached part with name " + attachedIntake.name);
                    break;
                }

                if (attachedIntake == null)
                {
                    Debug.Log("[KSPI]: FNModulePreecooler - looking at deeper attached nodes");

                    // look for stack attacked parts one part further
                    foreach (var attachNode in part.attachNodes.Where(a => a.attachedPart != null))
                    {
                        // then look to connect radial attached children
                        radialAttachedIntakes = attachNode.attachedPart.children
                                                .Where(p => p.attachMode == AttachModes.SRF_ATTACH)
                                                .SelectMany(p => p.FindModulesImplementing <AtmosphericIntake>()).ToList();

                        if (radialAttachedIntakes.Count > 0)
                        {
                            Debug.Log("[KSPI]: FNModulePreecooler - Found " + radialAttachedIntakes.Count + " Airintake(s) in children in deeper node");
                            break;
                        }

                        if (attachNode.attachedPart.FindModulesImplementing <FNModulePreecooler>().Any())
                        {
                            continue;
                        }

                        foreach (var subAttachNode in attachNode.attachedPart.attachNodes.Where(a => a.attachedPart != null))
                        {
                            Debug.Log("[KSPI]: FNModulePreecooler - look for Air intakes in part " + subAttachNode.attachedPart.name);

                            attachedIntake = subAttachNode.attachedPart.FindModulesImplementing <AtmosphericIntake>().FirstOrDefault();

                            if (attachedIntake != null)
                            {
                                Debug.Log("[KSPI]: FNModulePreecooler - found Airintake in deeper attached part with name " + attachedIntake.name);
                                break;
                            }

                            // then look to connect radial attached children
                            radialAttachedIntakes = subAttachNode.attachedPart.children
                                                    .Where(p => p.attachMode == AttachModes.SRF_ATTACH)
                                                    .SelectMany(p => p.FindModulesImplementing <AtmosphericIntake>()).ToList();

                            if (radialAttachedIntakes.Count <= 0)
                            {
                                continue;
                            }

                            Debug.Log("[KSPI]: FNModulePreecooler - Found " + radialAttachedIntakes.Count + " Airintake(s) in children in even deeper node");
                            break;
                        }
                        if (attachedIntake != null)
                        {
                            break;
                        }
                    }
                }
            }

            if (attachedIntake != null)
            {
                attachedIntakeName = attachedIntake.name;
            }
            else
            {
                if (radialAttachedIntakes == null)
                {
                    attachedIntakeName = "Null found";
                }
                else if (radialAttachedIntakes.Count > 1)
                {
                    attachedIntakeName = radialAttachedIntakes.Count + " radial intakes found";
                }
                else if (radialAttachedIntakes.Count > 0)
                {
                    attachedIntakeName = radialAttachedIntakes.First().name;
                }
                else
                {
                    attachedIntakeName = "Not found";
                }
            }
        }