private object NewProxy(Type interfaceType)
 {
     IConduit conduit = new Conduit(interfaceType);
     conduits.Add(conduit);
     return conduit.Proxy;
 }
Beispiel #2
0
 protected override void OnCleanUp()
 {
     Conduit.GetFlowManager(conduitType).RemoveConduitUpdater(ConduitUpdate);
     base.OnCleanUp();
 }
Beispiel #3
0
        public static void RequestFluidFromChannel(ValveBase requestor, int channelNo)
        {
            Logger.LogFormat("==Entry WarpSpaceManager.RequestFluidFromChannel(requestor={0}, channelNo={1})", requestor.GetInstanceID(), channelNo);
            try
            {
                ConduitFlow flowManager = null;
                if (requestor.conduitType == LiquidWarpConfig.CONDUIT_TYPE)
                {
                    flowManager = Conduit.GetFlowManager(ConduitType.Liquid);
                }
                else if (requestor.conduitType == GasWarpConfig.CONDUIT_TYPE)
                {
                    flowManager = Conduit.GetFlowManager(ConduitType.Gas);
                }
                else
                {
                    Logger.Log("unable to determine correct ConduitType.");
                    return;
                }

                ValveChannels channels = getChannelsForConduitType(requestor.conduitType);
                ValvesList    providers;

                if (!channels.TryGetValue(channelNo, out providers) || (providers.Count == 0))
                {
                    Logger.LogFormat("No providers for channel {0} found.", channelNo);
                    return;
                }

                ValveBase provider = providers.getNext();
                ValveBase start    = provider;
                if (null == provider)
                {
                    Logger.Log("You should never see this message! provider is null");
                    return;
                }
                int toCell = (int)valveBaseOutputCellFieldInfo.GetValue(requestor);
                ConduitFlow.ConduitContents requestorContents = flowManager.GetContents(toCell);
                // Fill input cell from various providers, in case when provider's conduit is not full
                do
                {
                    Logger.LogFormat("Trying to request from valveBase {0}", provider.GetInstanceID());
                    int fromCell = (int)valveBaseInputCellFieldInfo.GetValue(provider);
                    if (provider != requestor && flowManager.HasConduit(fromCell))
                    {
                        ConduitFlow.ConduitContents providerContents = flowManager.GetContents(fromCell);
                        float addedMass = flowManager.AddElement(toCell, providerContents.element, providerContents.mass, providerContents.temperature, providerContents.diseaseIdx, providerContents.diseaseCount);
                        Game.Instance.accumulators.Accumulate(provider.AccumulatorHandle, addedMass);
                        if (addedMass > 0f)
                        {
                            Logger.LogFormat("Adding Element to cell: requestor={0} provider={1} actually added mass={2}, element type={3}", requestor.GetInstanceID(), provider.GetInstanceID(), addedMass, providerContents.element);
                            flowManager.RemoveElement(fromCell, addedMass);
                            Game.Instance.accumulators.Accumulate(requestor.AccumulatorHandle, addedMass);
                        }
                    }
                    if (flowManager.IsConduitFull(toCell))
                    {
                        break;
                    }
                    provider = providers.getNext();
                } while (provider != start);
            }
            catch (Exception ex)
            {
                Logger.LogFormat("Exception in WarpSpaceManager.RequestFluidFromChannel: {0}\n{1}", ex.Message, ex.StackTrace);
            }
            Logger.Log("==Exit WarpSpaceManager.RequestFluidFromChannel");
        }
