コード例 #1
0
    public static void SaveObjectMap(TerrainChunk terrainChunk, ObjectPoint[] objectPoints, string path)
    {
        string fileName = $"chunkInfo{terrainChunk.Coord.x}{terrainChunk.Coord.y}.dat";

        // Debug.Log($"Saving: {path + fileName}");

        try
        {
            using (FileStream file = File.Create(path + fileName))
            {
                BinaryFormatter bf = new BinaryFormatter();

                ObjectMapData data = new ObjectMapData
                {
                    ObjectPoints = objectPoints
                };

                bf.Serialize(file, data);
            }
        }
        catch (IOException e)
        {
            Debug.LogError(e);
        }
    }
コード例 #2
0
ファイル: MapSaver.cs プロジェクト: unitystation/unitystation
        public static ObjectMapData SaveObjects(MetaTileMap MetaTileMap, Vector3?Localboundarie1 = null,
                                                Vector3?Localboundarie2 = null, bool UseInstance = false)
        {
            bool          UseBoundary   = Localboundarie1 != null;
            ObjectMapData ObjectMapData = new ObjectMapData();

            ObjectMapData.PrefabData = new List <PrefabData>();
            foreach (var Object in MetaTileMap.ObjectLayer.GetTileList(CustomNetworkManager.Instance._isServer)
                     .AllObjects)
            {
                if (UseBoundary)
                {
                    if (IsPointWithin(Localboundarie1.Value, Localboundarie2.Value, Object.transform.localPosition) ==
                        false)
                    {
                        continue;
                    }
                }

                ProcessIndividualObject(Object.gameObject, ObjectMapData, UseInstance: UseInstance);
            }

            foreach (var ObjectCoordinate in MetaTileMap.matrix.MetaDataLayer.InitialObjects)
            {
                if (UseBoundary)
                {
                    if (IsPointWithin(Localboundarie1.Value, Localboundarie2.Value, ObjectCoordinate.Value) ==
                        false)
                    {
                        continue;
                    }
                }

                ProcessIndividualObject(ObjectCoordinate.Key, ObjectMapData, ObjectCoordinate.Value, UseInstance);
            }

            return(ObjectMapData);
        }
コード例 #3
0
ファイル: MapSaver.cs プロジェクト: unitystation/unitystation
        public static void FillOutClassData(PrefabData PrefabData, IndividualObject individualObject,
                                            GameObject PrefabEquivalent, GameObject gameObject, ObjectMapData ObjectMapData,
                                            Vector3?CoordinateOverride = null, bool UseInstance = false)
        {
            Dictionary <string, int> ClassCount = new Dictionary <string, int>();
            var PrefabComponents     = PrefabEquivalent.GetComponents <MonoBehaviour>().ToList();
            var gameObjectComponents = gameObject.GetComponents <MonoBehaviour>().ToList();

            for (int i = 0; i < PrefabComponents.Count; i++)
            {
                var PrefabMono = PrefabComponents[i];
                if (ClassCount.ContainsKey(PrefabMono.GetType().Name) == false)
                {
                    ClassCount[PrefabMono.GetType().Name] = 0;
                }
                ClassCount[PrefabMono.GetType().Name]++;

                var objectContainer = gameObjectComponents[i] as ObjectContainer;
                if (objectContainer != null)
                {
                    foreach (var objectBehaviour in objectContainer.GetStoredObjects().Select(obj => obj.GetComponent <ObjectBehaviour>()))
                    {
                        if (CoordinateOverride == null)
                        {
                            ProcessIndividualObject(objectBehaviour.gameObject, ObjectMapData,
                                                    gameObject.transform.localPosition, UseInstance);
                        }
                        else
                        {
                            ProcessIndividualObject(objectBehaviour.gameObject, ObjectMapData,
                                                    CoordinateOverride, UseInstance);
                        }
                    }
                }


                var itemStorage = gameObjectComponents[i] as ItemStorage;
                if (itemStorage != null)
                {
                    foreach (var objectBehaviour in itemStorage.GetItemSlots())
                    {
                        if (objectBehaviour.Item == null)
                        {
                            continue;
                        }
                        if (CoordinateOverride == null)
                        {
                            ProcessIndividualObject(objectBehaviour.Item.gameObject, ObjectMapData,
                                                    gameObject.transform.localPosition, UseInstance);
                        }
                        else
                        {
                            ProcessIndividualObject(objectBehaviour.Item.gameObject, ObjectMapData,
                                                    CoordinateOverride, UseInstance);
                        }
                    }
                }


                var OutClass = new ClassData();
                OutClass.ClassID = PrefabMono.GetType().Name + "@" + ClassCount[PrefabMono.GetType().Name];
                MonoToID[gameObjectComponents[i]] = PrefabData.ID + "@" + individualObject.ID + "@" + OutClass.ClassID;
                RecursiveSearchData(OutClass, "", PrefabMono, gameObjectComponents[i], UseInstance);

                if (OutClass.IsEmpty() == false)
                {
                    individualObject.ClassDatas.Add(OutClass);
                }
            }
        }
