From 87958e0c8692448d1dcdc2435ec85def2776fee2 Mon Sep 17 00:00:00 2001 From: Taylor Walker Date: Fri, 26 Apr 2024 11:18:14 -0500 Subject: [PATCH 1/2] Toggle billboard on keypress Match the behavior of the vanilla quest journal by toggling (not only opening) the calendar/quest board on [bound] keypress. --- UIInfoSuite2/ModEntry.cs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/UIInfoSuite2/ModEntry.cs b/UIInfoSuite2/ModEntry.cs index da9ff268..5c0d58e0 100644 --- a/UIInfoSuite2/ModEntry.cs +++ b/UIInfoSuite2/ModEntry.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using StardewModdingAPI; using StardewModdingAPI.Events; using StardewValley; @@ -160,16 +161,32 @@ private static void HandleCalendarAndQuestKeyBindings(IModHelper helper) { if (_modConfig != null) { - if (Context.IsPlayerFree && _modConfig.OpenCalendarKeybind.JustPressed()) + if (_modConfig.OpenCalendarKeybind.JustPressed()) { helper.Input.SuppressActiveKeybinds(_modConfig.OpenCalendarKeybind); - Game1.activeClickableMenu = new Billboard(); + ToggleBillboard(false); } - else if (Context.IsPlayerFree && _modConfig.OpenQuestBoardKeybind.JustPressed()) + else if (_modConfig.OpenQuestBoardKeybind.JustPressed()) { helper.Input.SuppressActiveKeybinds(_modConfig.OpenQuestBoardKeybind); - Game1.RefreshQuestOfTheDay(); - Game1.activeClickableMenu = new Billboard(true); + ToggleBillboard(true); + } + } + } + + private static void ToggleBillboard(bool dailyQuest) + { + if (Context.IsPlayerFree) + { + Game1.activeClickableMenu = new Billboard(dailyQuest); + } + else if (Game1.activeClickableMenu is Billboard billboard) + { + Game1.player.FarmerSprite.SetOwner(Game1.player); + bool isDailyQuestBoard = (bool)(typeof(Billboard).GetField("dailyQuestBoard", BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(billboard) ?? false); + if (isDailyQuestBoard == dailyQuest) + { + Game1.activeClickableMenu.exitThisMenu(); } } } From 7cda443e9ca4ff12410dfb6ca24373ec5c117ff7 Mon Sep 17 00:00:00 2001 From: Taylor Walker Date: Fri, 26 Apr 2024 12:23:33 -0500 Subject: [PATCH 2/2] Make ToggleBillboard logic more transparent Also remove call to Game1.player.FarmerSprite.SetOwner. I made these changes a while ago and I'm not sure why that was there. --- UIInfoSuite2/ModEntry.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/UIInfoSuite2/ModEntry.cs b/UIInfoSuite2/ModEntry.cs index 5c0d58e0..64cf1f53 100644 --- a/UIInfoSuite2/ModEntry.cs +++ b/UIInfoSuite2/ModEntry.cs @@ -174,17 +174,21 @@ private static void HandleCalendarAndQuestKeyBindings(IModHelper helper) } } - private static void ToggleBillboard(bool dailyQuest) + private static void ToggleBillboard(bool shouldShowDailyQuest) { if (Context.IsPlayerFree) { - Game1.activeClickableMenu = new Billboard(dailyQuest); + Game1.activeClickableMenu = new Billboard(shouldShowDailyQuest); } else if (Game1.activeClickableMenu is Billboard billboard) { - Game1.player.FarmerSprite.SetOwner(Game1.player); - bool isDailyQuestBoard = (bool)(typeof(Billboard).GetField("dailyQuestBoard", BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(billboard) ?? false); - if (isDailyQuestBoard == dailyQuest) + bool isRequestedBillboardCurrentlyOpen = + (bool)( + typeof(Billboard) + .GetField("dailyQuestBoard", BindingFlags.NonPublic | BindingFlags.Instance) + ?.GetValue(billboard) ?? false + ) == shouldShowDailyQuest; + if (isRequestedBillboardCurrentlyOpen) { Game1.activeClickableMenu.exitThisMenu(); }