Exemple #1
0
        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();
            }
        }
Exemple #2
0
 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);
                        }
                    }
                }
            }
        }
Exemple #4
0
 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);
     }
 }
Exemple #5
0
        /// <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();
            }
        }
Exemple #6
0
 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);
 }
Exemple #7
0
        /// <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();
            }
        }
Exemple #9
0
        /// <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);
        }
Exemple #12
0
        // 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();
            }
        }
Exemple #14
0
        /// <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();
            }
        }