コード例 #4
0
ファイル: MapSaver.cs プロジェクト: unitystation/unitystation
        public static void RecursiveSaveObject(PrefabData PrefabData, string ID, IndividualObject individualObject,
                                               GameObject PrefabEquivalent, GameObject gameObject, ObjectMapData ObjectMapData,
                                               Vector3?CoordinateOverride = null, bool UseInstance = false)
        {
            individualObject.ID = ID;
            //Compare classes here
            FillOutClassData(PrefabData, individualObject, PrefabEquivalent, gameObject, ObjectMapData,
                             CoordinateOverride, UseInstance);


            if (PrefabEquivalent.transform.childCount != gameObject.transform.childCount)
            {
                // Logger.LogError("Mismatched children between Prefab " + PrefabEquivalent + " and game object " +
                // gameObject + " at " + gameObject.transform.localPosition +
                // "  Added children is not currently supported in This version of the map saver ");
            }

            for (int i = 0; i < PrefabEquivalent.transform.childCount; i++)
            {
                var newindividualObject = new IndividualObject();
                individualObject.Children.Add(newindividualObject);
                RecursiveSaveObject(PrefabData, ID + "," + i, newindividualObject,
                                    PrefabEquivalent.transform.GetChild(i).gameObject,
                                    gameObject.transform.GetChild(i).gameObject, ObjectMapData, UseInstance: UseInstance);
            }
        }
コード例 #5
0
ファイル: MapSaver.cs プロジェクト: unitystation/unitystation
        public static void ProcessIndividualObject(GameObject Object, ObjectMapData ObjectMapData,
                                                   Vector3?CoordinateOverride = null, bool UseInstance = false)
        {
            var RuntimeSpawned = Object.GetComponent <RuntimeSpawned>();

            if (RuntimeSpawned != null)
            {
                return;
            }

            PrefabData Prefab = new PrefabData();


            var Tracker = Object.GetComponent <PrefabTracker>();

            if (Tracker != null)
            {
                Prefab.PrefabID = Tracker.ForeverID;
                Prefab.ID       = IDStatic;
                IDStatic++;
                Prefab.Name   = Object.name;
                Prefab.Object = new IndividualObject();
                if (CoordinateOverride == null)
                {
                    Prefab.LocalPRS = Math.Round(Object.transform.localPosition.x, 2) + "┼" +
                                      Math.Round(Object.transform.localPosition.y, 2) + "┼" +
                                      Math.Round(Object.transform.localPosition.z, 2) + "┼";

                    if (Object.transform.localRotation.eulerAngles != Vector3.zero)
                    {
                        var Angles = Object.transform.localRotation.eulerAngles;
                        Prefab.LocalPRS = Prefab.LocalPRS + Math.Round(Angles.x, 2) + "ø" +
                                          Math.Round(Angles.y, 2) + "ø" +
                                          Math.Round(Angles.z, 2) + "ø";
                    }


                    if (Object.transform.localScale != Vector3.one)
                    {
                        var Angles = Object.transform.localScale;
                        Prefab.LocalPRS = Prefab.LocalPRS + Math.Round(Angles.x, 2) + "↔" +
                                          Math.Round(Angles.y, 2) + "↔" +
                                          Math.Round(Angles.z, 2) + "↔";
                    }
                }
                else
                {
                    var Position = CoordinateOverride.GetValueOrDefault(Vector3.zero);
                    Prefab.LocalPRS = Math.Round(Position.x, 2) + "┼" +
                                      Math.Round(Position.y, 2) + "┼" +
                                      Math.Round(Position.z, 2) + "┼";
                }


                RecursiveSaveObject(Prefab, "0", Prefab.Object,
                                    CustomNetworkManager.Instance.ForeverIDLookupSpawnablePrefabs[Tracker.ForeverID],
                                    Object.gameObject, ObjectMapData, CoordinateOverride, UseInstance);
                if (Prefab.Object.RemoveEmptys())
                {
                    Prefab.Object = null;
                }

                ObjectMapData.PrefabData.Add(Prefab);
            }
        }