protected override void ReadData(ESPReader reader)
 {
     using (MemoryStream stream = new MemoryStream(reader.ReadBytes(size)))
         using (ESPReader subReader = new ESPReader(stream, reader.Plugin))
         {
             try
             {
                 Unknown = subReader.ReadBytes(16);
                 WaterPropertiesSunPower           = subReader.ReadSingle();
                 WaterPropertiesReflectivityAmount = subReader.ReadSingle();
                 WaterPropertiesFresnelAmount      = subReader.ReadSingle();
                 Unused1 = subReader.ReadBytes(4);
                 FogPropertiesAboveWaterFogNearPlaneDistance = subReader.ReadSingle();
                 FogPropertiesAboveWaterFogFarPlaneDistance  = subReader.ReadSingle();
                 ColorShallow.ReadBinary(subReader);
                 ColorDeep.ReadBinary(subReader);
                 ColorReflection.ReadBinary(subReader);
                 Unused2                                      = subReader.ReadBytes(4);
                 RainSimulatorForce                           = subReader.ReadSingle();
                 RainSimulatorVelocity                        = subReader.ReadSingle();
                 RainSimulatorFalloff                         = subReader.ReadSingle();
                 RainSimulatorDampener                        = subReader.ReadSingle();
                 DisplacementSimulatorStartingSize            = subReader.ReadSingle();
                 DisplacementSimulatorForce                   = subReader.ReadSingle();
                 DisplacementSimulatorVelocity                = subReader.ReadSingle();
                 DisplacementSimulatorFalloff                 = subReader.ReadSingle();
                 DisplacementSimulatorDampener                = subReader.ReadSingle();
                 RainSimulatorStartingSize                    = subReader.ReadSingle();
                 NoisePropertiesNormalsNoiseScale             = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerOneWindDirection    = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerTwoWindDirection    = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerThreeWindDirection  = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerOneWindSpeed        = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerTwoWindSpeed        = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerThreeWindSpeed      = subReader.ReadSingle();
                 NoisePropertiesNormalsDepthFalloffStart      = subReader.ReadSingle();
                 NoisePropertiesNormalsDepthFalloffEnd        = subReader.ReadSingle();
                 FogPropertiesAboveWaterFogAmount             = subReader.ReadSingle();
                 NoisePropertiesNormalsUVScale                = subReader.ReadSingle();
                 FogPropertiesUnderWaterFogAmount             = subReader.ReadSingle();
                 FogPropertiesUnderWaterFogNearPlaneDistance  = subReader.ReadSingle();
                 FogPropertiesUnderWaterFogFarPlaneDistance   = subReader.ReadSingle();
                 WaterPropertiesDistortionAmount              = subReader.ReadSingle();
                 WaterPropertiesShininess                     = subReader.ReadSingle();
                 WaterPropertiesReflectionHDRMult             = subReader.ReadSingle();
                 WaterPropertiesLightRadius                   = subReader.ReadSingle();
                 WaterPropertiesLightBrightness               = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerOneUVScale          = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerTwoUVScale          = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerThreeUVScale        = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerOneAmplitudeScale   = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerTwoAmplitudeScale   = subReader.ReadSingle();
                 NoisePropertiesNoiseLayerThreeAmplitudeScale = subReader.ReadSingle();
             }
             catch
             {
                 return;
             }
         }
 }
        protected override void ReadDataXML(XElement ele, ElderScrollsPlugin master)
        {
            XElement subEle;

            if (ele.TryPathTo("Unknown", false, out subEle))
            {
                Unknown = subEle.ToBytes();
            }

            if (ele.TryPathTo("WaterProperties/SunPower", false, out subEle))
            {
                WaterPropertiesSunPower = subEle.ToSingle();
            }

            if (ele.TryPathTo("WaterProperties/ReflectivityAmount", false, out subEle))
            {
                WaterPropertiesReflectivityAmount = subEle.ToSingle();
            }

            if (ele.TryPathTo("WaterProperties/FresnelAmount", false, out subEle))
            {
                WaterPropertiesFresnelAmount = subEle.ToSingle();
            }

            ReadUnused1XML(ele, master);

            if (ele.TryPathTo("FogProperties/AboveWater/FogNearPlaneDistance", false, out subEle))
            {
                FogPropertiesAboveWaterFogNearPlaneDistance = subEle.ToSingle();
            }

            if (ele.TryPathTo("FogProperties/AboveWater/FogFarPlaneDistance", false, out subEle))
            {
                FogPropertiesAboveWaterFogFarPlaneDistance = subEle.ToSingle();
            }

            if (ele.TryPathTo("Color/Shallow", false, out subEle))
            {
                ColorShallow.ReadXML(subEle, master);
            }

            if (ele.TryPathTo("Color/Deep", false, out subEle))
            {
                ColorDeep.ReadXML(subEle, master);
            }

            if (ele.TryPathTo("Color/Reflection", false, out subEle))
            {
                ColorReflection.ReadXML(subEle, master);
            }

            ReadUnused2XML(ele, master);

            if (ele.TryPathTo("RainSimulator/Force", false, out subEle))
            {
                RainSimulatorForce = subEle.ToSingle();
            }

            if (ele.TryPathTo("RainSimulator/Velocity", false, out subEle))
            {
                RainSimulatorVelocity = subEle.ToSingle();
            }

            if (ele.TryPathTo("RainSimulator/Falloff", false, out subEle))
            {
                RainSimulatorFalloff = subEle.ToSingle();
            }

            if (ele.TryPathTo("RainSimulator/Dampener", false, out subEle))
            {
                RainSimulatorDampener = subEle.ToSingle();
            }

            if (ele.TryPathTo("DisplacementSimulator/StartingSize", false, out subEle))
            {
                DisplacementSimulatorStartingSize = subEle.ToSingle();
            }

            if (ele.TryPathTo("DisplacementSimulator/Force", false, out subEle))
            {
                DisplacementSimulatorForce = subEle.ToSingle();
            }

            if (ele.TryPathTo("DisplacementSimulator/Velocity", false, out subEle))
            {
                DisplacementSimulatorVelocity = subEle.ToSingle();
            }

            if (ele.TryPathTo("DisplacementSimulator/Falloff", false, out subEle))
            {
                DisplacementSimulatorFalloff = subEle.ToSingle();
            }

            if (ele.TryPathTo("DisplacementSimulator/Dampener", false, out subEle))
            {
                DisplacementSimulatorDampener = subEle.ToSingle();
            }

            if (ele.TryPathTo("RainSimulator/StartingSize", false, out subEle))
            {
                RainSimulatorStartingSize = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/Normals/NoiseScale", false, out subEle))
            {
                NoisePropertiesNormalsNoiseScale = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerOne/WindDirection", false, out subEle))
            {
                NoisePropertiesNoiseLayerOneWindDirection = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerTwo/WindDirection", false, out subEle))
            {
                NoisePropertiesNoiseLayerTwoWindDirection = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerThree/WindDirection", false, out subEle))
            {
                NoisePropertiesNoiseLayerThreeWindDirection = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerOne/WindSpeed", false, out subEle))
            {
                NoisePropertiesNoiseLayerOneWindSpeed = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerTwo/WindSpeed", false, out subEle))
            {
                NoisePropertiesNoiseLayerTwoWindSpeed = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerThree/WindSpeed", false, out subEle))
            {
                NoisePropertiesNoiseLayerThreeWindSpeed = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/Normals/DepthFalloff/Start", false, out subEle))
            {
                NoisePropertiesNormalsDepthFalloffStart = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/Normals/DepthFalloff/End", false, out subEle))
            {
                NoisePropertiesNormalsDepthFalloffEnd = subEle.ToSingle();
            }

            if (ele.TryPathTo("FogProperties/AboveWater/FogAmount", false, out subEle))
            {
                FogPropertiesAboveWaterFogAmount = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/Normals/UVScale", false, out subEle))
            {
                NoisePropertiesNormalsUVScale = subEle.ToSingle();
            }

            if (ele.TryPathTo("FogProperties/UnderWater/FogAmount", false, out subEle))
            {
                FogPropertiesUnderWaterFogAmount = subEle.ToSingle();
            }

            if (ele.TryPathTo("FogProperties/UnderWater/FogNearPlaneDistance", false, out subEle))
            {
                FogPropertiesUnderWaterFogNearPlaneDistance = subEle.ToSingle();
            }

            if (ele.TryPathTo("FogProperties/UnderWater/FogFarPlaneDistance", false, out subEle))
            {
                FogPropertiesUnderWaterFogFarPlaneDistance = subEle.ToSingle();
            }

            if (ele.TryPathTo("WaterProperties/DistortionAmount", false, out subEle))
            {
                WaterPropertiesDistortionAmount = subEle.ToSingle();
            }

            if (ele.TryPathTo("WaterProperties/Shininess", false, out subEle))
            {
                WaterPropertiesShininess = subEle.ToSingle();
            }

            if (ele.TryPathTo("WaterProperties/ReflectionHDRMult", false, out subEle))
            {
                WaterPropertiesReflectionHDRMult = subEle.ToSingle();
            }

            if (ele.TryPathTo("WaterProperties/LightRadius", false, out subEle))
            {
                WaterPropertiesLightRadius = subEle.ToSingle();
            }

            if (ele.TryPathTo("WaterProperties/LightBrightness", false, out subEle))
            {
                WaterPropertiesLightBrightness = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerOne/UVScale", false, out subEle))
            {
                NoisePropertiesNoiseLayerOneUVScale = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerTwo/UVScale", false, out subEle))
            {
                NoisePropertiesNoiseLayerTwoUVScale = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerThree/UVScale", false, out subEle))
            {
                NoisePropertiesNoiseLayerThreeUVScale = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerOne/AmplitudeScale", false, out subEle))
            {
                NoisePropertiesNoiseLayerOneAmplitudeScale = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerTwo/AmplitudeScale", false, out subEle))
            {
                NoisePropertiesNoiseLayerTwoAmplitudeScale = subEle.ToSingle();
            }

            if (ele.TryPathTo("NoiseProperties/NoiseLayerThree/AmplitudeScale", false, out subEle))
            {
                NoisePropertiesNoiseLayerThreeAmplitudeScale = subEle.ToSingle();
            }

            if (ele.TryPathTo("Damage", false, out subEle))
            {
                Damage = subEle.ToUInt16();
            }
        }
        protected override void WriteDataXML(XElement ele, ElderScrollsPlugin master)
        {
            XElement subEle;

            ele.TryPathTo("Unknown", true, out subEle);
            subEle.Value = Unknown.ToHex();

            ele.TryPathTo("WaterProperties/SunPower", true, out subEle);
            subEle.Value = WaterPropertiesSunPower.ToString("G15");

            ele.TryPathTo("WaterProperties/ReflectivityAmount", true, out subEle);
            subEle.Value = WaterPropertiesReflectivityAmount.ToString("G15");

            ele.TryPathTo("WaterProperties/FresnelAmount", true, out subEle);
            subEle.Value = WaterPropertiesFresnelAmount.ToString("G15");

            WriteUnused1XML(ele, master);

            ele.TryPathTo("FogProperties/AboveWater/FogNearPlaneDistance", true, out subEle);
            subEle.Value = FogPropertiesAboveWaterFogNearPlaneDistance.ToString("G15");

            ele.TryPathTo("FogProperties/AboveWater/FogFarPlaneDistance", true, out subEle);
            subEle.Value = FogPropertiesAboveWaterFogFarPlaneDistance.ToString("G15");

            ele.TryPathTo("Color/Shallow", true, out subEle);
            ColorShallow.WriteXML(subEle, master);

            ele.TryPathTo("Color/Deep", true, out subEle);
            ColorDeep.WriteXML(subEle, master);

            ele.TryPathTo("Color/Reflection", true, out subEle);
            ColorReflection.WriteXML(subEle, master);

            WriteUnused2XML(ele, master);

            ele.TryPathTo("RainSimulator/Force", true, out subEle);
            subEle.Value = RainSimulatorForce.ToString("G15");

            ele.TryPathTo("RainSimulator/Velocity", true, out subEle);
            subEle.Value = RainSimulatorVelocity.ToString("G15");

            ele.TryPathTo("RainSimulator/Falloff", true, out subEle);
            subEle.Value = RainSimulatorFalloff.ToString("G15");

            ele.TryPathTo("RainSimulator/Dampener", true, out subEle);
            subEle.Value = RainSimulatorDampener.ToString("G15");

            ele.TryPathTo("DisplacementSimulator/StartingSize", true, out subEle);
            subEle.Value = DisplacementSimulatorStartingSize.ToString("G15");

            ele.TryPathTo("DisplacementSimulator/Force", true, out subEle);
            subEle.Value = DisplacementSimulatorForce.ToString("G15");

            ele.TryPathTo("DisplacementSimulator/Velocity", true, out subEle);
            subEle.Value = DisplacementSimulatorVelocity.ToString("G15");

            ele.TryPathTo("DisplacementSimulator/Falloff", true, out subEle);
            subEle.Value = DisplacementSimulatorFalloff.ToString("G15");

            ele.TryPathTo("DisplacementSimulator/Dampener", true, out subEle);
            subEle.Value = DisplacementSimulatorDampener.ToString("G15");

            ele.TryPathTo("RainSimulator/StartingSize", true, out subEle);
            subEle.Value = RainSimulatorStartingSize.ToString("G15");

            ele.TryPathTo("NoiseProperties/Normals/NoiseScale", true, out subEle);
            subEle.Value = NoisePropertiesNormalsNoiseScale.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerOne/WindDirection", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerOneWindDirection.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerTwo/WindDirection", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerTwoWindDirection.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerThree/WindDirection", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerThreeWindDirection.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerOne/WindSpeed", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerOneWindSpeed.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerTwo/WindSpeed", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerTwoWindSpeed.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerThree/WindSpeed", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerThreeWindSpeed.ToString("G15");

            ele.TryPathTo("NoiseProperties/Normals/DepthFalloff/Start", true, out subEle);
            subEle.Value = NoisePropertiesNormalsDepthFalloffStart.ToString("G15");

            ele.TryPathTo("NoiseProperties/Normals/DepthFalloff/End", true, out subEle);
            subEle.Value = NoisePropertiesNormalsDepthFalloffEnd.ToString("G15");

            ele.TryPathTo("FogProperties/AboveWater/FogAmount", true, out subEle);
            subEle.Value = FogPropertiesAboveWaterFogAmount.ToString("G15");

            ele.TryPathTo("NoiseProperties/Normals/UVScale", true, out subEle);
            subEle.Value = NoisePropertiesNormalsUVScale.ToString("G15");

            ele.TryPathTo("FogProperties/UnderWater/FogAmount", true, out subEle);
            subEle.Value = FogPropertiesUnderWaterFogAmount.ToString("G15");

            ele.TryPathTo("FogProperties/UnderWater/FogNearPlaneDistance", true, out subEle);
            subEle.Value = FogPropertiesUnderWaterFogNearPlaneDistance.ToString("G15");

            ele.TryPathTo("FogProperties/UnderWater/FogFarPlaneDistance", true, out subEle);
            subEle.Value = FogPropertiesUnderWaterFogFarPlaneDistance.ToString("G15");

            ele.TryPathTo("WaterProperties/DistortionAmount", true, out subEle);
            subEle.Value = WaterPropertiesDistortionAmount.ToString("G15");

            ele.TryPathTo("WaterProperties/Shininess", true, out subEle);
            subEle.Value = WaterPropertiesShininess.ToString("G15");

            ele.TryPathTo("WaterProperties/ReflectionHDRMult", true, out subEle);
            subEle.Value = WaterPropertiesReflectionHDRMult.ToString("G15");

            ele.TryPathTo("WaterProperties/LightRadius", true, out subEle);
            subEle.Value = WaterPropertiesLightRadius.ToString("G15");

            ele.TryPathTo("WaterProperties/LightBrightness", true, out subEle);
            subEle.Value = WaterPropertiesLightBrightness.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerOne/UVScale", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerOneUVScale.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerTwo/UVScale", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerTwoUVScale.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerThree/UVScale", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerThreeUVScale.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerOne/AmplitudeScale", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerOneAmplitudeScale.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerTwo/AmplitudeScale", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerTwoAmplitudeScale.ToString("G15");

            ele.TryPathTo("NoiseProperties/NoiseLayerThree/AmplitudeScale", true, out subEle);
            subEle.Value = NoisePropertiesNoiseLayerThreeAmplitudeScale.ToString("G15");

            ele.TryPathTo("Damage", true, out subEle);
            subEle.Value = Damage.ToString();
        }
 protected override void WriteData(ESPWriter writer)
 {
     if (Unknown == null)
     {
         writer.Write(new byte[16]);
     }
     else
     {
         writer.Write(Unknown);
     }
     writer.Write(WaterPropertiesSunPower);
     writer.Write(WaterPropertiesReflectivityAmount);
     writer.Write(WaterPropertiesFresnelAmount);
     if (Unused1 == null)
     {
         writer.Write(new byte[4]);
     }
     else
     {
         writer.Write(Unused1);
     }
     writer.Write(FogPropertiesAboveWaterFogNearPlaneDistance);
     writer.Write(FogPropertiesAboveWaterFogFarPlaneDistance);
     ColorShallow.WriteBinary(writer);
     ColorDeep.WriteBinary(writer);
     ColorReflection.WriteBinary(writer);
     if (Unused2 == null)
     {
         writer.Write(new byte[4]);
     }
     else
     {
         writer.Write(Unused2);
     }
     writer.Write(RainSimulatorForce);
     writer.Write(RainSimulatorVelocity);
     writer.Write(RainSimulatorFalloff);
     writer.Write(RainSimulatorDampener);
     writer.Write(DisplacementSimulatorStartingSize);
     writer.Write(DisplacementSimulatorForce);
     writer.Write(DisplacementSimulatorVelocity);
     writer.Write(DisplacementSimulatorFalloff);
     writer.Write(DisplacementSimulatorDampener);
     writer.Write(RainSimulatorStartingSize);
     writer.Write(NoisePropertiesNormalsNoiseScale);
     writer.Write(NoisePropertiesNoiseLayerOneWindDirection);
     writer.Write(NoisePropertiesNoiseLayerTwoWindDirection);
     writer.Write(NoisePropertiesNoiseLayerThreeWindDirection);
     writer.Write(NoisePropertiesNoiseLayerOneWindSpeed);
     writer.Write(NoisePropertiesNoiseLayerTwoWindSpeed);
     writer.Write(NoisePropertiesNoiseLayerThreeWindSpeed);
     writer.Write(NoisePropertiesNormalsDepthFalloffStart);
     writer.Write(NoisePropertiesNormalsDepthFalloffEnd);
     writer.Write(FogPropertiesAboveWaterFogAmount);
     writer.Write(NoisePropertiesNormalsUVScale);
     writer.Write(FogPropertiesUnderWaterFogAmount);
     writer.Write(FogPropertiesUnderWaterFogNearPlaneDistance);
     writer.Write(FogPropertiesUnderWaterFogFarPlaneDistance);
     writer.Write(WaterPropertiesDistortionAmount);
     writer.Write(WaterPropertiesShininess);
     writer.Write(WaterPropertiesReflectionHDRMult);
     writer.Write(WaterPropertiesLightRadius);
     writer.Write(WaterPropertiesLightBrightness);
     writer.Write(NoisePropertiesNoiseLayerOneUVScale);
     writer.Write(NoisePropertiesNoiseLayerTwoUVScale);
     writer.Write(NoisePropertiesNoiseLayerThreeUVScale);
     writer.Write(NoisePropertiesNoiseLayerOneAmplitudeScale);
     writer.Write(NoisePropertiesNoiseLayerTwoAmplitudeScale);
     writer.Write(NoisePropertiesNoiseLayerThreeAmplitudeScale);
     writer.Write(Damage);
 }