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"; } } }