Пример #1
0
        protected override void OnCleanUp()
        {
            FlowMgr.RemoveConduitUpdater(this.OnConduitUpdate);
            NetworkMgr.RemoveFromNetworks(this.OutputCell2, this.OutputItem2, true);

            base.OnCleanUp();
        }
Пример #2
0
        protected virtual void OnConduitUpdate(float data)
        {
            if (!FlowMgr.HasConduit(this.InputCell) || !FlowMgr.HasConduit(this.OutputCell))
            {
            }
            else
            {
                ConduitFlow.Conduit         conduit  = FlowMgr.GetConduit(this.InputCell);
                ConduitFlow.ConduitContents contents = conduit.GetContents(FlowMgr);
                float massSrc = Mathf.Min(contents.mass, this.DesiredFlow);
                if (massSrc > 0)
                {
                    int disease_count = (int)((massSrc / contents.mass) * contents.diseaseCount);
                    var massMoved     = FlowMgr.AddElement(this.OutputCell, contents.element, massSrc, contents.temperature, contents.diseaseIdx, disease_count);
                    MassMoved += massMoved;
                    if (massMoved > 0)
                    {
                        FlowMgr.RemoveElement(this.InputCell, massMoved);

                        DesiredFlow -= massMoved;
                    }
                }
            }

            this.UpdateAnim();
        }
Пример #3
0
        protected override void OnCleanUp()
        {
            FlowMgr.RemoveConduitUpdater(this.OnConduitUpdate);
            NetworkMgr.RemoveFromNetworks(this.OutputCell2, this.OutputItem2, true);

            //if (this.partitionerEntry.IsValid() && (GameScenePartitioner.Instance != null))
            //    GameScenePartitioner.Instance.Free(ref this.partitionerEntry);

            base.OnCleanUp();
        }
Пример #4
0
        protected override void OnSpawn()
        {
            try
            {
                base.OnSpawn();

                Validate();

                InputCell   = this.Building.GetUtilityInputCell();
                OutputCell1 = this.Building.GetUtilityOutputCell();
                OutputCell2 = Grid.OffsetCell(Grid.PosToCell(transform.GetPosition()), this.Building.GetRotatedOffset(OutputPort2Info.offset));

                OutputItem2 = new FlowUtilityNetwork.NetworkItem(this.ConduitType, Endpoint.Source, OutputCell2, gameObject);

                NetworkMgr.AddToNetworks(OutputCell2, OutputItem2, true);

                this.GetComponent <ConduitConsumer>().isConsuming = false;

                FlowMgr.AddConduitUpdater(OnConduitUpdate);

                #region no idea what these do, just copy from game codes ElementFilter.OnSpawn()

                //((KSelectable)((Component)this).GetComponent<KSelectable>()).SetStatusItem(Db.Get().StatusItemCategories.Main, TemperatureFilterProcess.filterStatusItem, (object)this);

                //this.UpdateConduitExistsStatus();
                this.UpdateConduitBlockedStatus();

                //ScenePartitionerLayer layer = (ScenePartitionerLayer)null;
                //switch (this.ConduitType)
                //{
                //    case ConduitType.Gas:
                //        layer = GameScenePartitioner.Instance.gasConduitsLayer;
                //        break;
                //    case ConduitType.Liquid:
                //        layer = GameScenePartitioner.Instance.liquidConduitsLayer;
                //        break;
                //    case ConduitType.Solid:
                //        layer = GameScenePartitioner.Instance.solidConduitsLayer;
                //        break;
                //}
                //if (layer == null)
                //    return;

                //this.partitionerEntry = GameScenePartitioner.Instance.Add("TemperatureFilterProcessConduitExists", this.gameObject, OutputCell2, layer, (System.Action<object>)(data => this.UpdateConduitExistsStatus()));

                #endregion
            }
            catch (Exception ex)
            {
                KelmenUtils.Log("TemperatureFilterProcess.OnSpawn", ex);
                throw ex;
            }
        }
Пример #5
0
        //void UpdateConduitExistsStatus()
        //{
        //    bool outputCell2IsConnected = RequireOutputs.IsConnected(this.OutputCell2, this.ConduitType);
        //    StatusItem outputConduit2Status;

        //    var buildingStatus = Db.Get().BuildingStatusItems;
        //    switch (this.ConduitType)
        //    {
        //        case ConduitType.Gas:
        //            outputConduit2Status = buildingStatus.NeedGasOut;
        //            break;
        //        case ConduitType.Liquid:
        //            outputConduit2Status = buildingStatus.NeedLiquidOut;
        //            break;
        //        case ConduitType.Solid:
        //            outputConduit2Status = buildingStatus.NeedSolidOut;
        //            break;
        //        default:
        //            throw new ArgumentOutOfRangeException();
        //    }

        //    bool outputConduit2StatusIsEmpty = (this.OutputConduit2StatusGuid != Guid.Empty);
        //    if (outputCell2IsConnected != outputConduit2StatusIsEmpty)
        //        return;

        //    this.OutputConduit2StatusGuid = this.Selectable.ToggleStatusItem(outputConduit2Status, this.OutputConduit2StatusGuid, !outputCell2IsConnected);
        //}

        void UpdateConduitBlockedStatus()
        {
            bool outputConduit2IsEmpty = FlowMgr.IsConduitEmpty(this.OutputCell2);
            bool blockageDetected      = (this.ConduitBlockedStatusItemGuid != Guid.Empty);

            if (outputConduit2IsEmpty != blockageDetected)
            {
                return;
            }

            StatusItem blockedMultiples = Db.Get().BuildingStatusItems.ConduitBlockedMultiples;

            this.ConduitBlockedStatusItemGuid = this.Selectable.ToggleStatusItem(blockedMultiples, this.ConduitBlockedStatusItemGuid, !outputConduit2IsEmpty);
        }
