private void CreateLode(LodeData lodeData) { lodeData.altitude = TerrainHeight(lodeData.latitude, lodeData.longitude, lodeData.body); Vector3d pos = lodeData.body.GetWorldSurfacePosition(lodeData.latitude, lodeData.longitude, lodeData.altitude.Value); lodeData.orbit = new Orbit(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, lodeData.body); lodeData.orbit.UpdateFromStateVectors(pos, lodeData.body.getRFrmVel(pos), lodeData.body, Planetarium.GetUniversalTime()); ConfigNode[] partNodes; ShipConstruct shipConstruct = null; uint flightId = ShipConstruction.GetUniqueFlightID(HighLogic.CurrentGame.flightState); partNodes = new ConfigNode[1]; partNodes[0] = ProtoVessel.CreatePartNode(lodeData.craftPart.name, flightId); DiscoveryLevels discoveryLevel = DiscoveryLevels.Owned; ConfigNode protoVesselNode = ProtoVessel.CreateVesselNode(lodeData.name, lodeData.vesselType, lodeData.orbit, 0, partNodes); Vector3d norm = lodeData.body.GetRelSurfaceNVector(lodeData.latitude, lodeData.longitude); double terrainHeight = 0.0; if (lodeData.body.pqsController != null) { terrainHeight = lodeData.body.pqsController.GetSurfaceHeight(norm) - lodeData.body.pqsController.radius; } bool splashed = true && terrainHeight < 0.001; protoVesselNode.SetValue("sit", (splashed ? Vessel.Situations.SPLASHED : Vessel.Situations.LANDED).ToString()); protoVesselNode.SetValue("landed", (!splashed).ToString()); protoVesselNode.SetValue("splashed", splashed.ToString()); protoVesselNode.SetValue("lat", lodeData.latitude.ToString()); protoVesselNode.SetValue("lon", lodeData.longitude.ToString()); protoVesselNode.SetValue("alt", lodeData.altitude.ToString()); protoVesselNode.SetValue("landedAt", lodeData.body.name); float lowest = float.MaxValue; foreach (Collider collider in lodeData.craftPart.partPrefab.GetComponentsInChildren <Collider>()) { if (collider.gameObject.layer != 21 && collider.enabled) { lowest = Mathf.Min(lowest, collider.bounds.min.y); } } if (Mathf.Approximately(lowest, float.MaxValue)) { lowest = 0; } Quaternion normal = Quaternion.LookRotation(new Vector3((float)norm.x, (float)norm.y, (float)norm.z)); Quaternion rotation = Quaternion.identity; rotation = rotation * Quaternion.FromToRotation(Vector3.up, Vector3.back); float hgt = (shipConstruct != null ? shipConstruct.parts[0] : lodeData.craftPart.partPrefab).localRoot.attPos0.y - lowest; protoVesselNode.SetValue("hgt", hgt.ToString()); protoVesselNode.SetValue("rot", KSPUtil.WriteQuaternion(rotation * normal)); Vector3 nrm = (rotation * Vector3.forward); protoVesselNode.SetValue("nrm", nrm.x + "," + nrm.y + "," + nrm.z); protoVesselNode.SetValue("prst", false.ToString()); ProtoVessel protoVessel = new ProtoVessel(protoVesselNode, HighLogic.CurrentGame); protoVessel.Load(HighLogic.CurrentGame.flightState); }
private void CreateLode(LodeData lodeData) { lodeData.altitude = TerrainHeight(lodeData.latitude, lodeData.longitude, lodeData.body); Vector3d pos = lodeData.body.GetWorldSurfacePosition(lodeData.latitude, lodeData.longitude, lodeData.altitude.Value); lodeData.orbit = new Orbit(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, lodeData.body); lodeData.orbit.UpdateFromStateVectors(pos, lodeData.body.getRFrmVel(pos), lodeData.body, Planetarium.GetUniversalTime()); ConfigNode[] partNodes; ShipConstruct shipConstruct = null; uint flightId = ShipConstruction.GetUniqueFlightID(HighLogic.CurrentGame.flightState); partNodes = new ConfigNode[1]; partNodes[0] = ProtoVessel.CreatePartNode(lodeData.craftPart.name, flightId); DiscoveryLevels discoveryLevel = DiscoveryLevels.Owned; ConfigNode protoVesselNode = ProtoVessel.CreateVesselNode(lodeData.name, lodeData.vesselType, lodeData.orbit, 0, partNodes); Vector3d norm = lodeData.body.GetRelSurfaceNVector(lodeData.latitude, lodeData.longitude); double terrainHeight = 0.0; if (lodeData.body.pqsController != null) { terrainHeight = lodeData.body.pqsController.GetSurfaceHeight(norm) - lodeData.body.pqsController.radius; } bool splashed = true && terrainHeight < 0.001; protoVesselNode.SetValue("sit", (splashed ? Vessel.Situations.SPLASHED : Vessel.Situations.LANDED).ToString()); protoVesselNode.SetValue("landed", (!splashed).ToString()); protoVesselNode.SetValue("splashed", splashed.ToString()); protoVesselNode.SetValue("lat", lodeData.latitude.ToString()); protoVesselNode.SetValue("lon", lodeData.longitude.ToString()); protoVesselNode.SetValue("alt", lodeData.altitude.ToString()); protoVesselNode.SetValue("landedAt", lodeData.body.name); float lowest = float.MaxValue; foreach (Collider collider in lodeData.craftPart.partPrefab.GetComponentsInChildren<Collider>()) { if (collider.gameObject.layer != 21 && collider.enabled) { lowest = Mathf.Min(lowest, collider.bounds.min.y); } } if (Mathf.Approximately(lowest,float.MaxValue)) { lowest = 0; } Quaternion normal = Quaternion.LookRotation(new Vector3((float)norm.x, (float)norm.y, (float)norm.z)); Quaternion rotation = Quaternion.identity; rotation = rotation * Quaternion.FromToRotation(Vector3.up, Vector3.back); float hgt = (shipConstruct != null ? shipConstruct.parts[0] : lodeData.craftPart.partPrefab).localRoot.attPos0.y - lowest; protoVesselNode.SetValue("hgt", hgt.ToString()); protoVesselNode.SetValue("rot", KSPUtil.WriteQuaternion(rotation * normal)); Vector3 nrm = (rotation * Vector3.forward); protoVesselNode.SetValue("nrm", nrm.x + "," + nrm.y + "," + nrm.z); protoVesselNode.SetValue("prst", false.ToString()); ProtoVessel protoVessel = new ProtoVessel(protoVesselNode, HighLogic.CurrentGame); protoVessel.Load(HighLogic.CurrentGame.flightState); }
private void PerformScan() { var numLodes = 0; string msg; if (_ani != null && !_ani.isDeployed) { msg = string.Format("Must deploy first!"); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); return; } var minAlt = vessel.mainBody.Radius * altModifier; if (altModifier > ResourceUtilities.FLOAT_TOLERANCE && (vessel.altitude < minAlt || vessel.altitude > minAlt * 2d)) { msg = string.Format("Must perform scan at an altitude between {0:0}km and {1:0}km.", minAlt / 1000, minAlt * 2 / 1000); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); return; } if (FlightGlobals.currentMainBody == FlightGlobals.GetHomeBody() && !allowHomeBody) { msg = string.Format("There are no resource lodes available on " + FlightGlobals.GetHomeBody().bodyName + "!"); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); return; } foreach (var v in FlightGlobals.Vessels) { if (v.mainBody != vessel.mainBody) { continue; } if (v.packed && !v.loaded) { if (v.protoVessel.protoPartSnapshots.Count > 1) { continue; } if (v.protoVessel.protoPartSnapshots[0].partName == lodePart) { numLodes++; } } else { if (v.Parts.Count > 1) { continue; } if (v.FindPartModuleImplementing <ModuleResourceLode>() != null) { numLodes++; } } } if (numLodes >= maxLodes) { msg = string.Format("Too many resource lodes active - Harvest some first!"); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); return; } var lode = new LodeData(); lode.name = "Resource Lode"; lode.craftPart = PartLoader.getPartInfoByName(lodePart); lode.vesselType = VesselType.Unknown; lode.body = FlightGlobals.currentMainBody; lode.orbit = null; lode.latitude = RandomizePosition(part.vessel.latitude, lodeRange); lode.longitude = RandomizePosition(part.vessel.longitude, lodeRange); lode.altitude = null; CreateLode(lode); msg = string.Format("A new resource lode has been discovered and added to your map!"); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); }
private void PerformScan() { var numLodes = 0; string msg; if (_ani != null && !_ani.isDeployed) { msg = string.Format("Must deploy first!"); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); return; } var minAlt = vessel.mainBody.Radius*altModifier; if(altModifier > ResourceUtilities.FLOAT_TOLERANCE && (vessel.altitude < minAlt || vessel.altitude > minAlt*2d)) { msg = string.Format("Must perform scan at an altitude between {0:0}km and {1:0}km.", minAlt/1000, minAlt*2/1000); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); return; } if (FlightGlobals.currentMainBody == FlightGlobals.GetHomeBody() && !allowHomeBody) { msg = string.Format("There are no resource lodes available on " + FlightGlobals.GetHomeBody().bodyName + "!"); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); return; } foreach (var v in FlightGlobals.Vessels) { if (v.mainBody != vessel.mainBody) continue; if (v.packed && !v.loaded) { if (v.protoVessel.protoPartSnapshots.Count > 1) continue; if(v.protoVessel.protoPartSnapshots[0].partName == lodePart) { numLodes++; } } else { if (v.Parts.Count > 1) continue; if (v.FindPartModuleImplementing<ModuleResourceLode>() != null) numLodes++; } } if (numLodes >= maxLodes) { msg = string.Format("Too many resource lodes active - Harvest some first!"); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); return; } var lode = new LodeData(); lode.name = "Resource Lode"; lode.craftPart = PartLoader.getPartInfoByName(lodePart); lode.vesselType = VesselType.Unknown; lode.body = FlightGlobals.currentMainBody; lode.orbit = null; lode.latitude = RandomizePosition(part.vessel.latitude, lodeRange); lode.longitude = RandomizePosition(part.vessel.longitude, lodeRange); lode.altitude = null; CreateLode(lode); msg = string.Format("A new resource lode has been discovered and added to your map!"); ScreenMessages.PostScreenMessage(msg, 5f, ScreenMessageStyle.UPPER_CENTER); }