public static void Process(BuildingDef def) { if (CustomizeBuildingsState.StateManager.State.AdvancedSettings == null) { return; } Dictionary <string, Dictionary <string, object> > buildingEntry; bool foundBuilding = CustomizeBuildingsState.StateManager.State.AdvancedSettings.TryGetValue(def.PrefabID, out buildingEntry); if (foundBuilding) { Debug.Log("Applying settings for: " + def.PrefabID); foreach (KeyValuePair <string, Dictionary <string, object> > componentEntry in buildingEntry) { if (componentEntry.Key.Length < 4) { continue; } Type componentType; UnityEngine.Object component; if (componentEntry.Key == "BASE") { //edit BuildingDef instead componentType = def.GetType(); component = def; } else if (componentEntry.Key.StartsWith("ADD:")) { //addicomponent componentType = Type.GetType(componentEntry.Key.Substring(4) + ", Assembly-CSharp", false); if (componentType == null) { PostBootDialog.ErrorList.Add(def.PrefabID + ": component type does not exist: " + componentEntry.Key); continue; } component = def.BuildingComplete.AddComponent(componentType); if (component == null) { PostBootDialog.ErrorList.Add(def.PrefabID + ": could not add component: " + componentEntry.Key); continue; } } else if (componentEntry.Key.StartsWith("DEL:")) { //delete component componentType = Type.GetType(componentEntry.Key.Substring(4) + ", Assembly-CSharp", false); if (componentType == null) { PostBootDialog.ErrorList.Add(def.PrefabID + ": component type does not exist: " + componentEntry.Key); continue; } component = def.BuildingComplete.GetComponent(componentType); if (component == null) { PostBootDialog.ErrorList.Add(def.PrefabID + ": could not get component for deletion: " + componentEntry.Key); continue; } UnityEngine.Object.DestroyImmediate(component); continue; } else if (Regex.IsMatch(componentEntry.Key, "AT.:")) { //edit component at index int index; if (!Int32.TryParse(componentEntry.Key.Substring(2, 2), out index)) { PostBootDialog.ErrorList.Add(def.PrefabID + ": index could not be parsed: " + componentEntry.Key); continue; } componentType = Type.GetType(componentEntry.Key + ", Assembly-CSharp", false); if (componentType == null) { PostBootDialog.ErrorList.Add(def.PrefabID + ": component type does not exist: " + componentEntry.Key); continue; } component = def.BuildingComplete.GetComponent(componentType); if (component == null) { PostBootDialog.ErrorList.Add(def.PrefabID + ": does not have component: " + componentEntry.Key); continue; } } else { //edit component componentType = Type.GetType(componentEntry.Key + ", Assembly-CSharp", false); if (componentType == null) { PostBootDialog.ErrorList.Add(def.PrefabID + ": component type does not exist: " + componentEntry.Key); continue; } component = def.BuildingComplete.GetComponent(componentType); if (component == null) { PostBootDialog.ErrorList.Add(def.PrefabID + ": does not have component: " + componentEntry.Key); continue; } } foreach (KeyValuePair <string, object> fieldEntry in componentEntry.Value) { object setValue = fieldEntry.Value; Debug.Log("PROCESSING: value=" + setValue.ToString() + " type=" + setValue.GetType().ToString()); if (setValue.GetType() == typeof(double)) { setValue = Convert.ToSingle((double)setValue); } else if (setValue.GetType() == typeof(string)) { Debug.Log("It's a string."); string strValue = (string)setValue; //convert string in enum if possible int index = strValue.LastIndexOf("."); if (index > 0 && strValue.Length > 2) { string enumName = strValue.Substring(0, index); string enumConst = strValue.Substring(index + 1); Type enumType = Type.GetType(enumName + ", Assembly-CSharp"); if (enumType != null) { Debug.Log("It's an enum."); try { setValue = Enum.Parse(enumType, enumConst); } catch (Exception) { PostBootDialog.ErrorList.Add("Enum does not exist: " + enumConst); continue; } } } } try { //Type valueType = fieldEntry.Value.GetType(); AccessTools.Field(componentType, fieldEntry.Key).SetValue(component, setValue); } catch (Exception e) { PostBootDialog.ErrorList.Add(def.PrefabID + ", " + componentEntry.Key + ", " + fieldEntry.Key + " encountered an error: '" + e.Message + "' when trying to write: " + fieldEntry.Value.ToString()); } } } CustomizeBuildingsState.StateManager.State.AdvancedSettings.Remove(def.PrefabID); } }