internal void CopyGroup(GroupCenter sourceGroup) { foreach (StaticInstance sourceInstance in sourceGroup.childInstances) { StaticInstance instance = new StaticInstance(); //instance.mesh = UnityEngine.Object.Instantiate(sourceInstance.model.prefab); instance.RelativePosition = sourceInstance.RelativePosition; instance.Orientation = sourceInstance.Orientation; instance.CelestialBody = CelestialBody; instance.Group = Group; instance.groupCenter = this; instance.model = sourceInstance.model; if (!Directory.Exists(KSPUtil.ApplicationRootPath + "GameData/" + KerbalKonstructs.newInstancePath)) { Directory.CreateDirectory(KSPUtil.ApplicationRootPath + "GameData/" + KerbalKonstructs.newInstancePath); } instance.configPath = KerbalKonstructs.newInstancePath + "/" + sourceInstance.model.name + "-instances.cfg"; instance.configUrl = null; instance.Orientate(); instance.Activate(); } }
public StaticGroup(String name, String body) { this.name = name; bodyName = body; centerPoint = Vector3.zero; visibilityRange = 0f; groupCenter = StaticDatabase.allCenters[body + "_" + name]; // FIRST ONE IS THE CENTER centerPoint = groupCenter.gameObject.transform.position; }
/// <summary> /// Creates a GroupCenter if needed /// </summary> /// <param name="instance"></param> internal static void CreateGroupCenterIfMissing(StaticInstance instance) { if (!StaticDatabase.HasGroupCenter(instance.groupCenterName)) { if (instance.RadialPosition.Equals(Vector3.zero)) { Log.UserError("No Group Found and no position found to create a Group: " + instance.configPath); return; } Log.Normal("Creating a new Group Center: " + instance.groupCenterName); GroupCenter center = new GroupCenter(); center.Group = instance.Group; center.RadialPosition = instance.RadialPosition; center.CelestialBody = instance.CelestialBody; center.isInSavegame = instance.isInSavegame; center.Spawn(); instance.Group = center.Group; } else { // we have a GroupCenter and a legacy Object we might regroup now if ((instance.RelativePosition.Equals(Vector3.zero)) && (!instance.RadialPosition.Equals(Vector3.zero))) { Vector3 groupPostion = StaticDatabase.GetGroupCenter(instance.groupCenterName).gameObject.transform.position; Vector3 instancePosition = instance.CelestialBody.GetWorldSurfacePosition(KKMath.GetLatitudeInDeg(instance.RadialPosition), KKMath.GetLongitudeInDeg(instance.RadialPosition), (instance.CelestialBody.pqsController.GetSurfaceHeight(instance.RadialPosition) - instance.CelestialBody.Radius)); if (Vector3.Distance(groupPostion, instancePosition) > KerbalKonstructs.localGroupRange) { // Check if we have a similar named GC somewhere GroupCenter closestCenter = CheckForClosesCenter(instance); if (closestCenter != null) { instance.Group = closestCenter.Group; } else { Log.Normal("Creating a new local GroupCenter on: " + instance.CelestialBody.name + " for " + instance.Group); GroupCenter center = new GroupCenter(); // we use index keys for new Group Names center.Group = instance.Group; center.RadialPosition = instance.RadialPosition; center.CelestialBody = instance.CelestialBody; center.isInSavegame = instance.isInSavegame; center.Spawn(); instance.Group = center.Group; Log.Normal("New GroupCenter Created: " + instance.groupCenterName); } } } } }
internal static void RemoveGroupCenter(GroupCenter center) { if (centersByPlanet.ContainsKey(center.CelestialBody.name)) { centersByPlanet[center.CelestialBody.name].Remove(center.dbKey); } if (HasGroupCenter(center.dbKey)) { allCenters.Remove(center.dbKey); } }
/// <summary> /// Loads all Group Centers from the Files /// </summary> internal static void LoadAllGroupCenter() { foreach (UrlDir.UrlConfig conf in GameDatabase.Instance.GetConfigs("KK_GroupCenter")) { GroupCenter center = new GroupCenter(); center.ParseCFGNode(conf.config); center.configPath = conf.url.Substring(0, conf.url.LastIndexOf('/')) + ".cfg"; center.configUrl = conf; center.Spawn(); } }
internal static void AddGroupCenter(GroupCenter center) { //Log.Normal("Added GroupCener: " + center.Group); if (!HasGroupCenter(center.dbKey)) { allCenters.Add(center.dbKey, center); } if (!centersByPlanet.ContainsKey(center.CelestialBody.name)) { centersByPlanet.Add(center.CelestialBody.name, new Dictionary <string, GroupCenter>()); } centersByPlanet[center.CelestialBody.name].Add(center.dbKey, center); }
/// <summary> /// Changes the group from a instance /// </summary> /// <param name="instance"></param> /// <param name="newGroup"></param> internal static void ChangeGroup(StaticInstance instance, GroupCenter newGroup) { instance.groupCenter.RemoveInstance(instance); instance.groupCenter = newGroup; instance.Group = newGroup.Group; instance.transform.parent = newGroup.gameObject.transform; SetNewName(instance); newGroup.AddInstance(instance); instance.Update(); }
/// <summary> /// Spawns a new Instance in the Gameworld and registers itself to the Static Database /// </summary> /// <param name="editing"></param> /// <param name="bPreview"></param> internal void Orientate() { // mangle Squads statics CelestialBody.CBUpdate(); InstanceUtil.CreateGroupCenterIfMissing(this); if (!StaticDatabase.HasGroupCenter(groupCenterName)) { Log.UserWarning("cannot load " + configPath); return; } groupCenter = StaticDatabase.GetGroupCenter(groupCenterName); if (RelativePosition.Equals(Vector3.zero)) { Log.Normal("LegacySpawnInstance called for " + groupCenterName + "_" + model.name); LegacySpawnInstance(); gameObject.transform.parent = groupCenter.gameObject.transform; RelativePosition = gameObject.transform.localPosition; Orientation = gameObject.transform.localEulerAngles; } else { gameObject.transform.position = groupCenter.gameObject.transform.position + RelativePosition;; gameObject.transform.parent = groupCenter.gameObject.transform; gameObject.transform.localEulerAngles = Orientation; gameObject.transform.localPosition = RelativePosition; } RefLatitude = (float)CelestialBody.GetLatitudeAndLongitude(gameObject.transform.position).x; RefLongitude = (float)(CelestialBody.GetLatitudeAndLongitude(gameObject.transform.position).y); RadialPosition = radialPosition; StaticDatabase.AddStatic(this); // Add them to the bodys objectlist, so they show up as anomalies // After we got a new Name from StaticDatabase.AddStatic() if (isScanable) { var pqsObjectList = CelestialBody.pqsSurfaceObjects.ToList(); if (!pqsObjectList.Contains((PQSSurfaceObject)groupCenter.pqsCity)) { Log.Normal("Added " + groupCenter.Group + " to scanable Objects"); pqsObjectList.Add(groupCenter.pqsCity as PQSSurfaceObject); } CelestialBody.pqsSurfaceObjects = pqsObjectList.ToArray(); } }
/// <summary> /// Changes the group from a instance /// </summary> /// <param name="instance"></param> /// <param name="newGroup"></param> internal static void ChangeGroup(StaticInstance instance, GroupCenter newGroup) { String bodyName = instance.CelestialBody.bodyName; String groupName = instance.Group; instance.groupCenter.RemoveInstance(instance); if (groupList.ContainsKey(bodyName)) { if (groupList[bodyName].ContainsKey(groupName)) { Log.Normal("StaticDatabase deleteObject"); groupList[bodyName][groupName].RemoveStatic(instance); } } instance.Group = newGroup.Group; instance.groupCenter = newGroup; bodyName = instance.CelestialBody.bodyName; groupName = instance.Group; if (!groupList.ContainsKey(bodyName)) { groupList.Add(bodyName, new Dictionary <string, StaticGroup>()); } if (!groupList[bodyName].ContainsKey(groupName)) { StaticGroup group = new StaticGroup(groupName, bodyName); groupList[bodyName].Add(groupName, group); } groupList[bodyName][groupName].AddStatic(instance); SetNewName(instance); instance.groupCenter.AddInstance(instance); instance.gameObject.transform.parent = instance.groupCenter.gameObject.transform; }
internal static GroupCenter GetCloesedCenter(Vector3 myPosition) { if (StaticDatabase.allGroupCenters.Length == 0) { return(null); } GroupCenter closest = StaticDatabase.allGroupCenters[0]; float dist = Vector3.Distance(myPosition, closest.gameObject.transform.position); foreach (GroupCenter center in StaticDatabase.allGroupCenters) { if (Vector3.Distance(myPosition, center.gameObject.transform.position) < dist) { dist = Vector3.Distance(myPosition, center.gameObject.transform.position); closest = center; } } return(closest); }
internal static GroupCenter CheckForClosesCenter(StaticInstance instance) { GroupCenter closestCenter = null; Vector3 groupPostion = StaticDatabase.GetGroupCenter(instance.groupCenterName).gameObject.transform.position; Vector3 instancePosition = instance.CelestialBody.GetWorldSurfacePosition(KKMath.GetLatitudeInDeg(instance.RadialPosition), KKMath.GetLongitudeInDeg(instance.RadialPosition), (instance.CelestialBody.pqsController.GetSurfaceHeight(instance.RadialPosition) - instance.CelestialBody.Radius)); float distance = Vector3.Distance(groupPostion, instancePosition); float oldDistance = KerbalKonstructs.localGroupRange * 2; if (distance > KerbalKonstructs.localGroupRange) { // Check if we have a similar named GC somewhere int index = 0; while (StaticDatabase.HasGroupCenter(instance.CelestialBody.name + "_" + instance.Group + "_" + index.ToString())) { groupPostion = StaticDatabase.GetGroupCenter(instance.CelestialBody.name + "_" + instance.Group + "_" + index.ToString()).gameObject.transform.position; distance = Vector3.Distance(groupPostion, instancePosition); if (distance < KerbalKonstructs.localGroupRange) { if (closestCenter == null || distance < oldDistance) { oldDistance = distance; closestCenter = StaticDatabase.GetGroupCenter(instance.CelestialBody.name + "_" + instance.Group + "_" + index.ToString()); } } index++; } } else { closestCenter = StaticDatabase.GetGroupCenter(instance.groupCenterName); } return(closestCenter); }
// Returns the nearest Launchsite to a position and range in m to the Launchsite, regardless of whether it is open or closed public static KKLaunchSite getNearestBase(GroupCenter center, Vector3 position) { SpaceCenter KSC = SpaceCenter.Instance; var smallestDist = Vector3.Distance(KSC.gameObject.transform.position, position); var lastSmallestDist = Vector3.Distance(KSC.gameObject.transform.position, position); string sNearestBase = ""; KKLaunchSite lTargetSite = null; KKLaunchSite lLastSite = null; KKLaunchSite lKSC = null; string sLastNearest = ""; foreach (KKLaunchSite site in center.launchsites) { if (site.staticInstance.gameObject == null) { continue; } var radialposition = site.staticInstance.gameObject.transform.position; var dist = Vector3.Distance(position, radialposition); if (radialposition == position) { continue; } if (site.LaunchSiteName == "Runway" || site.LaunchSiteName == "LaunchPad") { lKSC = site; } else { if ((float)dist < (float)smallestDist) { sLastNearest = sNearestBase; lLastSite = lTargetSite; lastSmallestDist = smallestDist; sNearestBase = site.LaunchSiteName; smallestDist = dist; lTargetSite = site; } else if (dist < lastSmallestDist) { sLastNearest = site.LaunchSiteName; lastSmallestDist = dist; lLastSite = site; } } } if (sNearestBase.Length == 0) { sNearestBase = "KSC"; lTargetSite = lKSC; } if (sLastNearest.Length == 0) { sLastNearest = "KSC"; lLastSite = lKSC; } rangeNearestBase = (float)smallestDist; return(lTargetSite); }
/// <summary> /// Spawns a new Instance in the Gameworld and registers itself to the Static Database /// </summary> /// <param name="editing"></param> /// <param name="bPreview"></param> internal void SpawnObject(Boolean editing = false, Boolean bPreview = false) { // mangle Squads statics if (model.isSquad) { InstanceUtil.MangleSquadStatic(this); } // Objects spawned at runtime should be active, ones spawned at loading not InstanceUtil.SetActiveRecursively(this, editing); Transform[] gameObjectList = gameObject.GetComponentsInChildren <Transform>(); List <GameObject> rendererList = (from t in gameObjectList where t.gameObject.GetComponent <Renderer>() != null select t.gameObject).ToList(); InstanceUtil.SetLayerRecursively(this, 15); if (bPreview && editing) { this.ToggleAllColliders(false); } this.preview = bPreview; if (editing) { KerbalKonstructs.instance.selectObject(this, true, true, bPreview); } InstanceUtil.CreateGroupCenterIfMissing(this); groupCenter = StaticDatabase.allCenters[groupCenterName]; if (RelativePosition.Equals(Vector3.zero)) { Log.Normal("LegacySpawnInstance called for " + configPath); LegacySpawnInstance(); gameObject.transform.parent = groupCenter.gameObject.transform; pqsCity.enabled = false; pqsCity.sphere = null; pqsCity = null; RelativePosition = gameObject.transform.localPosition; Orientation = gameObject.transform.localEulerAngles; } else { gameObject.transform.position = groupCenter.gameObject.transform.position; gameObject.transform.parent = groupCenter.gameObject.transform; gameObject.transform.localPosition = RelativePosition; gameObject.transform.localEulerAngles = Orientation; } //Scaling origScale = gameObject.transform.localScale; // save the original scale for later use gameObject.transform.localScale *= ModelScale; RefLatitude = (float)CelestialBody.GetLatitudeAndLongitude(gameObject.transform.position).x; RefLongitude = (float)(CelestialBody.GetLatitudeAndLongitude(gameObject.transform.position).y); RadialPosition = radialPosition; foreach (StaticModule module in model.modules) { Type moduleType = AssemblyLoader.loadedAssemblies.SelectMany(asm => asm.assembly.GetTypes()).FirstOrDefault(t => t.Namespace == module.moduleNamespace && t.Name == module.moduleClassname); StaticModule mod = gameObject.AddComponent(moduleType) as StaticModule; if (mod != null) { 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); } } } else { Log.UserError("Module " + module.moduleClassname + " could not be loaded in " + gameObject.name); } } foreach (GameObject gorenderer in rendererList) { gorenderer.GetComponent <Renderer>().enabled = true; } StaticDatabase.AddStatic(this); // Add them to the bodys objectlist, so they show up as anomalies // After we got a new Name from StaticDatabase.AddStatic() if (isScanable) { Log.Normal("Added " + gameObject.name + " to scanable Objects"); var pqsObjectList = CelestialBody.pqsSurfaceObjects.ToList(); if (!pqsObjectList.Contains((PQSSurfaceObject)groupCenter.pqsCity)) { pqsObjectList.Add(groupCenter.pqsCity as PQSSurfaceObject); } CelestialBody.pqsSurfaceObjects = pqsObjectList.ToArray(); } }
/// <summary> /// Creates a GroupCenter if needed /// </summary> /// <param name="instance"></param> internal static void CreateGroupCenterIfMissing(StaticInstance instance) { if (instance.Group == "Ungrouped" || instance.Group == "Career") { if (!StaticDatabase.allCenters.ContainsKey(instance.groupCenterName)) { if (instance.RadialPosition.Equals(Vector3.zero)) { Log.UserError("No Group Found and no position found to create a Group: " + instance.configPath); return; } Log.Normal("Creating a new Group Center: " + instance.groupCenterName); GroupCenter center = new GroupCenter(); center.Group = instance.Group; center.RadialPosition = instance.RadialPosition; center.CelestialBody = instance.CelestialBody; center.Spawn(); } else { // we have a GroupCenter and a legacy Object we might regroup now if ((instance.RelativePosition.Equals(Vector3.zero)) && (!instance.RadialPosition.Equals(Vector3.zero))) { Vector3 groupPostion = StaticDatabase.allCenters[instance.groupCenterName].gameObject.transform.position; Vector3 instancePosition = instance.CelestialBody.GetWorldSurfacePosition(KKMath.GetLatitudeInDeg(instance.RadialPosition), KKMath.GetLongitudeInDeg(instance.RadialPosition), (instance.CelestialBody.pqsController.GetSurfaceHeight(instance.RadialPosition) - instance.CelestialBody.Radius)); if (Vector3.Distance(groupPostion, instancePosition) > KerbalKonstructs.localGroupRange) { Log.Normal("Creating a new local Group on: " + instance.CelestialBody.name + " for " + instance.Group); { GroupCenter center = new GroupCenter(); center.Group = Guid.NewGuid().ToString(); center.RadialPosition = instance.RadialPosition; center.CelestialBody = instance.CelestialBody; center.Spawn(); instance.Group = center.Group; Log.Normal("New GroupCenter Created: " + instance.groupCenterName); } } } } } if (!StaticDatabase.allCenters.ContainsKey(instance.groupCenterName)) { if (instance.RadialPosition.Equals(Vector3.zero)) { Log.UserError("No Group Found and no position found to create a Group: " + instance.configPath); return; } Log.Normal("Creating a new Group Center: " + instance.groupCenterName); GroupCenter center = new GroupCenter(); center.Group = instance.Group; center.RadialPosition = instance.RadialPosition; center.CelestialBody = instance.CelestialBody; center.Spawn(); } }