internal static void ApplyVariant(StaticInstance instance) { if (!instance.model.hasVariants || String.IsNullOrEmpty(instance.VariantName)) { return; } if (!(instance.model.variants.ContainsKey(instance.VariantName))) { Log.UserError("Cannot find variant: " + instance.VariantName + "on model " + instance.model.name); return; } ModelVariant variant = instance.model.variants[instance.VariantName]; // apply Textures before altering them later foreach (AdvancedTextures advTexture in instance.gameObject.GetComponentsInChildren <AdvancedTextures>(true)) { advTexture.Start(); } variant.AlterTexture(instance.mesh); variant.DeactivateGameObjects(instance.mesh); if (instance == UI.EditorGUI.selectedInstance) { instance.gameObject.BroadcastMessage("StaticObjectUpdate"); } }
internal static void ParseModelConfig(StaticModel target, ConfigNode cfgNode) { if (!ConfigUtil.initialized) { ConfigUtil.InitTypes(); } foreach (var field in ConfigUtil.modelFields.Values) { ConfigUtil.ReadCFGNode(target, field, cfgNode); } foreach (ConfigNode variNode in cfgNode.GetNodes("VARIANT")) { Log.Normal("found variant: " + variNode.GetValue("name")); ModelVariant variant = new ModelVariant(target, variNode); if (string.IsNullOrEmpty(variant.name)) { Log.UserError("model " + target.name + " has a variant without a name"); continue; } if (!target.variants.ContainsKey(variant.name)) { Log.Normal("added variant: " + variant.name); target.variants.Add(variant.name, variant); } else { Log.UserError("model " + target.name + " already has a vaiant with name: " + variant.name); } } }
internal static GameObject SpawnVariant(StaticInstance instance) { if (instance.model.hasVariants) { if (!String.IsNullOrEmpty(instance.VariantName)) { if (instance.model.variants.ContainsKey(instance.VariantName)) { ModelVariant variant = instance.model.variants[instance.VariantName]; if (String.IsNullOrEmpty(variant.newMeshName)) { variant.newMeshName = instance.model.mesh; variant.prefab = instance.model.prefab; } else { variant.prefab = GameDatabase.Instance.GetModelPrefab(instance.model.path + "/" + variant.newMeshName); if (variant.prefab == null) { Log.UserError("Could not find " + instance.model.path + "/" + variant.newMeshName + ".mu! Did the modder forget to include it or did you actually install it?"); } } return(GameObject.Instantiate(variant.prefab)); } else { Log.UserError("Cannot find variant: " + instance.VariantName + "on model " + instance.model.name); return(null); } } else { // Default is the first one instance.VariantName = instance.model.variants.Keys.ToArray()[0]; return(SpawnVariant(instance)); } } else { return(GameObject.Instantiate(instance.model.prefab)); } }
private void Spawn() { CelestialBody.CBUpdate(); isSpawned = true; mesh = ModelVariant.SpawnVariant(this); { if (_mesh == null) { Log.UserError("Cannot spawn 3dModel of Instance: " + model.name); Destroy(); return; } } if (model.isSquad) { InstanceUtil.MangleSquadStatic(this); } InstanceUtil.SetLayerRecursively(this, 15); mesh.SetActive(true); //Scaling origScale = gameObject.transform.localScale; // save the original scale for later use gameObject.transform.localScale *= ModelScale; foreach (StaticModule module in model.modules) { moduleKey = (module.moduleNamespace + "_" + module.moduleClassname); Type moduleType; if (staticModules.ContainsKey(moduleKey)) { moduleType = staticModules[moduleKey]; } else { moduleType = AssemblyLoader.loadedAssemblies.SelectMany(asm => asm.assembly.GetTypes()).FirstOrDefault(t => t.Namespace == module.moduleNamespace && t.Name == module.moduleClassname); staticModules.Add(moduleKey, moduleType); } StaticModule mod = mesh.AddComponent(moduleType) as StaticModule; if (mod != null) { mod.enabled = false; mod.staticInstance = this; foreach (string fieldName in module.moduleFields.Keys) { FieldInfo field = mod.GetType().GetField(fieldName); if (field != null) { field.SetValue(mod, Convert.ChangeType(module.moduleFields[fieldName], field.FieldType)); } else { Log.UserWarning("Field " + fieldName + " does not exist in " + module.moduleClassname); } } //myStaticModules.Add(mod); } else { Log.UserError("Module " + module.moduleClassname + " could not be loaded in " + gameObject.name); } } foreach (Renderer renderer in gameObject.GetComponentsInChildren <Renderer>(true)) { renderer.enabled = true; AdvancedTextures.CheckForExistingMaterial(renderer); } ModelVariant.ApplyVariant(this); //Make LaunchSites more sturdy if (!model.isSquad) { Destructable.MakeDestructable(this); if (hasLauchSites) { destructible.impactMomentumThreshold = Math.Max(destructible.impactMomentumThreshold, 3000f); launchSite.AttachSelector(); } } foreach (var facility in myFacilities) { facility.AttachSelector(); } }