internal void InitializeChargers()
        {
            TooLateToRegister = true;
            QuickLogger.Debug("ChargeManager Initializing CyclopsChargers from external mods");

            // First, register chargers from other mods.
            for (int i = 0; i < CyclopsChargerCreators.Count; i++)
            {
                ChargerCreator chargerTemplate = CyclopsChargerCreators[i];
                QuickLogger.Debug($"ChargeManager creating charger '{chargerTemplate.ChargerName}'");
                CyclopsCharger charger = chargerTemplate.Creator.Invoke(Cyclops);

                if (charger == null)
                {
                    QuickLogger.Warning($"CyclopsCharger '{chargerTemplate.ChargerName}' was null");
                }
                else if (!KnownChargers.ContainsKey(chargerTemplate.ChargerName))
                {
                    KnownChargers.Add(chargerTemplate.ChargerName, charger);
                    CyclopsHUDManager.StatusIcons.Add(charger);
                    QuickLogger.Debug($"Created CyclopsCharger '{chargerTemplate.ChargerName}'");
                }
                else
                {
                    QuickLogger.Warning($"Duplicate CyclopsCharger '{chargerTemplate.ChargerName}' was blocked");
                }
            }

            // Check if an external mod has a different upgrade handler for the original CyclopsThermalReactorModule.
            bool requiresVanillaCharging = CyclopsManager.GetManager(ref Cyclops).Upgrade.VanillaUpgrades.IsUsingVanillaUpgrade(TechType.CyclopsThermalReactorModule);

            if (requiresVanillaCharging)
            {
                QuickLogger.Debug("Vanilla thermal reactor charging handled internally");
                var vanillaThermalCharger = new VanillaThermalChargeManager(Cyclops);
                KnownChargers.Add(nameof(VanillaThermalChargeManager), vanillaThermalCharger);
                CyclopsHUDManager.StatusIcons.Add(vanillaThermalCharger);
                MCUServices.Register.PdaIconOverlay(TechType.CyclopsThermalReactorModule,
                                                    (uGUI_ItemIcon icon, InventoryItem upgradeModule) => new VanillaThermalPdaOverlay(icon, upgradeModule));
            }

            this.Chargers = new CyclopsCharger[KnownChargers.Count];

            int c = 0;

            foreach (CyclopsCharger charger in KnownChargers.Values)
            {
                this.Chargers[c++] = charger;
            }

            initialized = true;
        }
        internal void InitializeChargers()
        {
            QuickLogger.Debug("ChargeManager Initializing CyclopsChargers from external mods");

            // First, register chargers from other mods.
            for (int i = 0; i < CyclopsChargerCreators.Count; i++)
            {
                ChargerCreator chargerTemplate = CyclopsChargerCreators[i];
                QuickLogger.Debug($"ChargeManager creating charger '{chargerTemplate.ChargerName}'");
                CyclopsCharger charger = chargerTemplate.Creator.Invoke(Cyclops);

                if (charger == null)
                {
                    QuickLogger.Warning($"CyclopsCharger '{chargerTemplate.ChargerName}' was null");
                }
                else if (!KnownChargers.ContainsKey(chargerTemplate.ChargerName))
                {
                    KnownChargers.Add(chargerTemplate.ChargerName, charger);
                    QuickLogger.Debug($"Created CyclopsCharger '{chargerTemplate.ChargerName}'");
                }
                else
                {
                    QuickLogger.Warning($"Duplicate CyclopsCharger '{chargerTemplate.ChargerName}' was blocked");
                }
            }

            this.Chargers = new CyclopsCharger[KnownChargers.Count];

            int c = 0;

            foreach (CyclopsCharger charger in KnownChargers.Values)
            {
                this.Chargers[c++] = charger;
            }

            totalChargers = c;
            QuickLogger.Debug($"ChargeManager has '{totalChargers}' CyclopsChargers from external mods");

            initialized       = true;
            TooLateToRegister = true;

            requiresVanillaCharging = totalChargers == 0 || CyclopsManager.GetManager(Cyclops).Upgrade.VanillaUpgrades.IsUsingVanillaUpgrade(TechType.CyclopsThermalReactorModule);

            if (requiresVanillaCharging)
            {
                QuickLogger.Info("Vanilla thermal reactor charging enabled");
            }
            else
            {
                QuickLogger.Info("Vanilla thermal reactor charging overridden by mod");
            }
        }
        private void UpdatePowerIcons()
        {
            if (!powerIconsInitialized)
            {
                return;
            }

            if (Time.time < iconUpdateDelay)
            {
                return;
            }

            iconUpdateDelay = Time.time + delayInterval;

            HidePowerIcons();

            if (settings.HidePowerIcons)
            {
                return;
            }

            CyclopsCharger[] cyclopsChargers = this.ChargeManager.Chargers;

            bool isEven = true;

            for (int i = 0; i < cyclopsChargers.Length; i++)
            {
                if (cyclopsChargers[i].ShowStatusIcon)
                {
                    isEven = !isEven;
                }
            }

            Indicator[] helmRow      = isEven ? HelmIndicatorsEven : HelmIndicatorsOdd;
            Indicator[] healthBarRow = isEven ? HealthBarIndicatorsEven : HealthBarIndicatorsOdd;

            bool showIconsOnHoloDisplay = settings.ShowIconsOnHoloDisplay;
            bool showIconsWhilePiloting = settings.ShowIconsWhilePiloting;

            int iconIndex = 0;

            for (int c = 0; c < cyclopsChargers.Length; c++)
            {
                CyclopsCharger charger = cyclopsChargers[c];

                if (!charger.ShowStatusIcon)
                {
                    continue;
                }

                Indicator helmIcon = helmRow[iconIndex];
                Indicator hpIcon   = healthBarRow[iconIndex++];

                hpIcon.SetEnabled(showIconsOnHoloDisplay);
                helmIcon.SetEnabled(showIconsWhilePiloting);

                hpIcon.Icon.sprite = helmIcon.Icon.sprite = charger.StatusSprite();

                hpIcon.Text.enabled = powerIconTextVisibility;
                hpIcon.Text.text    = helmIcon.Text.text = charger.StatusText();

                if (charger.ProvidingPower)
                {
                    hpIcon.Text.color = helmIcon.Text.color = charger.StatusTextColor();
                }
                else
                {
                    hpIcon.Text.color = helmIcon.Text.color = Color.white;
                }
            }
        }
        private void UpdatePowerIcons()
        {
            if (!powerIconsInitialized)
            {
                return;
            }

            if (Time.time < iconUpdateDelay)
            {
                return;
            }

            iconUpdateDelay = Time.time + delayInterval;

            if (settings.ShowThermometer)
            {
                float temperature = Cyclops.GetTemperature();
                TemperatureReadout.Text.text  = NumberFormatter.FormatValue(temperature) + "°C";
                TemperatureReadout.Text.color = GetHeatColor(temperature);
                TemperatureReadout.SetEnabled(true);
            }
            else
            {
                TemperatureReadout.SetEnabled(false);
            }

            if (settings.HidePowerIcons)
            {
                HidePowerIcons();
            }
            else
            {
                CyclopsCharger[] cyclopsChargers = this.ChargeManager.Chargers;

                bool isEven = true;
                for (int i = 0; i < cyclopsChargers.Length; i++)
                {
                    if (cyclopsChargers[i].ShowStatusIcon)
                    {
                        isEven = !isEven;
                    }
                }

                PowerIndicatorIcon[] helmRow      = isEven ? HelmIndicatorsEven : HelmIndicatorsOdd;
                PowerIndicatorIcon[] healthBarRow = isEven ? HealthBarIndicatorsEven : HealthBarIndicatorsOdd;

                bool showIconsOnHoloDisplay = settings.ShowIconsOnHoloDisplay;
                bool showIconsWhilePiloting = settings.ShowIconsWhilePiloting;

                int iconIndex = 0;
                for (int c = 0; c < cyclopsChargers.Length; c++)
                {
                    CyclopsCharger charger = cyclopsChargers[c];

                    if (!charger.ShowStatusIcon)
                    {
                        continue;
                    }

                    PowerIndicatorIcon helmIcon = helmRow[iconIndex];
                    PowerIndicatorIcon hpIcon   = healthBarRow[iconIndex++];

                    hpIcon.SetEnabled(showIconsOnHoloDisplay);
                    helmIcon.SetEnabled(showIconsWhilePiloting);

                    hpIcon.Icon.sprite = helmIcon.Icon.sprite = charger.StatusSprite();

                    hpIcon.Text.enabled = powerIconTextVisibility;
                    hpIcon.Text.text    = helmIcon.Text.text = charger.StatusText();

                    if (charger.ProvidingPower)
                    {
                        hpIcon.Text.color = helmIcon.Text.color = charger.StatusTextColor();
                    }
                    else
                    {
                        hpIcon.Text.color = helmIcon.Text.color = Color.white;
                    }
                }
            }
        }