private void InvalidateParts() { StageValues.stale = true; rootPart = null; nextDecoupler = null; allParts = null; dockingPorts = null; decouplers = null; partCache = null; }
private void ConstructParts() { rootPart = null; nextDecoupler = null; allParts = new ListValue <PartValue>(); dockingPorts = new ListValue <DockingPortValue>(); decouplers = new ListValue <DecouplerValue>(); partCache = new Dictionary <global::Part, PartValue>(); ConstructPart(Vessel.rootPart, null, null); allParts.IsReadOnly = true; dockingPorts.IsReadOnly = true; decouplers.IsReadOnly = true; }
public static ListValue PartList(this IShipconstruct vessel, string partType, SharedObjects sharedObj) { var list = new ListValue(); var partList = vessel.Parts.ToList(); switch (partType.ToUpper()) { case "RESOURCES": list = AggregateResourceValue.PartsToList(partList, sharedObj); break; case "PARTS": list = PartValueFactory.Construct(partList, sharedObj); break; case "ENGINES": list = EngineValue.PartsToList(partList, sharedObj); break; case "RCS": list = RCSValue.PartsToList(partList, sharedObj); break; case "SENSORS": list = SensorValue.PartsToList(partList, sharedObj); break; case "ELEMENTS": list = ElementValue.PartsToList(partList, sharedObj); break; case "DOCKINGPORTS": list = DockingPortValue.PartsToList(partList, sharedObj); break; case "DECOUPLERS": case "SEPARATORS": list = DecouplerValue.PartsToList(partList, sharedObj); break; } return(list); }
private void ConstructPart(global::Part part, PartValue parent, DecouplerValue decoupler) { if (part.State == PartStates.DEAD || part.transform == null) { return; } PartValue self = null; foreach (var module in part.Modules) { var engine = module as IEngineStatus; if (engine != null) { self = new EngineValue(Shared, part, parent, decoupler); break; } if (module is IStageSeparator) { var dock = module as ModuleDockingNode; if (dock != null) { var port = new DockingPortValue(Shared, part, parent, decoupler, dock); self = port; dockingPorts.Add(port); if (!module.StagingEnabled()) { break; } decoupler = port; decouplers.Add(decoupler); } else { // ignore anything with staging disabled and continue the search // this can e.g. be heat shield or some sensor with integrated decoupler if (!module.StagingEnabled()) { continue; } if (module is LaunchClamp) { self = decoupler = new LaunchClampValue(Shared, part, parent, decoupler); } else if (module is ModuleDecouple || module is ModuleAnchoredDecoupler) { self = decoupler = new DecouplerValue(Shared, part, parent, decoupler); } else // ModuleServiceModule ? { continue; // rather continue the search } decouplers.Add(decoupler); } // ignore leftover decouplers if (decoupler == null || decoupler.Part.inverseStage >= StageManager.CurrentStage) { break; } // check if we just created closer decoupler (see StageValues.CreatePartSet) if (nextDecoupler == null || decoupler.Part.inverseStage > nextDecoupler.Part.inverseStage) { nextDecoupler = decoupler; } break; } var sensor = module as ModuleEnviroSensor; if (sensor != null) { self = new SensorValue(Shared, part, parent, decoupler, sensor); break; } } if (self == null) { self = new PartValue(Shared, part, parent, decoupler); } if (rootPart == null) { rootPart = self; } partCache[part] = self; allParts.Add(self); foreach (var child in part.children) { ConstructPart(child, self, decoupler); } self.Children.IsReadOnly = true; }
private void InitializeSuffixes() { AddSuffix("NAME", new SetSuffix <StringValue>(() => dockedVesselInfo.name, SetName)); AddSuffix("UID", new Suffix <StringValue>(() => dockedVesselInfo.rootPartUId.ToString())); AddSuffix("VESSEL", new Suffix <VesselTarget>(() => VesselTarget.CreateOrGetExisting(parts[0].vessel, shared))); AddSuffix("PARTS", new Suffix <ListValue>(() => PartValueFactory.Construct(parts, shared))); AddSuffix("DOCKINGPORTS", new Suffix <ListValue>(() => DockingPortValue.PartsToList(parts, shared))); AddSuffix(new string[] { "DECOUPLERS", "SEPARATORS" }, new Suffix <ListValue>(() => DecouplerValue.PartsToList(parts, shared))); AddSuffix("RESOURCES", new Suffix <ListValue>(GetResourceManifest)); }
private void ConstructPart(global::Part part, PartValue parent, DecouplerValue decoupler) { if (part.State == PartStates.DEAD || part.transform == null) { return; } // Modules can be in any order, so to enforce some sort of priority for parts which are multiple types, // gather all potential modules and then select from those valid. IEngineStatus engine = null; ModuleRCS rcs = null; PartValue separator = null; ModuleEnviroSensor sensor = null; foreach (var module in part.Modules) { if (module is IEngineStatus) { engine = module as IEngineStatus; } else if (module is ModuleRCS) { rcs = module as ModuleRCS; } else if (module is IStageSeparator) { var dock = module as ModuleDockingNode; if (dock != null) { var port = new DockingPortValue(Shared, part, parent, decoupler, dock); separator = port; dockingPorts.Add(port); if (!module.StagingEnabled()) { continue; } decoupler = port; decouplers.Add(decoupler); } // ignore anything with staging disabled and continue the search // this can e.g. be heat shield or some sensor with integrated decoupler else { if (!module.StagingEnabled()) { continue; } if (module is LaunchClamp) { separator = decoupler = new LaunchClampValue(Shared, part, parent, decoupler); } else if (module is ModuleDecouple || module is ModuleAnchoredDecoupler) { separator = decoupler = new DecouplerValue(Shared, part, parent, decoupler); } else // ModuleServiceModule ? { continue; // rather continue the search } decouplers.Add(decoupler); } // ignore leftover decouplers if (decoupler == null || decoupler.Part.inverseStage >= StageManager.CurrentStage) { continue; } // check if we just created closer decoupler (see StageValues.CreatePartSet) if (nextDecoupler == null || decoupler.Part.inverseStage > nextDecoupler.Part.inverseStage) { nextDecoupler = decoupler; } } else if (module is ModuleEnviroSensor) { sensor = module as ModuleEnviroSensor; } } // Select part value in priority order PartValue self; if (engine != null) { self = new EngineValue(Shared, part, parent, decoupler); } else if (rcs != null) { self = new RCSValue(Shared, part, parent, decoupler, rcs); } else if (separator != null) { self = separator; } else if (sensor != null) { self = new SensorValue(Shared, part, parent, decoupler, sensor); } else { self = new PartValue(Shared, part, parent, decoupler); } if (rootPart == null) { rootPart = self; } partCache[part] = self; allParts.Add(self); foreach (var child in part.children) { ConstructPart(child, self, decoupler); } self.Children.IsReadOnly = true; }