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;
        }
Exemple #3
0
        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;
        }
Exemple #5
0
 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));
 }
Exemple #6
0
        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;
        }