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; }
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; }
/// <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; }
void PowerDistributor_PowerStateChaged(MyPowerStateEnum newState) { UpdateIsWorking(); UpdateEmissivity(); }
/// <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; } }
void PowerDistributor_PowerStateChaged(MyPowerStateEnum newState) { UpdateIsWorking(); UpdateEmissivity(); }