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); } }
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); }
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); } } }
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); } }
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); } }