public static DockingNodeList FindDockingNodes(IShipconstruct ship, Metric ship_metric) { var nodes = new DockingNodeList(); var bounds = ship_metric.bounds; var bottom_center = bounds.center - new Vector3(0, bounds.extents.y, 0); foreach (var p in ship.Parts) { foreach (var n in p.attachNodes) { if (n.attachedPart != null) { continue; } var orientation = p.partTransform.TransformDirection(n.orientation).normalized; if (Vector3.Dot(Vector3.down, orientation) > GLB.MaxDockingCos) { var delta = p.partTransform.TransformPoint(n.position) - bottom_center; if (delta.y < GLB.MaxDockingDist) { nodes.Add(new ConstructDockingNode { Name = string.Format("{0} {1:X} ({2})", p.Title(), p.craftID, n.id), PartId = p.craftID, NodeId = n.id, DockingOffset = delta }); } } } } return(nodes); }
public VesselKit( PartModule host, ShipConstruct ship, bool assembled = true, bool simulate = false ) : this() { Host = host; Name = Localizer.Format(ship.shipName); ship.Parts.ForEach(p => p.UpdateMass()); if (!simulate) { strip_resources(ship, assembled); Blueprint = ship.SaveShip(); } var create_resources = count_kit_resources(ship, assembled); ShipMetric = new Metric((IShipconstruct)ship, true, true); DockingNodes = FindDockingNodes(ship, ShipMetric); var final_assembly_work = 0f; ship.Parts.ForEach(p => { var kit = new PartKit(p, assembled); final_assembly_work += p.mass * GLB.FinalizationWorkPerMass * 3600; Jobs.Add(kit); }); create_resources.ForEach(r => { var assembled_resource = r.Value.type == KitResourceInfo.ResourceType.CONSTRUCTED; Jobs.Add(new PartKit(r.Value.name, r.Value.mass, r.Value.cost, assembled_resource ? 0 : 1, 0, assembled_resource)); }); Jobs.Add(new PartKit("Final Assembly", 0, 0, 0, final_assembly_work, true)); if (assembled) { SetStageComplete(DIYKit.ASSEMBLY, true); } HasLaunchClamps = ship.HasLaunchClamp(); CurrentIndex = 0; }
public VesselKit(PartModule host, ShipConstruct ship, bool assembled = true, bool simulate = false) : this() { Host = host; Name = Localizer.Format(ship.shipName); if (!simulate) { strip_resources(ship, assembled); Blueprint = ship.SaveShip(); } count_kit_resources(ship); ShipMetric = new Metric(ship, true, true); DockingNodes = FindDockingNodes(ship, ShipMetric); Jobs.AddRange(ship.Parts.ConvertAll(p => new PartKit(p, assembled))); SetStageComplete(DIYKit.ASSEMBLY, assembled); HasLaunchClamps = ship.HasLaunchClamp(); CurrentIndex = 0; }
public VesselKit(PartModule host, ShipConstruct ship, bool assembled = true, bool simulate = false) : this() { Host = host; Name = Localizer.Format(ship.shipName); if (!simulate) { strip_resources(ship, assembled); Blueprint = ship.SaveShip(); } var create_resources = count_kit_resources(ship, assembled); ShipMetric = new Metric(ship, true, true); DockingNodes = FindDockingNodes(ship, ShipMetric); Jobs.AddRange(ship.Parts.ConvertAll(p => new PartKit(p, assembled))); create_resources.ForEach(r => Jobs.Add(new PartKit(r.Value.name, r.Value.mass, r.Value.cost, r.Value.type == KitResourceInfo.ResourceType.CONSTRUCTED))); SetStageComplete(DIYKit.ASSEMBLY, assembled); HasLaunchClamps = ship.HasLaunchClamp(); CurrentIndex = 0; }
public static DockingNodeList FindDockingNodes(IShipconstruct ship, Metric ship_metric) { var nodes = new DockingNodeList(); var bounds = ship_metric.bounds; var bottom_center = bounds.center - new Vector3(0, bounds.extents.y, 0); foreach (var p in ship.Parts) { var variants = p.Modules.GetModule <ModulePartVariants>(); var attachNodes = p.attachNodes; if (variants != null) { attachNodes = variants.SelectedVariant.AttachNodes; } foreach (var n in attachNodes) { if (n.attachedPart != null) { continue; } var orientation = p.partTransform.TransformDirection(n.orientation).normalized; if (Vector3.Dot(Vector3.down, orientation) > GLB.MaxDockingCos) { var delta = p.partTransform.TransformPoint(n.position) - bottom_center; if (delta.y < GLB.MaxDockingDist) { nodes.Add(new ConstructDockingNode { Name = $"{p.Title()} {p.craftID:X} ({n.id})", PartId = p.craftID, NodeId = n.id, DockingOffset = delta }); } } } } return(nodes); }