/// <summary>Raised after the game finishes writing data to the save file (except the initial save creation).</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> private void OnSaved(object sender, SavedEventArgs e) { // delete legacy mod data (migrated into save file by this point) { FileInfo legacyFile = new FileInfo(Path.Combine(Constants.CurrentSavePath, "Entoarox.Framework", "CustomItems.json")); if (legacyFile.Exists) { legacyFile.Delete(); } DirectoryInfo legacyDir = new DirectoryInfo(Path.Combine(Constants.CurrentSavePath, "Entoarox.Framework")); if (legacyDir.Exists && !legacyDir.GetFileSystemInfos().Any()) { legacyDir.Delete(); } } // read data this.Monitor.Log("Unpacking custom objects...", LogLevel.Trace); ItemEvents.FireBeforeDeserialize(); IDictionary <string, InstanceState> data = this.Helper.Data.ReadSaveData <Dictionary <string, InstanceState> >("custom-items") ?? new Dictionary <string, InstanceState>(); this.RestoreItems(data); ItemEvents.FireAfterDeserialize(); }
private void SaveEvents_AfterSave(object s, EventArgs e) { this.Monitor.Log("Unpacking custom objects...", LogLevel.Trace); ItemEvents.FireBeforeDeserialize(); string path = Path.Combine(Constants.CurrentSavePath, "Entoarox.Framework", "CustomItems.json"); var data = this.Helper.ReadJsonFile <Dictionary <string, InstanceState> >(path) ?? new Dictionary <string, InstanceState>(); foreach (GameLocation loc in Game1.locations) { foreach (SObject objects in loc.Objects.Values) { if (objects is Chest chest) { chest = new Chest(chest.coins.Value, Deserialize(data, chest.items), chest.TileLocation, chest.giftbox.Value, chest.giftboxIndex.Value); } } } Game1.player.Items = Deserialize(data, Game1.player.Items); if (Game1.getLocationFromName("FarmHouse") is FarmHouse house) { house.fridge.Value?.items.Clear(); if (house.fridge.Value != null) { var items = this.Deserialize(data, house.fridge.Value.items); foreach (Item item in items) { house.fridge.Value.addItem(item); } } } ItemEvents.FireAfterDeserialize(); }
/// <summary>Raised after the player loads a save slot and the world is initialised.</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> private void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { // read data if (Context.IsMainPlayer) { this.Monitor.Log("Unpacking custom objects...", LogLevel.Trace); ItemEvents.FireBeforeDeserialize(); IDictionary <string, InstanceState> data = this.Helper.Data.ReadSaveData <Dictionary <string, InstanceState> >("custom-items"); if (data == null) { // read from legacy mod file FileInfo legacyFile = new FileInfo(Path.Combine(Constants.CurrentSavePath, "Entoarox.Framework", "CustomItems.json")); if (legacyFile.Exists) { data = JsonConvert.DeserializeObject <Dictionary <string, InstanceState> >(File.ReadAllText(legacyFile.FullName)); } } if (data == null) { data = new Dictionary <string, InstanceState>(); } this.RestoreItems(data); ItemEvents.FireAfterDeserialize(); } }
private void RestoreSave() { if (!Context.IsMainPlayer) { return; } // read data this.Monitor.Log("Unpacking custom objects...", LogLevel.Trace); ItemEvents.FireBeforeDeserialize(); Dictionary <string, Tuple <bool, InstanceState> > locations = this.Helper.Data.ReadSaveData <Dictionary <string, Tuple <bool, InstanceState> > >("custom-locations") ?? new Dictionary <string, Tuple <bool, InstanceState> >(); foreach (var location in locations) { if (location.Value.Item1) { return; } Game1.locations.Remove(Game1.getLocationFromName(location.Key)); Game1.locations.Add(location.Value.Item2.Restore <GameLocation>()); } IDictionary <string, InstanceState> data = this.Helper.Data.ReadSaveData <Dictionary <string, InstanceState> >("custom-items") ?? new Dictionary <string, InstanceState>(); this.RestoreItems(data); List <Tuple <string, Vector2, InstanceState> > features = this.Helper.Data.ReadSaveData <List <Tuple <string, Vector2, InstanceState> > >("custom-features") ?? new List <Tuple <string, Vector2, InstanceState> >(); foreach (var feature in features) { Game1.getLocationFromName(feature.Item1)?.terrainFeatures.Add(feature.Item2, feature.Item3.Restore <TerrainFeature>()); } ItemEvents.FireAfterDeserialize(); }
/// <summary>Raised after the game finishes writing data to the save file (except the initial save creation).</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> private void OnSaved(object sender, SavedEventArgs e) { // delete legacy mod data (migrated into save file by this point) { FileInfo legacyFile = new FileInfo(Path.Combine(Constants.CurrentSavePath, "Entoarox.Framework", "CustomItems.json")); if (legacyFile.Exists) { legacyFile.Delete(); } DirectoryInfo legacyDir = new DirectoryInfo(Path.Combine(Constants.CurrentSavePath, "Entoarox.Framework")); if (legacyDir.Exists && !legacyDir.GetFileSystemInfos().Any()) { legacyDir.Delete(); } } // read data this.Monitor.Log("Unpacking custom objects...", LogLevel.Trace); ItemEvents.FireBeforeDeserialize(); Dictionary <string, Tuple <bool, InstanceState> > locations = this.Helper.Data.ReadSaveData <Dictionary <string, Tuple <bool, InstanceState> > >("custom-locations") ?? new Dictionary <string, Tuple <bool, InstanceState> >(); foreach (var location in locations) { if (location.Value.Item1) { return; } Game1.locations.Remove(Game1.getLocationFromName(location.Key)); Game1.locations.Add(location.Value.Item2.Restore <GameLocation>()); } IDictionary <string, InstanceState> data = this.Helper.Data.ReadSaveData <Dictionary <string, InstanceState> >("custom-items") ?? new Dictionary <string, InstanceState>(); this.RestoreItems(data); List <Tuple <string, Vector2, InstanceState> > features = this.Helper.Data.ReadSaveData <List <Tuple <string, Vector2, InstanceState> > >("custom-features") ?? new List <Tuple <string, Vector2, InstanceState> >(); foreach (var feature in features) { Game1.getLocationFromName(feature.Item1)?.terrainFeatures.Add(feature.Item2, feature.Item3.Restore <TerrainFeature>()); } ItemEvents.FireAfterDeserialize(); }
private void SaveEvents_AfterSave(object s, EventArgs e) { this.Monitor.Log("Unpacking custom objects...", LogLevel.Trace); ItemEvents.FireBeforeDeserialize(); string path = Path.Combine(Constants.CurrentSavePath, "Entoarox.Framework", "CustomItems.json"); Dictionary <string, InstanceState> data = this.Helper.ReadJsonFile <Dictionary <string, InstanceState> >(path) ?? new Dictionary <string, InstanceState>(); foreach (GameLocation loc in Game1.locations) { foreach (Chest chest in loc.Objects.Values.OfType <Chest>()) { this.Deserialize(data, chest.items); } } FarmHouse house = (FarmHouse)Game1.getLocationFromName("FarmHouse"); this.Deserialize(data, Game1.player.Items); this.Deserialize(data, house.fridge.Value.items); ItemEvents.FireAfterDeserialize(); }
private void SaveEvents_AfterSave(object s, EventArgs e) { this.Monitor.Log("Unpacking custom objects...", LogLevel.Trace); ItemEvents.FireBeforeDeserialize(); string path = Path.Combine(Constants.CurrentSavePath, "Entoarox.Framework", "CustomItems.json"); var data = this.Helper.ReadJsonFile <Dictionary <string, InstanceState> >(path) ?? new Dictionary <string, InstanceState>(); foreach (GameLocation loc in Game1.locations) { foreach (Chest chest in loc.objects.Where(a => a.Value is Chest).Select(a => (Chest)a.Value)) { chest.items = Deserialize(data, chest.items); } } Game1.player.items = Deserialize(data, Game1.player.items); var house = (Game1.getLocationFromName("FarmHouse") as StardewValley.Locations.FarmHouse); if (house.fridge != null) { house.fridge.items = Deserialize(data, house.fridge.items); } ItemEvents.FireAfterDeserialize(); }