// Parser Post Apply Event void IParserEventSubscriber.PostApply(ConfigNode node) { // If Debug Mode is null, create default values if (debug == null) debug = new DebugLoader(); if (scaledVersion == null) scaledVersion = new ScaledVersionLoader(); // PQS if (generatedBody.pqsVersion) { // Adjust the radius of the PQSs appropriately foreach (PQS p in generatedBody.pqsVersion.GetComponentsInChildren<PQS>(true)) p.radius = generatedBody.celestialBody.Radius; } // Create a barycenter if (barycenter.value) { // Register the body for post-spawn patching generatedBody.Set("barycenter", true); // Nuke the PQS if (generatedBody.pqsVersion != null) { generatedBody.pqsVersion.transform.parent = null; UnityEngine.Object.Destroy(generatedBody.pqsVersion); generatedBody.pqsVersion = null; } // Stop ScaledSpace Cache scaledVersion.deferMesh = true; } // We need to generate new scaled space meshes if // a) we are using a template and we've change either the radius or type of body // b) we aren't using a template // c) debug mode is active if (!scaledVersion.deferMesh && (((template != null) && (Math.Abs(template.radius - generatedBody.celestialBody.Radius) > 1.0 || template.type != scaledVersion.type.value)) || template == null || debug.update)) { Utility.UpdateScaledMesh(generatedBody.scaledVersion, generatedBody.pqsVersion, generatedBody.celestialBody, ScaledSpaceCacheDirectory, cacheFile, debug.exportMesh, scaledVersion.sphericalModel); } // Visualize the SOI if (debug.showSOI) generatedBody.celestialBody.gameObject.AddComponent<Wiresphere>(); // Loads external parser targets Parser.LoadExternalParserTargets(node, "Kopernicus"); // Post gen celestial body Utility.DumpObjectFields(generatedBody.celestialBody, " Celestial Body "); }
/// <summary> /// Saves the celestial body into a Kopernicus formatted ConfigNode. /// </summary> public static void SaveCelestial(CelestialBody planet) { // Create the main node ConfigNode root = new ConfigNode("@Kopernicus:NEEDS[!Kopernicus]"); ConfigNode body = root.AddNode("Body"); // Create the body body.AddValue("name", planet.name); // Properties ConfigNode properties = WriteObjectToConfigNode("Properties", ref body, new PropertiesLoader(planet)); // Properties.Biomes if (planet.BiomeMap != null) { ConfigNode biomes = properties.AddNode("Biomes"); foreach (CBAttributeMapSO.MapAttribute biome in planet.BiomeMap.Attributes) { WriteObjectToConfigNode("Biome", ref biomes, new BiomeLoader(biome)); } } // Properties.ScienceValues if (planet.scienceValues != null) { WriteObjectToConfigNode("ScienceValues", ref properties, new ScienceValuesLoader(planet.scienceValues)); } // Orbit if (planet.orbitDriver) { WriteObjectToConfigNode("Orbit", ref body, new OrbitLoader(planet)); } // Atmosphere if (planet.atmosphere) { ConfigNode atmo = WriteObjectToConfigNode("Atmosphere", ref body, new AtmosphereLoader(planet)); // Atmosphere.AtmosphereFromGround if (planet.afg != null) { WriteObjectToConfigNode("AtmosphereFromGround", ref atmo, new AtmosphereFromGroundLoader(planet)); } } // ScaledVersion ScaledVersionLoader scaledLoader = new ScaledVersionLoader(planet); ConfigNode scaled = WriteObjectToConfigNode("ScaledVersion", ref body, scaledLoader); // ScaledVersion.Material Material material = planet.scaledBody.GetComponent <Renderer>().sharedMaterial; if (scaledLoader.type == BodyType.Star) { WriteObjectToConfigNode("Material", ref scaled, new EmissiveMultiRampSunspotsLoader(material)); // ScaledVersion.Light WriteObjectToConfigNode("Light", ref scaled, new LightShifterLoader(planet)); // ScaledVersion.Coronas if (planet.scaledBody.GetComponentsInChildren <SunCoronas>().Length != 0) { ConfigNode coronas = scaled.AddNode("Coronas"); foreach (SunCoronas corona in planet.scaledBody.GetComponentsInChildren <SunCoronas>(true)) { WriteObjectToConfigNode("Corona", ref coronas, new CoronaLoader(corona)); } } } else if (scaledLoader.type == BodyType.Atmospheric) { WriteObjectToConfigNode("Material", ref scaled, new ScaledPlanetRimAerialLoader()); } else { WriteObjectToConfigNode("Material", ref scaled, new ScaledPlanetSimpleLoader(material)); } // Particles ConfigNode particles = body.AddNode("Particles"); foreach (PlanetParticleEmitter e in planet.scaledBody.GetComponentsInChildren <PlanetParticleEmitter>(true)) { ParticleLoader loader = new ParticleLoader(e); WriteObjectToConfigNode("Particle", ref particles, loader); } // Rings if (planet.scaledBody.GetComponentsInChildren <Ring>(true).Length != 0) { ConfigNode rings = body.AddNode("Rings"); foreach (Ring ring in planet.scaledBody.GetComponentsInChildren <Ring>(true)) { WriteObjectToConfigNode("Ring", ref rings, new RingLoader(ring)); } } // PQS if (planet.pqsController) { WritePQSToConfigNode(planet.pqsController, ref body, false); } // Ocean if (planet.ocean) { WritePQSToConfigNode(planet.pqsController.ChildSpheres[0], ref body, true); } // Save the node Directory.CreateDirectory(KSPUtil.ApplicationRootPath + "/GameData/KittopiaTech/Config/"); ConfigNode save = new ConfigNode(); save.AddNode(root); save.Save("GameData/KittopiaTech/Config/" + planet.name + ".cfg", "KittopiaTech - a Kopernicus Visual Editor"); }