コード例 #1
0
        public override void UpdateAfterSimulation10()
        {
            base.UpdateAfterSimulation10();
            if (CubeGrid.GridSystems.PowerDistributor.PowerState != m_oldPowerState)
            {
                m_oldPowerState = CubeGrid.GridSystems.PowerDistributor.PowerState;
                UpdateEmissivity();
            }

            m_oldPowerState = CubeGrid.GridSystems.PowerDistributor.PowerState;
        }
コード例 #2
0
        public override void UpdateAfterSimulation10()
        {
            base.UpdateAfterSimulation10();
            if (CubeGrid.GridSystems.PowerDistributor.PowerState != m_oldPowerState)
            {
                m_oldPowerState = CubeGrid.GridSystems.PowerDistributor.PowerState;
                UpdateEmissivity();
            }

            m_oldPowerState = CubeGrid.GridSystems.PowerDistributor.PowerState;
        }
コード例 #3
0
        /// <summary>
        /// Recomputes power distribution in subset of all priority groups (in range
        /// from startPriorityIdx until the end). Passing index 0 recomputes all priority groups.
        /// </summary>
        private void RecomputePowerDistributionPartial(int startPriorityIdx, float availablePower)
        {
            int i = startPriorityIdx;
            for (; i < m_consumersByPriority.Length; ++i)
            {
                var priorityGroup = m_consumersByPriority[i];

                m_consumerDataByPriority[i].AvailablePower = availablePower;

                if (m_consumerDataByPriority[i].RequiredInput <= availablePower)
                {
                    // Run everything in the group at max.
                    availablePower -= m_consumerDataByPriority[i].RequiredInput;
                    foreach (var consumer in priorityGroup)
                        consumer.PowerReceiver.SetInputFromDistributor(consumer.PowerReceiver.RequiredInput);
                }
                else if (m_consumerDataByPriority[i].IsPowerAdaptible && availablePower > 0.0f)
                {
                    // Distribute power in this group based on ratio of its requirement vs. group requirement.
                    foreach (var consumer in priorityGroup)
                    {
                        float ratio = consumer.PowerReceiver.RequiredInput / m_consumerDataByPriority[i].RequiredInput;
                        consumer.PowerReceiver.SetInputFromDistributor(ratio * availablePower);
                    }
                    availablePower = 0.0f;
                }
                else
                {
                    // Not enough power for this group and members can't adapt.
                    // None of the lower priority groups will get any power either.
                    foreach (var consumer in priorityGroup)
                        consumer.PowerReceiver.SetInputFromDistributor(0.0f);
                    m_consumerDataByPriority[i].AvailablePower = availablePower;
                    ++i; // move on to next group
                    break;
                }
            }

            // Set remaining data.
            for (; i < m_consumerDataByPriority.Length; ++i)
            {
                m_consumerDataByPriority[i].AvailablePower = 0.0f;
                foreach (var consumer in m_consumersByPriority[i])
                    consumer.PowerReceiver.SetInputFromDistributor(0.0f);
            }

            for (int j = 0; j < m_producersByPriority.Length; ++j)
            {
                Debug.Assert(availablePower < m_maxAvailablePower || m_maxAvailablePower == 0.0f || MyUtils.IsZero(m_maxAvailablePower - availablePower, MyMathConstants.EPSILON * m_maxAvailablePower));
                var group = m_producersByPriority[j];
                var groupData = m_producerDataByPriority[j];
                if (groupData.MaxAvailablePower > 0f)
                {
                    var inUse = m_maxAvailablePower - availablePower;
                    groupData.UsageRatio = Math.Min(1f, inUse / groupData.MaxAvailablePower);
                    availablePower += groupData.UsageRatio * groupData.MaxAvailablePower;
                }
                else
                    groupData.UsageRatio = 0f;

                groupData.ActiveCount = 0;
                foreach (var producer in group)
                {
                    if (producer.Enabled && producer.HasCapacityRemaining)
                    {
                        ++groupData.ActiveCount;
                        producer.CurrentPowerOutput = groupData.UsageRatio * producer.MaxPowerOutput;
                    }
                }
                m_producerDataByPriority[j] = groupData;
            }

            if (MaxAvailablePower == 0.0f)
                PowerState = MyPowerStateEnum.NoPower;
            else if (TotalRequiredInput > MaxAvailablePower)
            {
                var lastGroup = m_consumerDataByPriority.Last();
                if (lastGroup.IsPowerAdaptible && lastGroup.AvailablePower != 0.0f)
                    PowerState = MyPowerStateEnum.OverloadAdaptible;
                else
                    PowerState = MyPowerStateEnum.OverloadBlackout;
            }
            else
                PowerState = MyPowerStateEnum.Ok;
        }
