public static Vector3 GetSize(Vessel v) { Bounds bounds = default(Bounds); Vector3 orgPos = v.parts[0].orgPos; bounds.center = orgPos; List <Bounds> list = new List <Bounds>(); foreach (Part current in v.parts) { MPLog.Writelog("[Maritime Pack] part: " + current.name + " WCoM" + current.WCoM); MPLog.Writelog("[Maritime Pack] part: " + current.name + " CoB" + current.CenterOfBuoyancy); MPLog.Writelog("[Maritime Pack] part: " + current.name + " CoD" + current.CenterOfDisplacement); Bounds[] partRendererBounds = PartGeometryUtil.GetPartRendererBounds(current); Bounds[] array = partRendererBounds; for (int i = 0; i < array.Length; i++) { Bounds bounds2 = array[i]; Bounds bounds3 = bounds2; bounds3.size *= current.boundsMultiplier; Vector3 size = bounds3.size; bounds3.Expand(current.GetModuleSize(size)); list.Add(bounds2); } } return(PartGeometryUtil.MergeBounds(list.ToArray(), v.parts[0].transform.root).size); }
void GetPartData(AvailablePart part) { bool started = false; Vector3 pg = new Vector3(); StartLine(part.name); started = true; if (partAttrs[(int)PartAttrEnum.DimensionsInfo - 1] != null && partAttrs[(int)PartAttrEnum.DimensionsInfo - 1].enabled) { // // Now get the part dimensions: x,y,z // List <Bounds> list = new List <Bounds>(); if (!(part.partPrefab.Modules.GetModule <LaunchClamp>(0) != null)) { Bounds[] partRendererBounds = PartGeometryUtil.GetPartRendererBounds(part.partPrefab); int num = partRendererBounds.Length; for (int j = 0; j < num; j++) { Bounds bounds2 = partRendererBounds[j]; Bounds bounds3 = bounds2; bounds3.size *= part.partPrefab.boundsMultiplier; Vector3 size = bounds3.size; bounds3.Expand(part.partPrefab.GetModuleSize(size, ModifierStagingSituation.CURRENT)); list.Add(bounds2); } } pg = PartGeometryUtil.MergeBounds(list.ToArray(), part.partPrefab.transform.root).size; #if false if (!started) { StartLine(pg.x.ToString("F3")); } else { AppendLine(pg.x.ToString("F3")); } AppendLine(pg.y.ToString("F3")); AppendLine(pg.z.ToString("F3")); started = true; #endif #if false string resources = ""; foreach (AvailablePart.ResourceInfo r in part.resourceInfos) { if (r.resourceName != "ElectricCharge" && r.resourceName != "Ablator") { resources += r.resourceName + ","; } } if (resources != "") { Log.Info("part: " + part.name + ", part.title: " + part.title + ", descr: " + part.description.Replace(",", ".") + ", mass: " + part.partPrefab.mass + ", techRequired: " + part.TechRequired + ", height x,y,z: " + pg.x.ToString() + ", " + pg.y.ToString() + ", " + pg.z.ToString() + "," + resources); } #endif } DataDump.activeMod = "PART"; var a = part.GetType(); bool b = false; Module partmod = new Module("PART", "PART", a); // ConfigNode partNode = part.partConfig.GetNode("PART"); //Log.Info("partConfig: " + part.partConfig); if (ActiveLists.activePropertyList.TryGetValue(Property.GetKey(partmod.modName, partmod.moduleName), out Property p)) { foreach (FldInfo s in p.fields) //FromReflection) { if (!b) { //string value = part.partConfig.GetValue(s.Name); b = true; for (var partAttr = PartAttrEnum.first + 1; partAttr < PartAttrEnum.last; partAttr++) { if (DataDump.partAttrs[(int)partAttr - 1] != null && DataDump.partAttrs[(int)partAttr - 1].enabled) { switch (partAttr) { case PartAttrEnum.DimensionsInfo: AppendLine(pg.x.ToString("F3")); AppendLine(pg.y.ToString("F3")); AppendLine(pg.z.ToString("F3")); break; case PartAttrEnum.Resources: var nodes = part.partConfig.GetNodes("RESOURCE").ToList().OrderBy(r => r.GetValue("name")); int cnt = 0; foreach (var n in nodes) { string name = n.GetValue("name"); string maxAmount = n.GetValue("maxAmount"); if (cnt < maxResources) { AppendLine(name + ":" + maxAmount); } cnt++; if (cnt >= maxResources) { break; } } break; case PartAttrEnum.TechRequired: AppendLine(part.TechRequired); break; case PartAttrEnum.entryCost: AppendLine(part.entryCost); break; case PartAttrEnum.cost: AppendLine(part.cost); break; case PartAttrEnum.category: AppendLine(part.category.ToString()); break; default: string str = "n/a"; str = ""; if (!part.partConfig.TryGetValue(partAttr.ToString(), ref str)) { if (useDefaultValues) { Part p1 = new Part(); switch (partAttr) { case PartAttrEnum.breakingForce: str = p1.breakingForce.ToString(); break; case PartAttrEnum.breakingtorque: str = p1.breakingTorque.ToString(); break; case PartAttrEnum.minimum_drag: str = p1.minimum_drag.ToString(); break; case PartAttrEnum.maximum_drag: str = p1.maximum_drag.ToString(); break; case PartAttrEnum.angularDrag: str = p1.angularDrag.ToString(); break; case PartAttrEnum.crashTolerance: str = p1.crashTolerance.ToString(); break; case PartAttrEnum.maxTemp: str = p1.maxTemp.ToString(); break; case PartAttrEnum.mass: AppendLine("Default: " + p1.mass); break; } } else { Log.Error("data not found"); } } //str = part.partConfig.GetValue(partAttr.ToString()); AppendLine(str); break; } } } } Field field = new Field(partmod.modName, partmod.moduleName, s.Name); if (s.Name == "entryCost") { s.Name = "_entryCost"; } if (ActiveLists.activeFieldsList.TryGetValue(field.ActiveKey, out field)) { if (field != null && field.enabled) { string value = part.partConfig.GetValue(s.Name); if (value == null || value == "") { Type fieldsType = typeof(AvailablePart); // Get an array of FieldInfo objects. FieldInfo[] fields = fieldsType.GetFields(BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); foreach (var f in fields) { string v = ""; var fieldtype = s.FieldType.ToString(); string t = "System.Collections.Generic"; if (fieldtype.StartsWith(t)) { fieldtype = fieldtype.Substring(t.Length + 1); } if (f.Name == s.Name) { switch (fieldtype) { case "System.Single": v = "float"; value = ((float)f.GetValue(part)).ToString(); break; case "System.Double": v = "double"; value = ((double)f.GetValue(part)).ToString(); break; case "System.Int32": v = "int"; value = ((int)f.GetValue(part)).ToString(); break; case "System.UInt32": v = "uint"; value = ((uint)f.GetValue(part)).ToString(); break; case "System.String": v = "string"; value = (string)f.GetValue(part); if (s.Name == "description") { value = StripHtml(value); if (value.Length > maxLen && s.Name == "description") { value = value.Substring(0, maxLen); } value = value.Replace("\n", " ").Replace("\r", " "); } break; case "System.Boolean": v = "boolean"; value = ((bool)f.GetValue(part)).ToString(); break; case "UnityEngine.Vector3": v = "Vector3"; value = ((Vector3)f.GetValue(part)).ToString(); break; } break; } Log.Info("v: " + v); } } if (!started) { } else { AppendLine(value); } } } else { #if false if (field == null) { Log.Error("GetPartData, field is null"); } else if (field.ActiveKey == null) { Log.Error("GetPartData, field.ActiveKey is null"); } else { Log.Error("GetPartData, not found: " + field.ActiveKey); } #endif } } } }
public Dictionary <string, blackListPart> loadData(string fname) { Dictionary <string, blackListPart> blpList = new Dictionary <string, blackListPart>(); List <AvailablePart> loadedParts = new List <AvailablePart>(); if (PartLoader.Instance != null) { loadedParts.AddRange(PartLoader.LoadedPartsList); } #if false // This code is used to export various information about parts and their resources // used to rebalance fuel tanks foreach (AvailablePart part in loadedParts) { List <Bounds> list = new List <Bounds>(); if (!(part.partPrefab.Modules.GetModule <LaunchClamp>(0) != null)) { Bounds[] partRendererBounds = PartGeometryUtil.GetPartRendererBounds(part.partPrefab); int num = partRendererBounds.Length; for (int j = 0; j < num; j++) { Bounds bounds2 = partRendererBounds[j]; Bounds bounds3 = bounds2; bounds3.size *= part.partPrefab.boundsMultiplier; Vector3 size = bounds3.size; bounds3.Expand(part.partPrefab.GetModuleSize(size, ModifierStagingSituation.CURRENT)); list.Add(bounds2); } } var pg = PartGeometryUtil.MergeBounds(list.ToArray(), part.partPrefab.transform.root).size; string resources = ""; foreach (AvailablePart.ResourceInfo r in part.resourceInfos) { if (r.resourceName != "ElectricCharge" && r.resourceName != "Ablator") { resources += r.resourceName + ","; } } if (resources != "") { Log.Info("part: " + part.name + ", part.title: " + part.title + ", descr: " + part.description.Replace(",", ".") + ", mass: " + part.partPrefab.mass + ", techRequired: " + part.TechRequired + ", height x,y,z: " + pg.x.ToString() + ", " + pg.y.ToString() + ", " + pg.z.ToString() + "," + resources); } } #endif Log.Info("loadData, fname: " + fname); if (fname != "" && File.Exists(fname)) { using (StreamReader f = File.OpenText(fname)) { string l = ""; while ((l = f.ReadLine()) != null) { string[] s = l.Split(','); if (s.Length >= 2) { blackListPart blp = new blackListPart(); blp.modName = s[0]; if (s[1] == "ALL") { blp.where = blackListType.ALL; } if (s[1] == "SPH") { blp.where = blackListType.SPH; } if (s[1] == "VAB") { blp.where = blackListType.VAB; } AvailablePart p = loadedParts.Find(part => part.name == blp.modName); if (p != null) { blp.title = p.title; Log.Info("Blacklist mod: " + blp.modName); Log.Info("partTitle: " + blp.title); blp.permapruned = false; blpList.Add(blp.modName, blp); } } } } return(blpList); } else { return(blpList); } }