using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Omegasis.CoreLibraries; using StardewValley; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Xml; namespace Serialization { /// /// TODO: Find a way to serialize objects and tools. /// public class SerializationManager { public string objectsInWorldPath; public string playerInventoryPath; public string SerializerTrashPath; public Dictionary acceptedTypes = new Dictionary(); public SerializationManager(string PlayerInventoryPath,string SerializerTrashPath,string ObjectsInWorldPath) { this.objectsInWorldPath = ObjectsInWorldPath; this.playerInventoryPath = PlayerInventoryPath; this.SerializerTrashPath = SerializerTrashPath; verifyAllDirectoriesExist(); } private void verifyAllDirectoriesExist() { if (!Directory.Exists(this.playerInventoryPath)) Directory.CreateDirectory(this.playerInventoryPath); //if (!Directory.Exists(this.SerializerTrashPath)) Directory.CreateDirectory(this.playerInventoryPath); if (!Directory.Exists(this.objectsInWorldPath)) Directory.CreateDirectory(this.playerInventoryPath); } public void cleanUpInventory() { ProcessDirectoryForDeletion(playerInventoryPath); //ProcessDirectoryForDeletion(SerializerTrashPath); List removalList = new List(); foreach (Item d in Game1.player.items) { try { if (d == null) { //Log.AsyncG("WTF"); continue; } // Log.AsyncC(d.GetType()); } catch (Exception e) { } string s = Convert.ToString((d.GetType())); if (acceptedTypes.ContainsKey(s)) { SerializerDataNode t; bool works = acceptedTypes.TryGetValue(s, out t); if (works == true) { t.serialize.Invoke(d); removalList.Add(d); } } } foreach (var i in removalList) { Game1.player.removeItemFromInventory(i); } removalList.Clear(); } public void ProcessDirectoryForDeletion(string targetDirectory) { // Process the list of files found in the directory. string[] fileEntries = Directory.GetFiles(targetDirectory); foreach (string fileName in fileEntries) { File.Delete(fileName); // File.Delete(fileName); } // Recurse into subdirectories of this directory. string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory); foreach (string subdirectory in subdirectoryEntries) ProcessDirectoryForDeletion(subdirectory); } public void WriteToJsonFile(string filePath, T objectToWrite, bool append = false) where T : new() { TextWriter writer = null; try { JsonSerializerSettings settings = new JsonSerializerSettings(); //settings.TypeNameHandling = TypeNameHandling.Auto; settings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; settings.TypeNameHandling = TypeNameHandling.Auto; // settings.Formatting = Formatting.Indented; var contentsToWriteToFile = JsonConvert.SerializeObject(objectToWrite, settings); int i = 0; string s = filePath; while (File.Exists(s) == true) { s = filePath; s = (s + Convert.ToString(i)); i++; } filePath = s; writer = new StreamWriter(filePath, append); writer.Write(contentsToWriteToFile); } finally { if (writer != null) writer.Close(); } } public void serializeXML(Item I) { System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(T)); var newWriter = new StringWriter(); using (var writer = XmlWriter.Create(newWriter)) { xmlSerializer.Serialize(writer,I); } } public void processDirectoryForDeserialization(string pathToXML,List thingsToAddBackIn) { string[] fileEntries = Directory.GetFiles(pathToXML); foreach(var fileName in fileEntries) { ProcessFileForCleanUp(fileName,thingsToAddBackIn); } string[] subDirectories = Directory.GetDirectories(pathToXML); foreach(var folder in subDirectories) { processDirectoryForDeserialization(folder,thingsToAddBackIn); } } public void ProcessFileForCleanUp(string path, List thingsToAddBackIn) { string[] ehh = File.ReadAllLines(path); string data = ehh[0]; Item cObj; string a; string[] b; string s = ""; // Log.AsyncC(path); // Log.AsyncC(data); try { dynamic obj = JObject.Parse(data); // Log.AsyncC(obj.thisType); a = obj.serializationName; b = a.Split(','); s = b.ElementAt(0); // Log.AsyncC(s); } catch (Exception e) { //USE XML STYLE DESERIALIZING foreach (KeyValuePair pair in acceptedTypes) { var word = ParseXMLType(path); if (pair.Key == word.ToString()) { cObj = pair.Value.parse.Invoke(path); (cObj as CoreObject).thisLocation = Game1.getLocationFromName((cObj as CoreObject).locationsName); (cObj as CoreObject).resetTexture(); if ((cObj as CoreObject).thisLocation == null) { Game1.player.addItemToInventory(cObj); return; } else { (cObj as CoreObject).thisLocation.objects.Add((cObj as CoreObject).tileLocation, (StardewValley.Object)cObj); thingsToAddBackIn.Add(cObj); //Util.placementAction(cObj, cObj.thisLocation,(int)cObj.tileLocation.X,(int) cObj.tileLocation.Y,null,false); } } } // Log.AsyncG("attempting to parse from path and value of s is " + s); } // var cObj = parseBagOfHolding(path); //pair.Value.parse.Invoke(path); // cObj.TextureSheet = Game1.content.Load(Path.Combine("Revitalize", "CropsNSeeds", "Graphics", "seeds")); /* cObj.thisLocation = Game1.getLocationFromName(cObj.locationsName); if (cObj.thisLocation == null) { Game1.player.addItemToInventory(cObj); return; } else { cObj.thisLocation.objects.Add(cObj.tileLocation, cObj); Lists.trackedObjectList.Add(cObj); //Util.placementAction(cObj, cObj.thisLocation,(int)cObj.tileLocation.X,(int) cObj.tileLocation.Y,null,false); } */ //USE JSON STYLE DESERIALIZNG if (acceptedTypes.ContainsKey(s)) { // Log.AsyncC("FUUUUU"); foreach (KeyValuePair pair in acceptedTypes) { if (pair.Key == s) { try { //parse from Json Style cObj = (CoreObject)pair.Value.parse.Invoke(data); (cObj as CoreObject).thisLocation = Game1.getLocationFromName((cObj as CoreObject).locationsName); if ((cObj as CoreObject).thisLocation == null) { Game1.player.addItemToInventory(cObj); return; } else { (cObj as CoreObject).thisLocation.objects.Add((cObj as CoreObject).tileLocation,(StardewValley.Object)cObj); thingsToAddBackIn.Add(cObj); //Util.placementAction(cObj, cObj.thisLocation,(int)cObj.tileLocation.X,(int) cObj.tileLocation.Y,null,false); } } catch (Exception e) { } } } } } public string ParseXMLType(string path) { string[] s = File.ReadAllLines(path); string returnString = ""; foreach (string v in s) { // Log.AsyncC(v); if (v.Contains("serializationName")) { returnString = v.Remove(0, 12); returnString = returnString.Remove(returnString.Length - 11, 11); } } return returnString; } } }