From d3e11684c9efb0635f5199183f9b97ff748c54be Mon Sep 17 00:00:00 2001 From: "Erymanthus[#5074] | (u/)RayDeeUx" <51521765+RayDeeUx@users.noreply.github.com> Date: Thu, 2 Nov 2023 18:29:05 -0400 Subject: Feature(s): Add scoreboard as data source + sunmoon (#576) In-Game Date: Adds support for reading the in-game scoreboard, and also allow sun/moon symbol customization. #576 --- .../skyhanni/config/features/GUIConfig.java | 22 ++++++++++++++++-- .../skyhanni/features/misc/InGameDateDisplay.kt | 27 ++++++++++++++++++++-- 2 files changed, 45 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/GUIConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/GUIConfig.java index d7fd4625d..177c0b3ce 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/GUIConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/GUIConfig.java @@ -115,17 +115,35 @@ public class GUIConfig { @Expose public Position position = new Position(10, 10, false, true); + @Expose + @ConfigOption( + name = "Use Scoreboard for Date", + desc = "Uses the scoreboard instead to find the current month, date, and time. Greater \"accuracy\", depending on who's asking." + ) + @ConfigEditorBoolean + @FeatureToggle + public boolean useScoreboard = true; + + @Expose + @ConfigOption( + name = "Show Sun/Moon", + desc = "Show the sun or moon symbol seen on the scoreboard." + ) + @ConfigEditorBoolean + @FeatureToggle + public boolean includeSunMoon = true; + @Expose @ConfigOption( name = "Refresh Rate", - desc = "Change the time in seconds you would like to refresh the In-Game Date Display." + desc = "Change the time in seconds you would like to refresh the In-Game Date Display.\n§eNOTE: If \"Use Scoreboard for Date\" is enabled, this setting is ignored." ) @ConfigEditorSlider( minValue = 1, maxValue = 60, minStep = 1 ) - public int RefreshSeconds = 10; + public int refreshSeconds = 30; } diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/InGameDateDisplay.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/InGameDateDisplay.kt index 028b0edbc..1874d1143 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/misc/InGameDateDisplay.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/misc/InGameDateDisplay.kt @@ -1,28 +1,51 @@ package at.hannibal2.skyhanni.features.misc import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.data.ScoreboardData import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.LorenzTickEvent import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.RenderUtils.renderString +import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher +import at.hannibal2.skyhanni.utils.StringUtils.removeColor import at.hannibal2.skyhanni.utils.TimeUtils.formatted import io.github.moulberry.notenoughupdates.util.SkyBlockTime import net.minecraftforge.fml.common.eventhandler.SubscribeEvent class InGameDateDisplay { private val config get() = SkyHanniMod.feature.gui.inGameDateConfig + private val monthAndDatePattern = ".*((Early|Late) )?(Winter|Spring|Summer|Autumn) [0-9]{1,2}(nd|rd|th|st).*".toPattern() private var display = "" @SubscribeEvent fun onTick(event: LorenzTickEvent) { if (!isEnabled()) return - if (!event.repeatSeconds(config.RefreshSeconds)) return + if (!LorenzUtils.inSkyBlock) return + if (!config.useScoreboard && !event.repeatSeconds(config.refreshSeconds)) return + if (config.useScoreboard && !event.repeatSeconds(1)) return checkDate() } private fun checkDate() { - display = SkyBlockTime.now().formatted() + val date = SkyBlockTime.now() + var theBaseString: String + if (config.useScoreboard) { + val list = ScoreboardData.sidebarLinesFormatted //we need this to grab the moon/sun symbol + val year = "Year ${date.year}" + var monthAndDate = "??" //initalize as "??" as fallback value in case none of the scoreboard lines match + for (line in list) { monthAndDatePattern.matchMatcher(line) { monthAndDate = line } } + val time = list.find{ it.lowercase().contains("am ") || it.lowercase().contains("pm ") } ?: "??" + theBaseString = "$monthAndDate, $year ${time.trim()}".removeColor() + if (!config.includeSunMoon) theBaseString = theBaseString.replace("☽", "").replace("☀", "").replace("࿇", "") + } else { + theBaseString = date.formatted() + if (config.includeSunMoon) { + if ((date.hour >= 6) && (date.hour < 17)) theBaseString = "$theBaseString ☀" + else theBaseString = "$theBaseString ☽" + } + } + display = theBaseString } @SubscribeEvent -- cgit