void IParserEventSubscriber.Apply(ConfigNode node)
            {
                // If this body needs orbit controllers, create them
                if (generatedBody.orbitDriver == null)
                {
                    generatedBody.orbitDriver = generatedBody.celestialBody.gameObject.AddComponent<OrbitDriver>();
                    generatedBody.orbitRenderer = generatedBody.celestialBody.gameObject.AddComponent<OrbitRenderer>();
                }

                // Setup orbit
                generatedBody.orbitDriver.updateMode = OrbitDriver.UpdateMode.UPDATE;
                orbit = generatedBody.orbitDriver.orbit;
                referenceBody = orbit?.referenceBody?.name;
                float[] bounds = new float[] { generatedBody.orbitRenderer.lowerCamVsSmaRatio, generatedBody.orbitRenderer.upperCamVsSmaRatio };
                cameraSmaRatioBounds = bounds;

                // Remove null
                if (orbit == null) orbit = new Orbit();
            }
        // Readers
        List<double[]> ReadCurve(FloatCurve curve)
        {
            ConfigNode config = new ConfigNode();
            List<double[]> list = new List<double[]>();
            NumericCollectionParser<double> value = new NumericCollectionParser<double>();

            curve.Save(config);

            foreach (string k in config.GetValues("key"))
            {
                value.SetFromString(k);
                list.Add(value.value.ToArray());
            }

            return list;
        }