Beispiel #4
0
    public void UpdateOverlayColours()
    {
        GridArea visibleArea = GridVisibleArea.GetVisibleArea();
        Diseases diseases    = Db.Get().Diseases;
        Color32  color       = new Color32(0, 0, 0, byte.MaxValue);

        for (int i = 0; i < headers.Count; i++)
        {
            DiseaseContainer       payload    = payloads[i];
            DiseaseHeader          header     = headers[i];
            KBatchedAnimController controller = payload.controller;
            if ((UnityEngine.Object)controller != (UnityEngine.Object)null)
            {
                Color32 c        = color;
                Vector3 position = controller.transform.GetPosition();
                if (visibleArea.Min <= (Vector2)position && (Vector2)position <= visibleArea.Max)
                {
                    int num           = 0;
                    int disease_idx   = 255;
                    int disease_count = 0;
                    GetVisualDiseaseIdxAndCount(header, ref payload, out disease_idx, out disease_count);
                    if (disease_idx != 255)
                    {
                        c   = diseases[disease_idx].overlayColour;
                        num = disease_count;
                    }
                    if (payload.isContainer)
                    {
                        Storage           component = header.primaryElement.GetComponent <Storage>();
                        List <GameObject> items     = component.items;
                        for (int j = 0; j < items.Count; j++)
                        {
                            GameObject gameObject = items[j];
                            if ((UnityEngine.Object)gameObject != (UnityEngine.Object)null)
                            {
                                HandleVector <int> .Handle handle = GetHandle(gameObject);
                                if (handle.IsValid())
                                {
                                    DiseaseHeader header2 = GetHeader(handle);
                                    if (header2.diseaseCount > num && header2.diseaseIdx != 255)
                                    {
                                        num = header2.diseaseCount;
                                        c   = diseases[header2.diseaseIdx].overlayColour;
                                    }
                                }
                            }
                        }
                    }
                    c.a = SimUtil.DiseaseCountToAlpha254(num);
                    if (payload.conduitType != 0)
                    {
                        ConduitFlow flowManager = Conduit.GetFlowManager(payload.conduitType);
                        int         cell        = Grid.PosToCell(position);
                        ConduitFlow.ConduitContents contents = flowManager.GetContents(cell);
                        if (contents.diseaseIdx != 255 && contents.diseaseCount > num)
                        {
                            num = contents.diseaseCount;
                            c   = diseases[contents.diseaseIdx].overlayColour;
                            c.a = byte.MaxValue;
                        }
                    }
                }
                controller.OverlayColour = c;
            }
        }
    }
            public FindIntersection(
                FamilyInstance jbox,
                UIDocument uiDoc)
            {
                XYZ jboxPoint = (jbox.Location
                                 as LocationPoint).Point;

                FilteredElementCollector filteredCloserConduits
                    = new FilteredElementCollector(uiDoc.Document);

                List <Element> listOfCloserConduit
                    = filteredCloserConduits
                      .OfClass(typeof(Conduit))
                      .ToList()
                      .Where(x
                             => ((x as Conduit).Location as LocationCurve).Curve
                             .GetEndPoint(0).DistanceTo(jboxPoint) < 30 ||
                             ((x as Conduit).Location as LocationCurve).Curve
                             .GetEndPoint(1).DistanceTo(jboxPoint) < 30)
                      .ToList();

                // getting the location of the box and all conduit around.

                Options opt = new Options();

                opt.View = uiDoc.ActiveView;
                GeometryElement geoEle = jbox.get_Geometry(opt);

                // getting the geometry of the element to
                // access the geometry of the instance.

                foreach (GeometryObject geomObje1 in geoEle)
                {
                    GeometryElement geoInstance = (geomObje1
                                                   as GeometryInstance).GetInstanceGeometry();

                    // the geometry of the family instance can be
                    // accessed by this method that returns a
                    // GeometryElement type. so we must get the
                    // GeometryObject again to access the Face of
                    // the family instance.

                    if (geoInstance != null)
                    {
                        foreach (GeometryObject geomObje2 in geoInstance)
                        {
                            Solid geoSolid = geomObje2 as Solid;
                            if (geoSolid != null)
                            {
                                foreach (Face face in geoSolid.Faces)
                                {
                                    foreach (Element cond in listOfCloserConduit)
                                    {
                                        Conduit             con      = cond as Conduit;
                                        Curve               conCurve = (con.Location as LocationCurve).Curve;
                                        SetComparisonResult set      = face.Intersect(conCurve);
                                        if (set.ToString() == "Overlap")
                                        {
                                            //getting the conduit the intersect the box.

                                            GetListOfConduits.Add(con);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
Beispiel #6
0
        //helper method to ittereate thru connectors of a run
        private List <ElementId> E_AddConduitAndNeighborFittingsToSelection(Conduit conduit, List <ElementId> elementsInConduitRun)
        {
            Document doc = this.Document;

            ConnectorSet connectors = conduit.ConnectorManager.Connectors;
            string       str        = "";

            //Get Conduit and its neighbor connected fitting elements
            foreach (Connector con in connectors)
            {
                if (con.IsConnected)
                {
                    if (!elementsInConduitRun.Contains(con.Owner.Id))
                    {
                        elementsInConduitRun.Add(con.Owner.Id);
                        str += "Conduit: " + con.Owner.Id.ToString() + "\n";
                    }
                    ConnectorSet refs = con.AllRefs;
                    foreach (Connector conRef in refs)
                    {
                        if (conRef.IsConnected)
                        {
                            if (!elementsInConduitRun.Contains(conRef.Owner.Id))
                            {
                                elementsInConduitRun.Add(conRef.Owner.Id);
                                str += "Conduit Fitting: " + conRef.Owner.Id.ToString() + "\n";

                                //Get the fittings neighbor conduit and recall the main method
                                Categories     categories = doc.Settings.Categories;
                                ElementId      conduitFittingCategoryId = categories.get_Item(BuiltInCategory.OST_ConduitFitting).Id;
                                FamilyInstance fi = conRef.Owner as FamilyInstance;
                                if (fi != null && fi.Category.Id == conduitFittingCategoryId)
                                {
                                    ConnectorSet cons = fi.MEPModel.ConnectorManager.Connectors;
                                    foreach (Connector c2 in cons)
                                    {
                                        ConnectorSet c2Refs = c2.AllRefs;
                                        foreach (Connector c2Ref in c2Refs)
                                        {
                                            if (!elementsInConduitRun.Contains(c2Ref.Owner.Id))
                                            {
                                                str += "Conduit: " + c2Ref.Owner.Id.ToString() + "\n";
                                                Conduit c = c2Ref.Owner as Conduit;
                                                if (c != null)
                                                {
                                                    //TaskDialog.Show("Before Call", elementsInConduitRun.Count.ToString());
                                                    elementsInConduitRun = E_AddConduitAndNeighborFittingsToSelection(c, elementsInConduitRun);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    //str += "\n";
                }
            }



            //TaskDialog.Show("All Itereated Conduit Info last", str + "\n" + "\n" + elementsInConduitRun.Count.ToString());
            return(elementsInConduitRun);
        }
Beispiel #7
0
        public float GetSliderMax(int index)
        {
            var flowManager = Conduit.GetFlowManager(GetComponent <TeleStorage>().Type);

            return(Traverse.Create(flowManager).Field("MaxMass").GetValue <float>() * GramsPerKilogram);
        }
Beispiel #8
0
        private void ConvertMass()
        {
            SimUtil.DiseaseInfo diseaseInfo = SimUtil.DiseaseInfo.Invalid;
            diseaseInfo.idx   = byte.MaxValue;
            diseaseInfo.count = 0;

            float speedMultiplier = GetSpeedMultiplier();

            // Accumulators
            float oxygenMass      = 0f;
            float hydrogenMass    = 0f;
            float bleachStoneMass = 0f;

            float totalConsumedAmount  = 0f;
            float waterConsumptionRate = Config.waterConsumptionRate * speedMultiplier;

            Tag dirtyWaterTag = SimHashes.DirtyWater.CreateTag();
            Tag saltWaterTag  = SimHashes.SaltWater.CreateTag();
            Tag brineTag      = SimHashes.Brine.CreateTag();

            bool isDirty = false;

            for (int i = 0; i < storage.items.Count; i++)
            {
                GameObject storageItem = storage.items[i];
                if (storageItem != null && storageItem.HasTag(GameTags.AnyWater))
                {
                    PrimaryElement element = storageItem.GetComponent <PrimaryElement>();

                    //element.KeepZeroMassObject = true;
                    float consumedAmount     = Mathf.Min(waterConsumptionRate, element.Mass);
                    float consumedPercentage = consumedAmount / element.Mass;

                    int diseaseCount = (int)(consumedPercentage * element.DiseaseCount);

                    element.Mass -= consumedAmount;
                    element.ModifyDiseaseCount(-diseaseCount, "IndustrialElectrolyzer.ConvertMass");

                    if (storageItem.HasTag(saltWaterTag))
                    {
                        // 93% H2O
                        oxygenMass   += consumedAmount * Config.saltWater2WaterRatio * Config.water2OxygenRatio;
                        hydrogenMass += consumedAmount * Config.saltWater2WaterRatio * Config.water2HydrogenRatio;
                        // 7% NaCl
                        bleachStoneMass += consumedAmount * Config.saltWater2SaltRatio * Config.salt2BleachStoneRatio;
                    }
                    else if (storageItem.HasTag(brineTag))
                    {
                        // 70% H2O
                        oxygenMass   += consumedAmount * Config.brine2WaterRatio * Config.water2OxygenRatio;
                        hydrogenMass += consumedAmount * Config.brine2WaterRatio * Config.water2HydrogenRatio;
                        // 30% NaCl
                        bleachStoneMass += consumedAmount * Config.brine2SaltRatio * Config.salt2BleachStoneRatio;
                    }
                    else
                    {
                        oxygenMass   += consumedAmount * Config.water2OxygenRatio;
                        hydrogenMass += consumedAmount * Config.water2HydrogenRatio;
                    }

                    totalConsumedAmount += consumedAmount;

                    if (storageItem.HasTag(dirtyWaterTag) && consumedAmount > EPSILON)
                    {
                        isDirty = true;
                    }

                    diseaseInfo = SimUtil.CalculateFinalDiseaseInfo(diseaseInfo.idx, diseaseInfo.count, element.DiseaseIdx, element.DiseaseCount);

                    waterConsumptionRate -= consumedAmount;
                    if (waterConsumptionRate <= 0f)
                    {
                        Debug.Assert(waterConsumptionRate <= 0f);
                        break;
                    }
                }
            }

            float temperature = GetComponent <PrimaryElement>().Temperature;

            if (onConvertMass != null && totalConsumedAmount > EPSILON)
            {
                onConvertMass(totalConsumedAmount);
            }

            ConduitFlow gasFlowManager = Conduit.GetFlowManager(portInfo.conduitType);

            SimHashes oxygenHash      = isDirty ? SimHashes.ContaminatedOxygen : SimHashes.Oxygen;
            float     oxygenGenerated = gasFlowManager.AddElement(oxygenOutputCell, oxygenHash, oxygenMass * speedMultiplier, Mathf.Max(Config.oxygenTemperature, temperature), diseaseInfo.idx, diseaseInfo.count / 2);

            ReportManager.Instance.ReportValue(ReportManager.ReportType.OxygenCreated, oxygenGenerated, gameObject.GetProperName());
            Game.Instance.accumulators.Accumulate(OxygenAccumulator, oxygenGenerated);

            float hydrogenGenerated = gasFlowManager.AddElement(hydrogenOutputCell, SimHashes.Hydrogen, hydrogenMass * speedMultiplier, Mathf.Max(Config.hydrogenTemperature, temperature), diseaseInfo.idx, diseaseInfo.count / 2);

            Game.Instance.accumulators.Accumulate(HydrogenAccumulator, hydrogenGenerated);

            if (bleachStoneMass > EPSILON)
            {
                Element bleachStone = ElementLoader.FindElementByHash(SimHashes.BleachStone);

                Vector3 position = building.GetRotatedOffset(new CellOffset(1, 0)).ToVector3() + new Vector3(.5f, .5f, .0f) + transform.position;
                UnityEngine.Debug.Log("[AE] transform is at " + transform.position);
                UnityEngine.Debug.Log("[AE] exit is at " + position);

                bleachStone.substance.SpawnResource(position, bleachStoneMass, temperature, diseaseInfo.idx, diseaseInfo.count);
            }

            storage.Trigger((int)GameHashes.OnStorageChange, gameObject);
        }
Beispiel #9
0
    protected override void OnCompleteWork(Worker worker)
    {
        float num  = 0f;
        float num2 = 0f;
        bool  flag = true;

        foreach (GameObject item in storage.items)
        {
            if (!((UnityEngine.Object)item == (UnityEngine.Object)null))
            {
                PrimaryElement component = item.GetComponent <PrimaryElement>();
                if (!((UnityEngine.Object)component == (UnityEngine.Object)null))
                {
                    num  += component.Mass;
                    num2 += component.Temperature * component.Mass;
                    flag  = (flag && component.HasTag(GameTags.Liquifiable));
                }
            }
        }
        if (num <= 0f)
        {
            DebugUtil.LogWarningArgs(base.gameObject, "uhhh this constructable is about to generate a nan", "Item Count: ", storage.items.Count);
        }
        else
        {
            if (flag)
            {
                initialTemperature = Mathf.Min(num2 / num, 318.15f);
            }
            else
            {
                initialTemperature = Mathf.Clamp(num2 / num, 288.15f, 318.15f);
            }
            KAnimGraphTileVisualizer component2  = GetComponent <KAnimGraphTileVisualizer>();
            UtilityConnections       connections = (!((UnityEngine.Object)component2 == (UnityEngine.Object)null)) ? component2.Connections : ((UtilityConnections)0);
            if (IsReplacementTile)
            {
                int        cell = Grid.PosToCell(base.transform.GetLocalPosition());
                GameObject replacementCandidate = building.Def.GetReplacementCandidate(cell);
                if ((UnityEngine.Object)replacementCandidate != (UnityEngine.Object)null)
                {
                    SimCellOccupier component3 = replacementCandidate.GetComponent <SimCellOccupier>();
                    if ((UnityEngine.Object)component3 != (UnityEngine.Object)null)
                    {
                        component3.DestroySelf(delegate
                        {
                            if ((UnityEngine.Object) this != (UnityEngine.Object)null && (UnityEngine.Object)base.gameObject != (UnityEngine.Object)null)
                            {
                                FinishConstruction(connections);
                            }
                        });
                    }
                    else
                    {
                        Conduit component4 = replacementCandidate.GetComponent <Conduit>();
                        if ((UnityEngine.Object)component4 != (UnityEngine.Object)null)
                        {
                            ConduitFlow flowManager = component4.GetFlowManager();
                            flowManager.MarkForReplacement(cell);
                        }
                        BuildingComplete component5 = replacementCandidate.GetComponent <BuildingComplete>();
                        if ((UnityEngine.Object)component5 != (UnityEngine.Object)null)
                        {
                            component5.Subscribe(-21016276, delegate
                            {
                                FinishConstruction(connections);
                            });
                        }
                        else
                        {
                            Debug.LogWarning("Why am I trying to replace a: " + replacementCandidate.name);
                            FinishConstruction(connections);
                        }
                    }
                    KAnimGraphTileVisualizer component6 = replacementCandidate.GetComponent <KAnimGraphTileVisualizer>();
                    if ((UnityEngine.Object)component6 != (UnityEngine.Object)null)
                    {
                        component6.skipCleanup = true;
                    }
                    PrimaryElement component7   = replacementCandidate.GetComponent <PrimaryElement>();
                    float          mass         = component7.Mass;
                    float          temperature  = component7.Temperature;
                    byte           diseaseIdx   = component7.DiseaseIdx;
                    int            diseaseCount = component7.DiseaseCount;
                    Debug.Assert(component7.Element != null && component7.Element.tag != (Tag)null);
                    Deconstructable.SpawnItem(component7.transform.GetPosition(), component7.GetComponent <Building>().Def, component7.Element.tag, mass, temperature, diseaseIdx, diseaseCount);
                    replacementCandidate.Trigger(1606648047, building.Def.TileLayer);
                    replacementCandidate.DeleteObject();
                }
            }
            else
            {
                FinishConstruction(connections);
            }
            PopFXManager.Instance.SpawnFX(PopFXManager.Instance.sprite_Building, GetComponent <KSelectable>().GetName(), base.transform, 1.5f, false);
        }
    }
Beispiel #10
0
 /// <summary>
 /// Adds the new conduit.
 /// </summary>
 /// <param name="doc"></param>
 /// <param name="typeId"></param>
 /// <param name="start"></param>
 /// <param name="end"></param>
 /// <param name="lvlId"></param>
 /// <returns></returns>
 public static Conduit AddConduit(this Document doc, ElementId typeId, XYZ start, XYZ end, ElementId lvlId)
 {
     return(Conduit.Create(doc, typeId, start, end, lvlId));
 }
Beispiel #11
0
        public Result Execute(ExternalCommandData revit, ref string message, ElementSet elements)
        {
            try
            {
                var document = revit.Application.ActiveUIDocument.Document;
                GetSomeShit(document, out string error);

                if (error != null)
                {
                    TaskDialog.Show("Ошибка", error);
                    return(Result.Succeeded);
                }

                var systemsByEquipmentIds = new Dictionary <ElementId, List <ElementId> >();

                foreach (var system in ElectricalSystems)
                {
                    var equipment = system.BaseEquipment;
                    if (equipment == null)
                    {
                        continue;
                    }
                    if (!systemsByEquipmentIds.ContainsKey(equipment.Id))
                    {
                        systemsByEquipmentIds.Add(equipment.Id, new List <ElementId>());
                    }
                    systemsByEquipmentIds[equipment.Id].Add(system.Id);
                }

                var conduitTypes = new Dictionary <string, ElementId>();
                foreach (ConduitType type in ConduitTypes)
                {
                    conduitTypes.Add(type.FamilyName + ": " + type.Name, type.Id);
                }

                var gui = new UserForm(document, systemsByEquipmentIds, conduitTypes);

                if (gui.ShowDialog() != DialogResult.OK)
                {
                    return(Result.Cancelled);
                }

                var conduitTypeId = gui.SelectedConduitType;
                var electricalCircuitsWithLevelId = new List <Tuple <ElementId, List <XYZ> > >();
                foreach (var systemId in gui.SelectedCircuits)
                {
                    var system  = (ElectricalSystem)document.GetElement(systemId);
                    var circuit = system.GetCircuitPath().ToList();
                    electricalCircuitsWithLevelId.Add(new Tuple <ElementId, List <XYZ> >(system.LevelId, circuit));
                }

                Transaction tr = new Transaction(document, "Создание коробов по электрической цепи");
                tr.Start();

                foreach (var x in electricalCircuitsWithLevelId)
                {
                    var createdConduits = new List <Conduit>();
                    for (var i = 0; i < x.Item2.Count() - 1; i++)
                    {
                        var startPoint = new XYZ(
                            Math.Min(x.Item2[i].X, x.Item2[i + 1].X) - 0.01,
                            Math.Min(x.Item2[i].Y, x.Item2[i + 1].Y) - 0.01,
                            Math.Min(x.Item2[i].Z, x.Item2[i + 1].Z) - 0.01
                            );
                        var endPoint = new XYZ(
                            Math.Max(x.Item2[i].X, x.Item2[i + 1].X) + 0.01,
                            Math.Max(x.Item2[i].Y, x.Item2[i + 1].Y) + 0.01,
                            Math.Max(x.Item2[i].Z, x.Item2[i + 1].Z) + 0.01
                            );
                        var myOutLn  = new Outline(startPoint, endPoint);
                        var conduits = new List <ElementId>();
                        if (!myOutLn.IsEmpty)
                        {
                            var filter    = new BoundingBoxIsInsideFilter(myOutLn);
                            var collector = new FilteredElementCollector(document);
                            conduits = collector
                                       .WherePasses(filter)
                                       .OfClass(typeof(Conduit))
                                       .Cast <Conduit>()
                                       .Select(a => a.Id)
                                       .ToList();
                        }
                        document.Delete(conduits);
                        var conduit = Conduit.Create(document, conduitTypeId, x.Item2.ElementAt(i), x.Item2.ElementAt(i + 1), x.Item1);
                        createdConduits.Add(conduit);
                    }

                    //for (var i = 0; i < createdConduits.Count() - 1; i++)
                    //{
                    //    var connector1 = new Connector();
                    //    var connector2;
                    //    foreach (Connector c in createdConduits.ElementAt(i).ConnectorManager.Connectors)
                    //    {
                    //        // моя тут сломался фмгня получается
                    //        connector1 = c;
                    //        break;
                    //    }
                    //    foreach (Connector c in createdConduits.ElementAt(i+1).ConnectorManager.Connectors)
                    //    {
                    //
                    //        connector2 = c;
                    //        break;
                    //    }
                    //    document.Create.NewElbowFitting(
                    //        connector1,
                    //        connector2);
                    //}
                }

                tr.Commit();
                return(Result.Succeeded);
            }
            catch (Exception e)
            {
                TaskDialog.Show("Error", e.ToString());
                return(Result.Failed);
            }
            return(Result.Succeeded);
        }
Beispiel #12
0
 /// <summary>
 /// Applied after OnSpawn runs.
 /// </summary>
 internal static void Postfix(Conduit __instance)
 {
     __instance.gameObject.AddOrGet <FindMismatchedPipe>();
 }
Beispiel #13
0
        private static bool Prefix(ValveBase __instance, float dt)
        {
            //Debug.Log(" === ValveBase.ConduitUpdate(" + dt + ") Prefix " + __instance.conduitType);
            if (__instance.conduitType != (ConduitType)100 && __instance.conduitType != (ConduitType)101)
            {
                return(true);
            }

            FieldInfo fi1 = AccessTools.Field(typeof(ValveBase), "inputCell");
            FieldInfo fi2 = AccessTools.Field(typeof(ValveBase), "outputCell");
            FieldInfo fi3 = AccessTools.Field(typeof(ValveBase), "flowAccumulator");

            ConduitFlow flowManager = null;

            //Debug.Log("ConduitUpdate " + dt);
            if (__instance.conduitType == (ConduitType)100)
            {
                flowManager = Conduit.GetFlowManager(ConduitType.Liquid);
            }
            else if (__instance.conduitType == (ConduitType)101)
            {
                flowManager = Conduit.GetFlowManager(ConduitType.Gas);
            }

            ConduitFlow.Conduit conduit = flowManager.GetConduit((int)fi1.GetValue(__instance));

            if (!flowManager.HasConduit((int)fi1.GetValue(__instance)) || !flowManager.HasConduit((int)fi2.GetValue(__instance)))
            {
                __instance.UpdateAnim();
            }

            if ((int)fi1.GetValue(__instance) > 0 && flowManager.HasConduit((int)fi1.GetValue(__instance)) &&
                ((int)fi2.GetValue(__instance) > 0 && !flowManager.HasConduit((int)fi2.GetValue(__instance))))
            {
                ConduitFlow.ConduitContents contents = conduit.GetContents(flowManager);
                //float num = Mathf.Min(contents.mass, this.currentFlow * dt);
                FieldInfo fi = AccessTools.Field(typeof(ValveBase), "currentFlow");
                //float num = Mathf.Min(contents.mass, (float)fi.GetValue(this) * dt);
                float num = Mathf.Min(contents.mass, 10f * dt);
                //Debug.Log("ConduitUpdate " + num);
                if (num > 0f)
                {
                    float num2          = num / contents.mass;
                    int   disease_count = (int)(num2 * (float)contents.diseaseCount);

                    //Debug.Log("List " + num);

                    if (__instance.conduitType == (ConduitType)100)
                    {
                        LiquidWarpData.LiquidPackets.Add(new PacketData((int)__instance.conduitType, (float)fi.GetValue(__instance), (int)fi2.GetValue(__instance), contents.element, num, contents.temperature, contents.diseaseIdx, disease_count));
                    }
                    else if (__instance.conduitType == (ConduitType)101)
                    {
                        GasWarpData.GasPackets.Add(new PacketData((int)__instance.conduitType, (float)fi.GetValue(__instance), (int)fi2.GetValue(__instance), contents.element, num, contents.temperature, contents.diseaseIdx, disease_count));
                    }

                    //float num3 = flowManager.AddElement(this.outputCell, contents.element, num, contents.temperature, contents.diseaseIdx, disease_count);
                    //Game.Instance.accumulators.Accumulate(this.flowAccumulator, num3);

                    //float num3 = Mathf.Min(num, 10f - contents.mass);
                    float num3 = num;
                    if (num3 > 0f)
                    {
                        flowManager.RemoveElement((int)fi1.GetValue(__instance), num3);
                    }
                }
                __instance.UpdateAnim();
                return(false);
            }


            if ((int)fi2.GetValue(__instance) > 0 && flowManager.HasConduit((int)fi2.GetValue(__instance)))
            {
                ConduitFlow.Conduit conduitO = flowManager.GetConduit((int)fi2.GetValue(__instance));
                FieldInfo           fi       = AccessTools.Field(typeof(ValveBase), "currentFlow");

                PacketData toRemove = null;

                foreach (PacketData packet in LiquidWarpData.LiquidPackets)
                {
                    //Debug.Log("currentFlow = " + (float)fi.GetValue(__instance) + ", packet.currentFlow = " + packet.current_flow);
                    if ((float)fi.GetValue(__instance) == packet.current_flow &&
                        (int)__instance.conduitType == packet.content_type)
                    {
                        float num3 = flowManager.AddElement((int)fi2.GetValue(__instance), packet.element, packet.mass, packet.temperature, packet.disease_idx, packet.disease_count);
                        //Debug.Log("Adding Element to pipe: " + packet.mass + "," + num3);
                        Game.Instance.accumulators.Accumulate((HandleVector <int> .Handle)fi3.GetValue(__instance), num3);
                        toRemove = packet;
                        break;
                    }
                }

                if (toRemove != null)
                {
                    LiquidWarpData.LiquidPackets.Remove(toRemove);
                    toRemove = null;
                }

                foreach (PacketData packet in GasWarpData.GasPackets)
                {
                    //Debug.Log("currentFlow = " + (float)fi.GetValue(__instance) + ", packet.currentFlow = " + packet.current_flow);
                    if ((float)fi.GetValue(__instance) == packet.current_flow &&
                        (int)__instance.conduitType == packet.content_type)
                    {
                        float num3 = flowManager.AddElement((int)fi2.GetValue(__instance), packet.element, packet.mass, packet.temperature, packet.disease_idx, packet.disease_count);
                        //Debug.Log("Adding Element to pipe: " + packet.mass + "," + num3);
                        Game.Instance.accumulators.Accumulate((HandleVector <int> .Handle)fi3.GetValue(__instance), num3);
                        toRemove = packet;
                        break;
                    }
                }

                if (toRemove != null)
                {
                    GasWarpData.GasPackets.Remove(toRemove);
                    toRemove = null;
                }

                __instance.UpdateAnim();
                return(false);
            }

            return(false);
        }
Beispiel #14
0
 protected override void OnCleanUp()
 {
     Conduit.GetFlowManager(Type).RemoveConduitUpdater(ConduitUpdate);
     TeleStorageData.Instance.storageContainers.Remove(this);
     base.OnCleanUp();
 }
Beispiel #15
0
        /// <summary>
        /// 选择模型中的线管或者电气设备
        /// </summary>
        /// <returns></returns>
        private bool SelectCabinet_Conduit(UIDocument uidoc, out FamilyInstance cabinet, out Conduit conduit)
        {
            cabinet = null;
            conduit = null;

            Document doc = uidoc.Document;

            try
            {
                //
                var machineRef = uidoc.Selection.PickObject(ObjectType.Element, new SelectionFilter_Cabinet_Conduit(),
                                                            "选择线管或者电气设备。");
                var pickedEle = doc.GetElement(machineRef);

                //选择线管。
                if (IsCabinet(pickedEle))
                {
                    cabinet = pickedEle as FamilyInstance;
                    //
                    machineRef = uidoc.Selection.PickObject(ObjectType.Element, new SelectionFilter_Conduit(), "选择线管。");
                    conduit    = doc.GetElement(machineRef) as Conduit;
                    return(true);
                }
                else if (IsConduit(pickedEle))
                {
                    conduit = pickedEle as Conduit;

                    //选择电气设备
                    machineRef = uidoc.Selection.PickObject(ObjectType.Element, new SelectionFilter_Cabinet(), "选择电气设备。");
                    cabinet    = doc.GetElement(machineRef) as FamilyInstance;
                    return(true);
                }
            }
            catch (OperationCanceledException ex)
            {
                return(false);
            }
            return(false);
        }
Beispiel #16
0
 protected override void OnCleanUp()
 {
     Conduit.GetFlowManager(type).RemoveConduitUpdater(ConduitUpdate);
     Game.Instance.accumulators.Remove(accumulator);
     base.OnCleanUp();
 }
Beispiel #17
0
 internal static void Postfix(Conduit __instance)
 {
     __instance.gameObject.AddOrGet <Pressurized>();
 }
Beispiel #18
0
 public ConduitLine(Conduit conduit)
 {
     Line             = conduit;
     ConnectorManager = conduit.ConnectorManager;
 }
Beispiel #19
0
        private void ConduitUpdate(float dt)
        {
            var flowManager = Conduit.GetFlowManager(Type);

            if (!flowManager.HasConduit(_inputCell) || !IsOperational)
            {
                return;
            }

            var contents = flowManager.GetContents(_inputCell);

            if (contents.mass <= 0.0)
            {
                return;
            }

            var contentOutput1 = flowManager.GetContents(_outputCell);
            var contentOutput2 = flowManager.GetContents(_secondaryOutputCell);

            var maxMass  = Type == ConduitType.Liquid ? 10f : 1f;
            var halfMass = contents.mass / 2f;

            var willFitInOutput1 = maxMass - contentOutput1.mass;
            var willFitInOutput2 = maxMass - contentOutput2.mass;

            float delta1 = 0;
            float delta2 = 0;

            if (Math.Abs(willFitInOutput1) < 0.001f && Math.Abs(willFitInOutput2) < 0.001f)
            {
                //do nothing
            }
            else if (!flowManager.HasConduit(_secondaryOutputCell))
            {
                delta1 = flowManager.AddElement(_outputCell, contents.element, contents.mass, contents.temperature,
                                                contents.diseaseIdx, contents.diseaseCount);
            }
            else if (!flowManager.HasConduit(_outputCell))
            {
                delta2 = flowManager.AddElement(_secondaryOutputCell, contents.element, contents.mass, contents.temperature,
                                                contents.diseaseIdx, contents.diseaseCount);
            }
            else if (willFitInOutput1 >= halfMass && willFitInOutput2 >= halfMass)
            {
                delta1 = flowManager.AddElement(_outputCell, contents.element, halfMass, contents.temperature,
                                                contents.diseaseIdx, contents.diseaseCount / 2);
                delta2 = flowManager.AddElement(_secondaryOutputCell, contents.element, halfMass, contents.temperature,
                                                contents.diseaseIdx, contents.diseaseCount / 2);
            }
            else if (willFitInOutput1 < halfMass)
            {
                var overflowOutput1 = halfMass - willFitInOutput1;
                var ratio           = (halfMass - overflowOutput1) / halfMass;
                delta1 = flowManager.AddElement(_outputCell, contents.element, halfMass - overflowOutput1,
                                                contents.temperature, contents.diseaseIdx, (int)((contents.diseaseCount / 2f) * ratio));
                delta2 = flowManager.AddElement(_secondaryOutputCell, contents.element, halfMass + overflowOutput1,
                                                contents.temperature, contents.diseaseIdx, (int)((contents.diseaseCount / 2f) * (1f / ratio)));
            }
            else
            {
                var overflowOutput2 = halfMass - willFitInOutput2;
                var ratio           = (halfMass - overflowOutput2) / halfMass;
                delta1 = flowManager.AddElement(_secondaryOutputCell, contents.element, halfMass - overflowOutput2,
                                                contents.temperature, contents.diseaseIdx, (int)((contents.diseaseCount / 2f) * ratio));
                delta2 = flowManager.AddElement(_outputCell, contents.element, halfMass + overflowOutput2,
                                                contents.temperature, contents.diseaseIdx, (int)((contents.diseaseCount / 2f) * (1f / ratio)));
            }

            flowManager.RemoveElement(_inputCell, delta1);
            flowManager.RemoveElement(_inputCell, delta2);

            Game.Instance.accumulators.Accumulate(_accumulator, contents.mass);
        }