private void OnSwitcherWidgetClick() { ButtonWidget handler = EventSystem.current.currentSelectedGameObject.GetComponent <ButtonWidget>(); if (handler.switcherModule is ModuleB9PartSwitch) { ModuleB9PartSwitch b9Switch = (ModuleB9PartSwitch)handler.switcherModule; int nextSubtype = b9Switch.currentSubtypeIndex == b9Switch.SubtypesCount - 1 ? 0 : b9Switch.currentSubtypeIndex + 1; b9Switch.SwitchSubtype(b9Switch.subtypes[nextSubtype].subtypeName); delayedTooltipUpdate = 1; } else if (handler.switcherModule is ModulePartVariants) { ModulePartVariants pmv = (ModulePartVariants)handler.switcherModule; int currentVariantIndex = pmv.variantList.IndexOf(pmv.SelectedVariant); int nextvariant = currentVariantIndex == pmv.variantList.Count - 1 ? 0 : currentVariantIndex + 1; string nextVariantName = pmv.variantList[nextvariant].Name; pmv.SetVariant(nextVariantName); for (int i = 0; i < pmv.part.symmetryCounterparts.Count; i++) { PartModule pmSym = pmv.part.symmetryCounterparts[i].Modules[pmv.part.Modules.IndexOf(pmv)]; if (pmSym != null && pmSym is ModulePartVariants) { ((ModulePartVariants)pmSym).SetVariant(nextVariantName); } } UpdateInfoToolTip(false); } }
public SubtypeVolumeProvider(ModuleB9PartSwitch parent, float volumeMultiplier, float volumeAdded) { parent.ThrowIfNullArgument(nameof(parent)); this.parent = parent; this.volumeMultiplier = volumeMultiplier; this.volumeAdded = volumeAdded; }
public override void Setup(UIPartActionWindow window, Part part, PartModule partModule, UI_Scene scene, UI_Control control, BaseField field) { base.Setup(window, part, partModule, scene, control, field); ModuleB9PartSwitch switcherModule = (ModuleB9PartSwitch)partModule; SwitcherSubtypeDescriptionGenerator subtypeDescriptionGenerator = new SwitcherSubtypeDescriptionGenerator(switcherModule); subtypeButtons = new List <UIPartActionSubtypeButton>(switcherModule.subtypes.Count); for (int i = 0; i < switcherModule.subtypes.Count; i++) { PartSubtype subtype = switcherModule.subtypes[i]; if (!subtype.IsUnlocked()) { continue; } GameObject buttonGameObject = Instantiate(prefabVariantButton, scrollMain.content); UIPartActionSubtypeButton subtypeButton = buttonGameObject.GetComponent <UIPartActionSubtypeButton>(); // prevent capturing in closures int index = i; subtypeButton.Setup( subtype.title, subtypeDescriptionGenerator.GetFullSubtypeDescription(subtype), subtype.PrimaryColor, subtype.SecondaryColor, () => SetSubtype(index) ); subtypeButtons.Add(subtypeButton); } subtypeButtons[0].previousItem = subtypeButtons[subtypeButtons.Count - 1]; subtypeButtons[0].nextItem = subtypeButtons[1]; for (int i = 1; i < subtypeButtons.Count - 1; i++) { subtypeButtons[i].previousItem = subtypeButtons[i - 1]; subtypeButtons[i].nextItem = subtypeButtons[i + 1]; } subtypeButtons[subtypeButtons.Count - 1].previousItem = subtypeButtons[subtypeButtons.Count - 2]; subtypeButtons[subtypeButtons.Count - 1].nextItem = subtypeButtons[0]; switcherDescriptionText.text = switcherModule.switcherDescription; TooltipHelper.SetupSubtypeInfoTooltip(buttonPreviousTooltipController, "", ""); TooltipHelper.SetupSubtypeInfoTooltip(buttonNextTooltipController, "", ""); SetTooltips(switcherModule.currentSubtypeIndex); buttonPrevious.onClick.AddListener(PreviousSubtype); buttonNext.onClick.AddListener(NextSubtype); subtypeTitleText.text = switcherModule.CurrentSubtype.title; subtypeButtons[switcherModule.currentSubtypeIndex].Activate(); }
private void GetB9Info(ModuleB9PartSwitch b9, out string title, out string info) { title = b9.switcherDescription + " (" + b9.subtypes.Count + " subtypes)"; info = ""; for (int i = 0; i < b9.subtypes.Count; i++) { if (b9.CurrentSubtype == b9.subtypes[i]) { info += $"<b><color=#ffd200>> {b9.subtypes[i].title}</color></b>"; } else { info += $"- {b9.subtypes[i].title}"; } ModuleB9PartSwitch parent = b9.part.Modules.OfType <ModuleB9PartSwitch>().FirstOrDefault(module => module.moduleID == b9.parentID); if (b9.parentID != "" && parent != null && parent.CurrentSubtype.HasTank && parent.baseVolume != 0) { info += $" - Volume : {parent.baseVolume + b9.subtypes[i].volumeAddedToParent}"; } if (b9.subtypes[i].HasTank && b9.part.Modules.OfType <ModuleB9PartSwitch>().FirstOrDefault(module => module.parentID == b9.moduleID) == null) { info += $" - Volume : {b9.subtypes[i].TotalVolume}"; } foreach (var resource in b9.subtypes[i].tankType) { info += $"\n <color=#99ff00ff>- {resource.resourceDefinition.displayName}</color> : {resource.unitsPerVolume * b9.subtypes[i].TotalVolume:F1}"; } if (i != b9.subtypes.Count) { info += "\n"; } ; } }
public PartSubtypeContext(Part part, ModuleB9PartSwitch module, PartSubtype subtype) { Part = part; Module = module; Subtype = subtype; }
public PartSubtypeContext(Part part, ModuleB9PartSwitch module, PartSubtype subtype) { Part = part; Module = module; Subtype = subtype; }
public SwitcherSubtypeDescriptionGenerator(ModuleB9PartSwitch module) { module.ThrowIfNullArgument(nameof(module)); this.module = module; Part partPrefab = module.part.GetPrefab(); float prefabMass = partPrefab.mass; partDryMass = prefabMass + module.part.GetModuleMass(prefabMass); partWetMass = partDryMass + module.part.GetResourceMassMax(); baseDryMass = partDryMass - module.GetDryMass(module.CurrentSubtype) - module.GetParentDryMass(module.CurrentSubtype); baseWetMass = partWetMass - module.GetWetMass(module.CurrentSubtype) - module.GetParentWetMass(module.CurrentSubtype); float prefabCost = module.part.partInfo.cost; partWetCost = prefabCost + module.part.GetModuleCosts(prefabCost); partDryCost = partWetCost - module.part.GetResourceCostMax(); baseDryCost = partDryCost - module.GetDryCost(module.CurrentSubtype) - module.GetParentDryCost(module.CurrentSubtype); baseWetCost = partWetCost - module.GetWetCost(module.CurrentSubtype) - module.GetParentWetCost(module.CurrentSubtype); showWetMass = module.ChangesResourceMass; showWetMass |= module.Parent?.CurrentTankType.ChangesResourceMass ?? false; showDryMass = showWetMass; showDryMass |= module.ChangesDryMass; showDryMass |= (module.Parent?.CurrentTankType.tankMass ?? 0) != 0; showWetCost = module.ChangesResourceCost; showWetCost |= module.Parent?.CurrentTankType.ChangesResourceCost ?? false; showDryCost = showWetCost; showDryCost |= module.ChangesDryCost; showDryCost |= (module.Parent?.CurrentTankType.tankCost ?? 0) != 0; showMaxTemp = module.HasPartAspectLock("maxTemp"); showSkinMaxTemp = module.HasPartAspectLock("skinMaxTemp"); showCrashTolerance = module.HasPartAspectLock("crashTolerance"); prefabMaxTemp = (float)partPrefab.maxTemp; prefabSkinMaxTemp = (float)partPrefab.skinMaxTemp; prefabCrashTolerance = partPrefab.crashTolerance; currentMaxTemp = (float)module.part.maxTemp; currentSkinMaxTemp = (float)module.part.skinMaxTemp; currentCrashTolerance = module.part.crashTolerance; float currentParentVolume = module.Parent?.GetTotalVolume(module.Parent.CurrentSubtype) ?? 0; baseParentVolume = currentParentVolume - (module.CurrentSubtype.volumeAddedToParent * module.VolumeScale); parentResources = new KeyValuePair <TankResource, float> [module.Parent?.CurrentTankType.resources.Count ?? 0]; for (int i = 0; i < parentResources.Length; i++) { TankResource resource = module.Parent.CurrentTankType[i]; parentResources[i] = new KeyValuePair <TankResource, float>(resource, resource.unitsPerVolume * currentParentVolume); } }
public override void OnStart(StartState state) { Debug.Log("ModuleKerBalloon Loaded"); if (HighLogic.LoadedSceneIsEditor) { var switches = part.FindModulesImplementing <ModuleB9PartSwitch>(); sizeSwitch = switches.Find(s => s.moduleID == "balloonSizeSwitch"); planetSwitch = switches.Find(s => s.moduleID == "planetSwitch"); if (sizeSwitch == null) { Log.Error("sizeSwitch is null"); } if (planetSwitch == null) { Log.Error("planetSwitch is null"); } foreach (var s in planetSwitch.Fields) { s.guiActiveEditor = false; } planetSwitch.Events["ShowSubtypesWindow"].guiActiveEditor = false; bodyName = recommendedBody; UpdatePersistentData(); } if (HighLogic.LoadedSceneIsFlight) { balloonObject = getChildGameObject(this.part.gameObject, CFGballoonObject, 0); // balloonSize); ropeObject = getChildGameObject(this.part.gameObject, CFGropeObject, 0); //balloonSize); capObject = getChildGameObject(this.part.gameObject, CFGcapObject, 0); //balloonSize); liftPointObject = getChildGameObject(this.part.gameObject, CFGliftPointObject, 0); //balloonSize); balloonPointObject = getChildGameObject(this.part.gameObject, CFGballoonPointObject, 0); //balloonSize); balloonObject.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); initialBalloonScale = balloonObject.transform.localScale; initialBalloonPos = balloonObject.transform.transform.localPosition; initialRopeScale = ropeObject.transform.localScale; if (hasInflated && !isInflated) { balloonObject.SetActive(false); ropeObject.SetActive(false); capObject.SetActive(false); } else if (isInflating) { repackBalloon(); } else if (isDeflating) { balloonObject.SetActive(false); ropeObject.SetActive(false); isInflated = false; isDeflating = false; isRepacked = false; } if (!isInflated && !isInflating && !isDeflating && !isRepacked) { Events["repackBalloon"].active = true; } if (isInflated) { Log.Info("isInflated"); Events["inflateBalloon"].active = false; Events["deflateBalloon"].active = true; balloonObject.SetActive(true); ropeObject.SetActive(true); capObject.SetActive(false); ropeObject.transform.rotation = Quaternion.Slerp(ropeObject.transform.rotation, Quaternion.LookRotation(vessel.upAxis, vessel.upAxis), BalloonProperties.getLift(this) / 10); ropeObject.transform.localScale = new Vector3(1, 1, 1); } } }