using UIInfoSuite.Options; using UIInfoSuite.UIElements; using StardewModdingAPI; using StardewModdingAPI.Events; using StardewValley; using System; using System.Collections.Generic; using System.IO; using System.Xml; namespace UIInfoSuite { public class ModEntry : Mod { private SkipIntro _skipIntro; private String _modDataFileName; private readonly Dictionary _options = new Dictionary(); public static IMonitor MonitorObject { get; private set; } private ModOptionsPageHandler _modOptionsPageHandler; /// The mod entry point, called after the mod is first loaded. /// Provides simplified APIs for writing mods. public override void Entry(IModHelper helper) { //Helper = helper; MonitorObject = Monitor; _skipIntro = new SkipIntro(helper.Events); Monitor.Log("starting.", LogLevel.Debug); helper.Events.GameLoop.SaveLoaded += OnSaveLoaded; helper.Events.GameLoop.Saved += OnSaved; helper.Events.GameLoop.ReturnedToTitle += OnReturnedToTitle; helper.Events.Display.Rendering += IconHandler.Handler.Reset; //Resources = new ResourceManager("UIInfoSuite.Resource.strings", Assembly.GetAssembly(typeof(ModEntry))); //try //{ // //Test to make sure the culture specific files are there // Resources.GetString(LanguageKeys.Days, ModEntry.SpecificCulture); //} //catch //{ // Resources = Properties.Resources.ResourceManager; //} } /// Raised after the game returns to the title screen. /// The event sender. private void OnReturnedToTitle(object sender, ReturnedToTitleEventArgs e) { _modOptionsPageHandler?.Dispose(); _modOptionsPageHandler = null; } /// Raised after the game finishes writing data to the save file (except the initial save creation). /// The event sender. /// The event arguments. private void OnSaved(object sender, EventArgs e) { if (!String.IsNullOrWhiteSpace(_modDataFileName)) { if (File.Exists(_modDataFileName)) File.Delete(_modDataFileName); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = " "; using (XmlWriter writer = XmlWriter.Create(File.Open(_modDataFileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite), settings)) { writer.WriteStartElement("options"); foreach (var option in _options) { writer.WriteStartElement("option"); writer.WriteAttributeString("name", option.Key); writer.WriteValue(option.Value); writer.WriteEndElement(); } writer.WriteEndElement(); writer.Close(); } } } /// Raised after the player loads a save slot and the world is initialised. /// The event sender. /// The event arguments. private void OnSaveLoaded(object sender, SaveLoadedEventArgs e) { try { try { _modDataFileName = Path.Combine(Helper.DirectoryPath, Game1.player.Name + "_modData.xml"); } catch { Monitor.Log("Error: Player name contains character that cannot be used in file name. Using generic file name." + Environment.NewLine + "Options may not be able to be different between characters.", LogLevel.Warn); _modDataFileName = Path.Combine(Helper.DirectoryPath, "default_modData.xml"); } if (File.Exists(_modDataFileName)) { XmlDocument document = new XmlDocument(); document.Load(_modDataFileName); XmlNodeList nodes = document.GetElementsByTagName("option"); foreach (XmlNode node in nodes) { String key = node.Attributes["name"]?.Value; String value = node.InnerText; if (key != null) _options[key] = value; } } } catch (Exception ex) { Monitor.Log("Error loading mod config. " + ex.Message + Environment.NewLine + ex.StackTrace, LogLevel.Error); } _modOptionsPageHandler = new ModOptionsPageHandler(Helper, _options); } } }