/********* ** Public methods *********/ /// <summary>The mod entry point, called after the mod is first loaded.</summary> /// <param name="helper">Provides methods for interacting with the mod directory, such as read/writing a config file or custom JSON files.</param> public override void Entry(IModHelper helper) { // load config this.Config = this.Helper.ReadConfig <RawModConfig>().GetParsed(this.Monitor); // load database this.LoadMetadata(); #if TEST_BUILD this.OverrideFileWatcher = new FileSystemWatcher(this.PathOnDisk, this.DatabaseFileName) { EnableRaisingEvents = true }; this.OverrideFileWatcher.Changed += (sender, e) => { this.LoadMetadata(); this.TargetFactory = new TargetFactory(this.Metadata); this.DebugInterface = new DebugInterface(this.TargetFactory, this.Config) { Enabled = this.DebugInterface.Enabled }; }; #endif // initialise functionality this.TargetFactory = new TargetFactory(this.Metadata, this.Helper.Translation, this.Helper.Reflection); this.DebugInterface = new DebugInterface(this.TargetFactory, this.Config, this.Monitor); // hook up events { // reset low-level cache once per game day (used for expensive queries that don't change within a day) SaveEvents.AfterLoad += (sender, e) => GameHelper.ResetCache(this.Metadata, this.Helper.Reflection, this.Helper.Translation); SaveEvents.AfterSave += (sender, e) => GameHelper.ResetCache(this.Metadata, this.Helper.Reflection, this.Helper.Translation); // hook up game events SaveEvents.AfterLoad += this.ReceiveAfterLoad; GraphicsEvents.OnPostRenderHudEvent += (sender, e) => this.ReceiveInterfaceRendering(Game1.spriteBatch); MenuEvents.MenuClosed += (sender, e) => this.ReceiveMenuClosed(e.PriorMenu); // hook up keyboard if (this.Config.Keyboard.HasAny()) { ControlEvents.KeyPressed += (sender, e) => this.ReceiveKeyPress(e.KeyPressed, this.Config.Keyboard); if (this.Config.HideOnKeyUp) { ControlEvents.KeyReleased += (sender, e) => this.ReceiveKeyRelease(e.KeyPressed, this.Config.Keyboard); } } // hook up controller if (this.Config.Controller.HasAny()) { ControlEvents.ControllerButtonPressed += (sender, e) => this.ReceiveKeyPress(e.ButtonPressed, this.Config.Controller); ControlEvents.ControllerTriggerPressed += (sender, e) => this.ReceiveKeyPress(e.ButtonPressed, this.Config.Controller); if (this.Config.HideOnKeyUp) { ControlEvents.ControllerButtonReleased += (sender, e) => this.ReceiveKeyRelease(e.ButtonReleased, this.Config.Controller); ControlEvents.ControllerTriggerReleased += (sender, e) => this.ReceiveKeyRelease(e.ButtonReleased, this.Config.Controller); } } } // validate metadata this.IsDataValid = this.Metadata.LooksValid(); if (!this.IsDataValid) { this.Monitor.Log("The data.json file seems to be missing or corrupt. Lookups will be disabled.", LogLevel.Error); this.IsDataValid = false; } }
/********* ** Private methods *********/ /**** ** Event handlers ****/ /// <summary>The method invoked when a new day starts.</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event data.</param> private void TimeEvents_AfterDayStarted(object sender, EventArgs e) { // reset low-level cache once per game day (used for expensive queries that don't change within a day) GameHelper.ResetCache(this.Metadata, this.Helper.Reflection, this.Helper.Translation, this.Monitor); }