void PrepData(ThrusterDataHandler.ThrusterData data)
        {
            EmissiveMaterialName = data.EmissiveMaterialName;

            OnColor            = data.OnColor;
            OffColor           = data.OffColor;
            NonWorkingColor    = data.NotWorkingColor;
            NonFunctionalColor = data.NonFunctionalColor;

            ThrusterOn_EmissiveMultiplier            = data.ThrusterOnEmissiveMultiplier;
            ThrusterOff_EmissiveMultiplier           = data.ThrusterOffEmissiveMultiplier;
            ThrusterNotWorking_EmissiveMultiplier    = data.ThrusterNotWorkingEmissiveMultiplier;
            ThrusterNonFunctional_EmissiveMultiplier = data.ThrusterNonFunctionalEmissiveMultiplier;

            ChangeColorByThrustOutput       = data.ChangeColorByThrustOutput;
            AntiFlickerThreshold            = data.AntiFlickerThreshold;
            ColorAtMaxThrust                = data.ColorAtMaxThrust;
            MaxThrust_EmissiveMultiplierMin = data.MaxThrust_EmissiveMultiplierMin;
            MaxThrust_EmissiveMultiplierMax = data.MaxThrust_EmissiveMultiplierMax;

            //ErrorColor = data.ErrorColor;
            //CurrentColor = data.CurrentColor;
        }
        public override void UpdateOnceBeforeFrame()
        {
            if (block == null) // Null check all the things.
            {
                return;
            }

            blockSubtypeID = block.BlockDefinition.SubtypeId;

            if (EXPERIMENTAL)
            {
                var blockDefinition = block.SlimBlock.BlockDefinition as MyThrustDefinition;

                DefaultFlameIdleColor = blockDefinition.FlameIdleColor;
                DefaultFlameFullColor = blockDefinition.FlameFullColor;

                block.Model.GetDummies(ModelDummy);
                if (ModelDummy.ContainsKey("flame_light_inner"))
                {
                    DummyCount++;
                    LightInnerDummyPos = ModelDummy["flame_light_inner"].Matrix.Translation;
                }
                if (ModelDummy.ContainsKey("flame_light_outer"))
                {
                    DummyCount++;
                    LightOuterDummyPos = ModelDummy["flame_light_outer"].Matrix.Translation;
                }
            }

            //subpart = block.GetSubpart(subpartName);
            block.TryGetSubpart(subpartName, out subpart);

            MyThrusterData        = ThrusterDataInstance.GetThrusterData(blockSubtypeID);
            EmissiveMaterialCount = MyThrusterData.Count;

            foreach (var data in MyThrusterData)
            {
                PrepData(data);
                if (ChangeColorByThrustOutput)
                {
                    // Load data as new instance, set defaults where needed, check for errors or missing values and set to defaults as well.
                    DynamicData = new ThrusterDataHandler.ThrusterData();

                    DynamicData.EmissiveMaterialName = data.EmissiveMaterialName;
                    DynamicData.OnColor                                 = data.OnColor;
                    DynamicData.OffColor                                = data.OffColor;
                    DynamicData.NotWorkingColor                         = data.NotWorkingColor;
                    DynamicData.NonFunctionalColor                      = data.NonFunctionalColor;
                    DynamicData.ThrusterOnEmissiveMultiplier            = data.ThrusterOnEmissiveMultiplier;
                    DynamicData.ThrusterOffEmissiveMultiplier           = data.ThrusterOffEmissiveMultiplier;
                    DynamicData.ThrusterNotWorkingEmissiveMultiplier    = data.ThrusterNotWorkingEmissiveMultiplier;
                    DynamicData.ThrusterNonFunctionalEmissiveMultiplier = data.ThrusterNonFunctionalEmissiveMultiplier;
                    DynamicData.ChangeColorByThrustOutput               = data.ChangeColorByThrustOutput;
                    DynamicData.AntiFlickerThreshold                    = data.AntiFlickerThreshold;
                    DynamicData.ColorAtMaxThrust                        = data.ColorAtMaxThrust;
                    DynamicData.MaxThrust_EmissiveMultiplierMin         = data.MaxThrust_EmissiveMultiplierMin;
                    DynamicData.MaxThrust_EmissiveMultiplierMax         = data.MaxThrust_EmissiveMultiplierMax;
                    DynamicData.ErrorColor                              = data.ErrorColor;
                    DynamicData.CurrentColor                            = data.CurrentColor;

                    DynamicData.ActiveColor      = data.OnColor;
                    DynamicData.InactiveColor    = data.NonFunctionalColor;
                    DynamicData.ActiveGlow       = data.ThrusterOnEmissiveMultiplier;
                    DynamicData.InactiveGlow     = data.ThrusterNonFunctionalEmissiveMultiplier;
                    DynamicData.ThrusterStatus   = 0f;
                    DynamicData.ThrusterStrength = 0f;

                    if (data.ThrusterStatusRampUp == 0f)
                    {
                        data.ThrusterStatusRampUp = 0.005f;
                    }
                    DynamicData.ThrusterStatusRampUp = data.ThrusterStatusRampUp;

                    if (data.ThrusterStatusRampDown == 0f)
                    {
                        data.ThrusterStatusRampDown = 0.005f;
                    }
                    DynamicData.ThrusterStatusRampDown = data.ThrusterStatusRampDown;

                    if (data.ThrusterStrengthRampUp == 0f)
                    {
                        data.ThrusterStrengthRampUp = 0.005f;
                    }
                    DynamicData.ThrusterStrengthRampUp = data.ThrusterStrengthRampUp;

                    if (data.ThrusterStrengthRampDown == 0f)
                    {
                        data.ThrusterStrengthRampDown = 0.005f;
                    }
                    DynamicData.ThrusterStrengthRampDown = data.ThrusterStrengthRampDown;

                    if (data.ThrusterOffRampDown == 0f)
                    {
                        data.ThrusterOffRampDown = 0.005f;
                    }
                    DynamicData.ThrusterOffRampDown = data.ThrusterOffRampDown;

                    if (data.ThrusterNotWorkingRampDown == 0f)
                    {
                        data.ThrusterNotWorkingRampDown = 0.005f;
                    }
                    DynamicData.ThrusterNotWorkingRampDown = data.ThrusterNotWorkingRampDown;

                    if (data.ThrusterNonFunctionalRampDown == 0f)
                    {
                        data.ThrusterNonFunctionalRampDown = 0.005f;
                    }
                    DynamicData.ThrusterNonFunctionalRampDown = data.ThrusterNonFunctionalRampDown;

                    DynamicThrusterData.Add(DynamicData);
                }
                else
                {
                    StaticThrusterData.Add(data);
                    CheckAndSetEmissives();
                }
            }

            if (DynamicThrusterData.Any())
            {
                NeedsUpdate = MyEntityUpdateEnum.EACH_FRAME;
            }

            // Hook to events.
            block.IsWorkingChanged  += IsWorkingChanged;
            block.PropertiesChanged += PropertiesChanged;
        }