コード例 #4
0
 void PowerDistributor_PowerStateChaged(MyPowerStateEnum newState)
 {
     UpdateIsWorking();
     UpdateEmissivity();
 }
コード例 #5
0
        /// <summary>
        /// Recomputes power distribution in subset of all priority groups (in range
        /// from startPriorityIdx until the end). Passing index 0 recomputes all priority groups.
        /// </summary>
        private void RecomputePowerDistributionPartial(int startPriorityIdx, float availablePower)
        {
            int i = startPriorityIdx;

            for (; i < m_consumersByPriority.Length; ++i)
            {
                var priorityGroup = m_consumersByPriority[i];

                m_consumerDataByPriority[i].AvailablePower = availablePower;

                if (m_consumerDataByPriority[i].RequiredInput <= availablePower)
                {
                    // Run everything in the group at max.
                    availablePower -= m_consumerDataByPriority[i].RequiredInput;
                    foreach (var consumer in priorityGroup)
                    {
                        consumer.PowerReceiver.SetInputFromDistributor(consumer.PowerReceiver.RequiredInput);
                    }
                }
                else if (m_consumerDataByPriority[i].IsPowerAdaptible && availablePower > 0.0f)
                {
                    // Distribute power in this group based on ratio of its requirement vs. group requirement.
                    foreach (var consumer in priorityGroup)
                    {
                        float ratio = consumer.PowerReceiver.RequiredInput / m_consumerDataByPriority[i].RequiredInput;
                        consumer.PowerReceiver.SetInputFromDistributor(ratio * availablePower);
                    }
                    availablePower = 0.0f;
                }
                else
                {
                    // Not enough power for this group and members can't adapt.
                    // None of the lower priority groups will get any power either.
                    foreach (var consumer in priorityGroup)
                    {
                        consumer.PowerReceiver.SetInputFromDistributor(0.0f);
                    }
                    m_consumerDataByPriority[i].AvailablePower = availablePower;
                    ++i; // move on to next group
                    break;
                }
            }

            // Set remaining data.
            for (; i < m_consumerDataByPriority.Length; ++i)
            {
                m_consumerDataByPriority[i].AvailablePower = 0.0f;
                foreach (var consumer in m_consumersByPriority[i])
                {
                    consumer.PowerReceiver.SetInputFromDistributor(0.0f);
                }
            }

            for (int j = 0; j < m_producersByPriority.Length; ++j)
            {
                Debug.Assert(availablePower < m_maxAvailablePower || m_maxAvailablePower == 0.0f || MyUtils.IsZero(m_maxAvailablePower - availablePower, MyMathConstants.EPSILON * m_maxAvailablePower));
                var group     = m_producersByPriority[j];
                var groupData = m_producerDataByPriority[j];
                if (groupData.MaxAvailablePower > 0f)
                {
                    var inUse = m_maxAvailablePower - availablePower;
                    groupData.UsageRatio = Math.Min(1f, inUse / groupData.MaxAvailablePower);
                    availablePower      += groupData.UsageRatio * groupData.MaxAvailablePower;
                }
                else
                {
                    groupData.UsageRatio = 0f;
                }

                groupData.ActiveCount = 0;
                foreach (var producer in group)
                {
                    if (producer.Enabled && producer.HasCapacityRemaining)
                    {
                        ++groupData.ActiveCount;
                        producer.CurrentPowerOutput = groupData.UsageRatio * producer.MaxPowerOutput;
                    }
                }
                m_producerDataByPriority[j] = groupData;
            }

            if (MaxAvailablePower == 0.0f)
            {
                PowerState = MyPowerStateEnum.NoPower;
            }
            else if (TotalRequiredInput > MaxAvailablePower)
            {
                var lastGroup = m_consumerDataByPriority.Last();
                if (lastGroup.IsPowerAdaptible && lastGroup.AvailablePower != 0.0f)
                {
                    PowerState = MyPowerStateEnum.OverloadAdaptible;
                }
                else
                {
                    PowerState = MyPowerStateEnum.OverloadBlackout;
                }
            }
            else
            {
                PowerState = MyPowerStateEnum.Ok;
            }
        }
コード例 #6
0
 void PowerDistributor_PowerStateChaged(MyPowerStateEnum newState)
 {
     UpdateIsWorking();
     UpdateEmissivity();
 }