private void GenerateOfferedCourses() { OfferedCourses.Clear(); _partSynsHandled.Clear(); if (!CurrentSceneAllowsCrewManagement) { return; // Course UI is only available in those 2 scenes so no need to generate them for any other } //convert the saved configs to course offerings foreach (CourseTemplate template in CourseTemplates) { var duplicate = new CourseTemplate(template.sourceNode, true); //creates a duplicate so the initial template is preserved duplicate.PopulateFromSourceNode(); if (duplicate.Available) { OfferedCourses.Add(duplicate); } } foreach (AvailablePart ap in PartLoader.LoadedPartsList) { if (ap.partPrefab.CrewCapacity > 0 && ResearchAndDevelopment.PartModelPurchased(ap) && !ResearchAndDevelopment.IsExperimentalPart(ap)) { AddPartCourses(ap); } } }
private void removeExperimentalParts() { AvailablePart partToAdd = PartLoader.getPartInfoByName("MerillCamera"); if (partToAdd != null && ResearchAndDevelopment.IsExperimentalPart(partToAdd)) { ResearchAndDevelopment.RemoveExperimentalPart(partToAdd); } }
/** Removes experimental part. * TODO: Check if there is another active contract using this part in which case we have to keep it! */ private void removeExperimentalParts() { AvailablePart ap = ExperimentFactory.getPartForExperiment(ExperimentFactory.KEMINI_EXPERIMENTS, experiment); if (ap != null && ResearchAndDevelopment.IsExperimentalPart(ap)) { NE_Helper.log("Removing experimental part: " + ap.name); ResearchAndDevelopment.RemoveExperimentalPart(ap); } }
public void TechUnlockEvent(GameEvents.HostTargetAction <RDTech, RDTech.OperationResult> ev) { const string logBlockName = nameof(KCTEvents) + "." + nameof(TechUnlockEvent); using (EntryExitLogger.EntryExitLog(logBlockName, EntryExitLoggerOptions.All)) { //TODO: Check if any of the parts are experimental, if so, do the normal KCT stuff and then set them experimental again if (!KCT_PresetManager.Instance.ActivePreset.generalSettings.Enabled) { return; } if (ev.target == RDTech.OperationResult.Successful) { KCT_TechItem tech = new KCT_TechItem(); if (ev.host != null) { tech = new KCT_TechItem(ev.host); } foreach (AvailablePart expt in ev.host.partsPurchased) { if (ResearchAndDevelopment.IsExperimentalPart(expt)) { GameStates.ExperimentalParts.Add(expt); } } //if (!KCT_GameStates.settings.InstantTechUnlock && !KCT_GameStates.settings.DisableBuildTime) tech.DisableTech(); if (!tech.isInList()) { if (KCT_PresetManager.Instance.ActivePreset.generalSettings.TechUpgrades) { ScreenMessages.PostScreenMessage("[KCT] Upgrade Point Added!", 4.0f, ScreenMessageStyle.UPPER_LEFT); } if (KCT_PresetManager.Instance.ActivePreset.generalSettings.TechUnlockTimes && KCT_PresetManager.Instance.ActivePreset.generalSettings.BuildTimes) { GameStates.TechList.Add(tech); foreach (KCT_TechItem techItem in GameStates.TechList) { techItem.UpdateBuildRate(GameStates.TechList.IndexOf(techItem)); } double timeLeft = tech.BuildRate > 0 ? tech.TimeLeft : tech.EstimatedTimeLeft; ScreenMessages.PostScreenMessage("[KCT] Node will unlock in " + MagiCore.Utilities.GetFormattedTime(timeLeft), 4.0f, ScreenMessageStyle.UPPER_LEFT); } } else { ResearchAndDevelopment.Instance.AddScience(tech.scienceCost, TransactionReasons.RnDTechResearch); ScreenMessages.PostScreenMessage("[KCT] This node is already being researched!", 4.0f, ScreenMessageStyle.UPPER_LEFT); ScreenMessages.PostScreenMessage("[KCT] It will unlock in " + MagiCore.Utilities.GetFormattedTime((GameStates.TechList.First(t => t.techID == ev.host.techID)).TimeLeft), 4.0f, ScreenMessageStyle.UPPER_LEFT); } } } }
private void wip(Func <string, EventVoid> doWithApart) { foreach (AvailablePart aPart in PartLoader.Instance.parts) { if (aPart.partPrefab != null && aPart.partPrefab.Modules != null) { foreach (PartModule pm in aPart.partPrefab.Modules) { if (pm.moduleName.Equals("MerillMissionStub")) { if (((MerillMissionStub)pm).missionName.Equals(this.GetType().Name)) { if (ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired) == RDTech.State.Available) { MerillData.log(" RD purchased, is experimental? " + ResearchAndDevelopment.IsExperimentalPart( PartLoader.getPartInfoByName(((MerillMissionStub)pm).partUnlock))); //check if already experimental if (ResearchAndDevelopment.IsExperimentalPart(PartLoader.getPartInfoByName(((MerillMissionStub)pm).partUnlock))) { doWithApart(((MerillMissionStub)pm).partUnlock); } } else if (aPart.TechRequired != "specializedControl") { try { //try to remove the stub to a research node MerillData.log(" RD find a part with r&d node " + pm.name); RDTech tech = AssetBase.RnDTechTree.FindTech( ((MerillMissionStub)pm).techRequired); if (tech != null) { MerillData.log(" RD find good tech " + tech.name); aPart.TechRequired = "specializedControl"; tech.partsAssigned.Remove(aPart); MerillData.log(" RD find tech assigned "); if (ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired) == RDTech.State.Available) { doWithApart(((MerillMissionStub)pm).partUnlock); } } } catch (Exception e) { MerillData.log(" RD Exeption: " + e); } } } } } } } }
public void TechUnlockEvent(GameEvents.HostTargetAction <RDTech, RDTech.OperationResult> ev) { if (!PresetManager.Instance.ActivePreset.GeneralSettings.Enabled) { return; } if (ev.target == RDTech.OperationResult.Successful) { var tech = new TechItem(); if (ev.host != null) { tech = new TechItem(ev.host); } if (!tech.IsInList()) { if (PresetManager.Instance.ActivePreset.GeneralSettings.TechUpgrades) { ScreenMessages.PostScreenMessage("[KCT] Upgrade Point Added!", 4f, ScreenMessageStyle.UPPER_LEFT); } if (PresetManager.Instance.ActivePreset.GeneralSettings.TechUnlockTimes && PresetManager.Instance.ActivePreset.GeneralSettings.BuildTimes) { KCTGameStates.TechList.Add(tech); foreach (TechItem techItem in KCTGameStates.TechList) { techItem.UpdateBuildRate(KCTGameStates.TechList.IndexOf(techItem)); } double timeLeft = tech.BuildRate > 0 ? tech.TimeLeft : tech.EstimatedTimeLeft; ScreenMessages.PostScreenMessage($"[KCT] Node will unlock in {MagiCore.Utilities.GetFormattedTime(timeLeft)}", 4f, ScreenMessageStyle.UPPER_LEFT); foreach (AvailablePart ap in ev.host.partsAssigned) { if (Utilities.AddExperimentalPart(ap)) { KCTDebug.Log($"{ap.name} added to ExpParts: {ResearchAndDevelopment.IsExperimentalPart(ap)}"); } } OnTechQueued.Fire(ev.host); } } else { ResearchAndDevelopment.Instance.AddScience(tech.ScienceCost, TransactionReasons.RnDTechResearch); ScreenMessages.PostScreenMessage("[KCT] This node is already being researched!", 4f, ScreenMessageStyle.UPPER_LEFT); ScreenMessages.PostScreenMessage($"[KCT] It will unlock in {MagiCore.Utilities.GetFormattedTime((KCTGameStates.TechList.First(t => t.TechID == ev.host.techID)).TimeLeft)}", 4f, ScreenMessageStyle.UPPER_LEFT); } } }
private void removeExperimentalPart(string sExperimentalPartName) { MerillData.log("plantmunflag: DECLINED contract with experimental part: " + sExperimentalPartName); if (sExperimentalPartName != null) { AvailablePart experimentalPart = PartLoader.getPartInfoByName(sExperimentalPartName); if (experimentalPart != null && ResearchAndDevelopment.IsExperimentalPart(experimentalPart)) { MerillData.log("plantmunflag: Locking part: " + sExperimentalPartName); ResearchAndDevelopment.RemoveExperimentalPart(experimentalPart); } } }
private void addExperimentalPart(string sExperimentalPartName) { MerillData.log("accepted contract with experimental part: " + sExperimentalPartName); if (sExperimentalPartName != null) { AvailablePart experimentalPart = PartLoader.getPartInfoByName(sExperimentalPartName); MerillData.log("experimental part: " + experimentalPart + ", " + (experimentalPart == null ? "" : "" + ResearchAndDevelopment.IsExperimentalPart(experimentalPart))); if (experimentalPart != null && !ResearchAndDevelopment.IsExperimentalPart(experimentalPart)) { MerillData.log(": Unlocking part: " + sExperimentalPartName); ResearchAndDevelopment.AddExperimentalPart(experimentalPart); //expPartToRemove.Add(experimentalPart.name); } else { MerillData.log(": Part unvailable / already research: " + sExperimentalPartName); } } }
private void GenerateOfferedCourses() { //convert the saved configs to course offerings foreach (CourseTemplate template in CourseTemplates) { var duplicate = new CourseTemplate(template.sourceNode, true); //creates a duplicate so the initial template is preserved duplicate.PopulateFromSourceNode(); if (duplicate.Available) { OfferedCourses.Add(duplicate); } } foreach (AvailablePart ap in PartLoader.LoadedPartsList) { if (ap.partPrefab.CrewCapacity > 0 && ResearchAndDevelopment.PartModelPurchased(ap) && !ResearchAndDevelopment.IsExperimentalPart(ap)) { AddPartCourses(ap); } } }
public void AddPartCourses(AvailablePart ap) { string name = TrainingDatabase.SynonymReplace(ap.name); if (!_partSynsHandled.Contains(name)) { _partSynsHandled.Add(name); bool isPartUnlocked = ResearchAndDevelopment.PartModelPurchased(ap) && !ResearchAndDevelopment.IsExperimentalPart(ap); GenerateCourseProf(ap, !isPartUnlocked); if (isPartUnlocked && IsMissionTrainingEnabled) { GenerateCourseMission(ap); } } }
// Add stub part into research node // Add exp part if in a researched node (from stub part) private void addExperimentalParts() { if (base.dateAccepted == 0) { MerillData.log("mun mission: can't add exp part: date accepted=" + dateAccepted); } try { //add mandatory parts addExperimentalPart("MerillnlineCockpitLander"); //add part from stubs foreach (AvailablePart aPart in PartLoader.Instance.parts) { if (aPart.partPrefab != null && aPart.partPrefab.Modules != null) { //MerillData.log("part " + aPart.name); foreach (PartModule pm in aPart.partPrefab.Modules) { if (pm.moduleName.Equals("MerillMissionStub")) { if (((MerillMissionStub)pm).missionName.Equals(this.GetType().Name)) { MerillData.log(" RD find a part " + pm.name); MerillData.log(" RD purchased? " + ResearchAndDevelopment.PartModelPurchased(aPart)); MerillData.log(" RD available? " + ResearchAndDevelopment.PartTechAvailable(aPart)); MerillData.log(" RD mi " + aPart.moduleInfo); MerillData.log(" RD tech required: " + aPart.TechRequired); MerillData.log(" RD tech Really required: " + ((MerillMissionStub)pm).techRequired); MerillData.log(" RD tech Really required purchased? : " + ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired)); //already set, and already researched? if (ResearchAndDevelopment.GetTechnologyState( ((MerillMissionStub)pm).techRequired) == RDTech.State.Available && aPart.TechRequired == ((MerillMissionStub)pm).techRequired) { MerillData.log(" RD find a part with r&d node " + pm.name); //check if already experimental if (!ResearchAndDevelopment.IsExperimentalPart( PartLoader.getPartInfoByName(((MerillMissionStub)pm).partUnlock))) { addExperimentalPart(((MerillMissionStub)pm).partUnlock); } } // not set else if (aPart.TechRequired == "specializedControl") { try { //try to attach the stub to a research node MerillData.log(" RD find a part without r&d node " + pm.name); RDTech tech = AssetBase.RnDTechTree.FindTech( ((MerillMissionStub)pm).techRequired); if (tech != null) { //Set it MerillData.log(" RD find good tech " + tech.name); aPart.TechRequired = ((MerillMissionStub)pm).techRequired; tech.partsAssigned.Add(aPart); MerillData.log(" RD find tech assigned "); MerillData.log(" RD good tech purchased? " + tech.state + " , " + tech.enabled + ", "); //already researched? if (ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired) == RDTech.State.Available) { addExperimentalPart(((MerillMissionStub)pm).partUnlock); } } } catch (Exception e) { MerillData.log(" RD Exeption: " + e); } } } } } } } //TODO: made this auto + add stub in tree //if (ResearchAndDevelopment.PartModelPurchased(PartLoader.getPartInfoByName("MerillCheapFuelTank1-2Stub"))) // addExperimentalPart("MerillCheapFuelTank1-2"); //if (ResearchAndDevelopment.PartModelPurchased(PartLoader.getPartInfoByName("MerillCheapFuelTank3-2Stub"))) // addExperimentalPart("MerillCheapFuelTank3-2"); //if (ResearchAndDevelopment.PartModelPurchased(PartLoader.getPartInfoByName("MerillLinearRcsExperimental"))) // addExperimentalPart("MerillLinearRcsExperimental"); } catch (Exception e) { MerillData.log(" exception at contract OnAccepted:" + e); } }
protected void removeExperimentalParts() { try { //remove mandatory parts removeExperimentalPart("MerillnlineCockpitLander"); foreach (AvailablePart aPart in PartLoader.Instance.parts) { if (aPart.partPrefab != null && aPart.partPrefab.Modules != null) { foreach (PartModule pm in aPart.partPrefab.Modules) { if (pm.moduleName.Equals("MerillMissionStub")) { if (((MerillMissionStub)pm).missionName.Equals(this.GetType().Name)) { MerillData.log(" RD find a part " + pm.name); MerillData.log(" RD purchased? " + ResearchAndDevelopment.PartModelPurchased(aPart)); MerillData.log(" RD available? " + ResearchAndDevelopment.PartTechAvailable(aPart)); MerillData.log(" RD mi '" + aPart.moduleInfo + "'"); MerillData.log(" RD tech required: " + aPart.TechRequired); MerillData.log(" RD tech Really required: " + ((MerillMissionStub)pm).techRequired); //research and set if (ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired) == RDTech.State.Available && aPart.TechRequired == ((MerillMissionStub)pm).techRequired) { MerillData.log(" RD purchased, is experimental? " + ResearchAndDevelopment.IsExperimentalPart( PartLoader.getPartInfoByName(((MerillMissionStub)pm).partUnlock))); //check if experimental if (ResearchAndDevelopment.IsExperimentalPart( PartLoader.getPartInfoByName(((MerillMissionStub)pm).partUnlock))) { removeExperimentalPart(((MerillMissionStub)pm).partUnlock); } //remove from tech RDTech tech = AssetBase.RnDTechTree.FindTech(aPart.TechRequired); if (tech != null) { MerillData.log(" RD find good tech " + tech.name); aPart.TechRequired = "specializedControl"; tech.partsAssigned.Remove(aPart); } } //set? ==((MerillMissionStub)pm).techRequired else if (aPart.TechRequired != "specializedControl") { try { //try to remove the stub to a research node MerillData.log(" RD find a part with r&d node " + pm.name); RDTech tech = AssetBase.RnDTechTree.FindTech(aPart.TechRequired); if (tech != null) { MerillData.log(" RD find good tech " + tech.name); aPart.TechRequired = "specializedControl"; tech.partsAssigned.Remove(aPart); MerillData.log(" RD find tech assigned "); if (ResearchAndDevelopment.GetTechnologyState(((MerillMissionStub)pm).techRequired) == RDTech.State.Available) { removeExperimentalPart(((MerillMissionStub)pm).partUnlock); } } } catch (Exception e) { MerillData.log(" RD Exeption: " + e); } } } } } } } } catch (Exception e) { MerillData.log(" exception at contract OnAccepted:" + e); } }
public void AddPartCourses(AvailablePart ap) { if (ap.partPrefab.isVesselEVA || ap.partPrefab.Modules.Contains <KerbalSeat>() || ap.partPrefab.Modules.Contains <LaunchClamp>() || ap.partPrefab.HasTag("PadInfrastructure")) { return; } TrainingDatabase.SynonymReplace(ap.name, out string name); if (!_partSynsHandled.Contains(name)) { _partSynsHandled.Add(name); bool isPartUnlocked = ResearchAndDevelopment.PartModelPurchased(ap) && !ResearchAndDevelopment.IsExperimentalPart(ap); GenerateCourseProf(ap, !isPartUnlocked); if (isPartUnlocked && IsMissionTrainingEnabled) { GenerateCourseMission(ap); } } }
protected AvailablePart[] getLockedParts() { List <AvailablePart> lockedParts = new List <AvailablePart>(); AvailablePart[] loadedParts = PartLoader.LoadedPartsList.ToArray(); AvailablePart availablePart; for (int index = 0; index < loadedParts.Length; index++) { availablePart = loadedParts[index]; if (!ResearchAndDevelopment.PartModelPurchased(availablePart) && !ResearchAndDevelopment.IsExperimentalPart(availablePart) && !blacklistNodes.Contains(availablePart.TechRequired)) { //Check for excluded folders if (!string.IsNullOrEmpty(excludeFolders)) { string[] bannedFolders = excludeFolders.Split(new char[] { ';' }); bool partIsBanned = false; for (int folderIndex = 0; folderIndex < excludeFolders.Length; folderIndex++) { if (availablePart.partUrl.Contains(excludeFolders[folderIndex])) { partIsBanned = true; break; } } if (partIsBanned) { continue; } } //If we aren't unlocking parts exclusive to mod folders then just add the part. if (string.IsNullOrEmpty(modFolders)) { lockedParts.Add(availablePart); } //See if the part belongs to the mod whitelist. else { string[] allowedFolders = modFolders.Split(new char[] { ';' }); for (int folderIndex = 0; folderIndex < allowedFolders.Length; folderIndex++) { if (availablePart.partUrl.Contains(allowedFolders[folderIndex])) { lockedParts.Add(availablePart); break; } } } } } if (lockedParts.Count > 0) { return(lockedParts.ToArray()); } else { return(null); } }