Пример #6
0
        protected override void OnSpawn()
        {
            base.OnSpawn();

            Building component = GetComponent <Building>();

            InputCell  = component.GetUtilityInputCell();
            OutputCell = component.GetUtilityOutputCell();

            FlowMgr.AddConduitUpdater(OnConduitUpdate);

            DataOnSpawn();

            this.UpdateAnim();
            this.OnCmpEnable();
        }
Пример #7
0
        void OnConduitUpdate(float data)
        {
            try
            {
                bool setActive = false;
                this.UpdateConduitBlockedStatus();

                if (this.Operation.IsOperational)
                {
                    var inputContent = FlowMgr.GetContents(InputCell);
                    if ((inputContent.mass > 0) && (inputContent.element != SimHashes.Vacuum))
                    {
                        var filterData    = this;
                        int outputCellIdx = filterData.GetOutputRouteIdx(inputContent.temperature, this.OutputCell1, this.OutputCell2);

                        if (FlowMgr.IsConduitEmpty(outputCellIdx))
                        {
                            var outputContent = FlowMgr.GetContents(outputCellIdx);

                            /// ConduitFlow.AddElement() included these (similar) chks:
                            ///     (outputContent.mass >= this.ConduitMassMax)
                            ///     (!inputContent.element.Equals(outputContent.element))
                            ///

                            float elementMoved = FlowMgr.AddElement(outputCellIdx
                                                                    , inputContent.element, inputContent.mass, inputContent.temperature, inputContent.diseaseIdx, inputContent.diseaseCount);

                            if (elementMoved > 0)
                            {
                                FlowMgr.RemoveElement(this.InputCell, elementMoved);
                            }
                        }
                        //else
                        //{
                        //    /// partial transfer not catered in (core) ElementFilter.OnConduitTick, don't break core design.
                        //}
                    }
                }

                this.Operation.SetActive(setActive, false);
            }
            catch (Exception ex)
            {
                KelmenUtils.Log("TemperatureFilterProcess.OnConduitUpdate", ex);
                throw ex;
            }
        }
Пример #8
0
        protected override void OnSpawn()
        {
            try
            {
                base.OnSpawn();

                InputCell = Building.GetUtilityInputCell();

                OutputCell1 = Building.GetUtilityOutputCell();

                OutputCell2 = Grid.OffsetCell(Grid.PosToCell(transform.GetPosition()), Building.GetRotatedOffset(OutputPort2Info.offset));

                OutputItem2 = new FlowUtilityNetwork.NetworkItem(this.ConduitType, Endpoint.Source, OutputCell2, gameObject);

                NetworkMgr.AddToNetworks(OutputCell2, OutputItem2, true);

                FlowMgr.AddConduitUpdater(OnConduitUpdate);
            }
            catch (Exception ex)
            {
                KelmenUtils.Log("SolidTemperatureFilterProcess.OnSpawn", ex);
                throw ex;
            }
        }
Пример #9
0
        void OnConduitUpdate(float data)
        {
            try
            {
                if (!this.Operation.IsOperational)
                {
                    return;
                }

                if (FlowMgr.HasConduit(InputCell) && FlowMgr.HasConduit(OutputCell1) && FlowMgr.HasConduit(OutputCell2)
                    &&
                    FlowMgr.IsConduitFull(InputCell)
                    //&& FlowMgr.IsConduitEmpty(OutputCell1) && FlowMgr.IsConduitEmpty(OutputCell2)
                    )
                {
                }
                else
                {
                    return;
                }

                var inputContent = FlowMgr.GetPickupable(FlowMgr.GetContents(InputCell).pickupableHandle);
                //var inputContent = FlowMgr.RemovePickupable(InputCell);
                if (inputContent == null)
                {
                    return;
                }

                var inputContent2 = inputContent.PrimaryElement;
                if (inputContent2 == null)
                {
                    return;
                }

                var filterData    = this;
                int outputCellIdx = filterData.GetOutputRouteIdx(inputContent2.Temperature, this.OutputCell1, this.OutputCell2);

                if (outputCellIdx == OutputCell1)
                {
                    if (FlowMgr.IsConduitFull(OutputCell1))
                    {
                        return;
                    }
                    else //if (outputCellIdx == OutputCell2)
                    if (FlowMgr.IsConduitFull(OutputCell2))
                    {
                        return;
                    }
                }

                //var outputTgt = FlowMgr.GetContents(outputCellIdx);
                //if (outputTgt.pickupableHandle.IsValid())
                //    return;

                inputContent = FlowMgr.RemovePickupable(InputCell);
                FlowMgr.AddPickupable(outputCellIdx, inputContent);

                this.Operation.SetActive(false);
            }
            catch (Exception ex)
            {
                KelmenUtils.Log("SolidTemperatureFilterProcess.OnConduitUpdate", ex);
                throw ex;
            }
        }
Пример #10
0
 protected override void OnCleanUp()
 {
     FlowMgr.RemoveConduitUpdater(OnConduitUpdate);
     MassMoved = 0;
     base.OnCleanUp();
 }