diff options
| author | viciscat <51047087+viciscat@users.noreply.github.com> | 2025-03-03 05:09:39 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-03-03 12:09:39 +0800 |
| commit | cd728aecd0da561aa6800f5b5b975b8ad9435e0a (patch) | |
| tree | 368c476d6a6e000a21a4aebd1e7dc9811dbea868 | |
| parent | 0d0aae6b88b34d7f85ba397eea2469fb4a95a51e (diff) | |
| download | Skyblocker-cd728aecd0da561aa6800f5b5b975b8ad9435e0a.tar.gz Skyblocker-cd728aecd0da561aa6800f5b5b975b8ad9435e0a.tar.bz2 Skyblocker-cd728aecd0da561aa6800f5b5b975b8ad9435e0a.zip | |
Event Start Time in Calendar menu (#1147)
* calendar yay
* add 12-hour clock config
* Use date time api
* Fix rounding and optional parsing
* Cleanup
* More general config
---------
Co-authored-by: Kevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>
8 files changed, 94 insertions, 21 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java index 1df6bb26..24cd4974 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/GeneralCategory.java @@ -58,6 +58,7 @@ public class GeneralCategory { .controller(ConfigUtils::createBooleanController) .build()) + // Speed Presets .group(OptionGroup.createBuilder() .name(Text.translatable("skyblocker.config.general.speedPresets")) .collapsed(true) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java index 31bac293..c0a643e1 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java @@ -46,6 +46,16 @@ public class HelperCategory { .controller(ConfigUtils::createBooleanController) .build()) + // Date Calculator + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("skyblocker.config.helpers.enableDateCalculator")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.enableDateCalculator.@Tooltip"))) + .binding(defaults.helpers.enableDateCalculator, + () -> config.helpers.enableDateCalculator, + newValue -> config.helpers.enableDateCalculator = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + //Mythological Ritual .group(OptionGroup.createBuilder() .name(Text.translatable("skyblocker.config.helpers.mythologicalRitual")) diff --git a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java index 6541dee9..a2a4780e 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java @@ -14,6 +14,9 @@ public class HelperConfig { @SerialEntry public boolean enableWardrobeHelper = true; + @SerialEntry + public boolean enableDateCalculator = true; + @SerialEntry public MythologicalRitual mythologicalRitual = new MythologicalRitual(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java index 2566ea13..b015e755 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/TooltipManager.java @@ -44,6 +44,7 @@ public class TooltipManager { new MuseumTooltip(11), new ColorTooltip(12), new AccessoryTooltip(13), + new CalendarStartTimeTooltip(14) }; private static final ArrayList<TooltipAdder> currentScreenAdders = new ArrayList<>(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CalendarStartTimeTooltip.java b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CalendarStartTimeTooltip.java new file mode 100644 index 00000000..d3c0aa1e --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/tooltip/adders/CalendarStartTimeTooltip.java @@ -0,0 +1,48 @@ +package de.hysky.skyblocker.skyblock.item.tooltip.adders; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.tooltip.SimpleTooltipAdder; +import de.hysky.skyblocker.utils.Formatters; +import de.hysky.skyblocker.utils.RegexUtils; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import org.jetbrains.annotations.Nullable; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CalendarStartTimeTooltip extends SimpleTooltipAdder { + private static final Pattern TIMER_PATTERN = Pattern.compile(".*(Starts in: |\\()((?<days>\\d+)d)? ?((?<hours>\\d+)h)? ?((?<minutes>\\d+)m)? ?((?<seconds>\\d+)s)?\\)?"); + + public CalendarStartTimeTooltip(int priority) { + super("(Calendar and Events|.*?, Year \\d+.*)", priority); + } + + @Override + public void addToTooltip(@Nullable Slot focusedSlot, ItemStack stack, List<Text> lines) { + for (int i = 1; i < lines.size(); i++) { + Matcher matcher = TIMER_PATTERN.matcher(lines.get(i).getString()); + if (matcher.matches()) { + Instant instant = Instant.now() + .plus(RegexUtils.parseOptionalIntFromMatcher(matcher, "days").orElse(0), ChronoUnit.DAYS) + .plus(RegexUtils.parseOptionalIntFromMatcher(matcher, "hours").orElse(0), ChronoUnit.HOURS) + .plus(RegexUtils.parseOptionalIntFromMatcher(matcher, "minutes").orElse(0), ChronoUnit.MINUTES) + .plusSeconds(RegexUtils.parseOptionalIntFromMatcher(matcher, "seconds").orElse(0)) + .plusSeconds(30) // Add 30 seconds to round to the nearest minute + .truncatedTo(ChronoUnit.MINUTES); + + lines.add(++i, Text.literal(Formatters.DATE_FORMATTER.format(instant)).formatted(Formatting.ITALIC, Formatting.DARK_GRAY)); + } + } + } + + @Override + public boolean isEnabled() { + return SkyblockerConfigManager.get().helpers.enableDateCalculator; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/UpcomingEventsTab.java b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/UpcomingEventsTab.java index ee91d458..e5878c65 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/UpcomingEventsTab.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/itemlist/recipebook/UpcomingEventsTab.java @@ -1,15 +1,9 @@ package de.hysky.skyblocker.skyblock.itemlist.recipebook; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.LinkedList; -import java.util.List; - -import org.jetbrains.annotations.Nullable; - import de.hysky.skyblocker.mixins.accessors.DrawContextInvoker; import de.hysky.skyblocker.skyblock.events.EventNotifications; import de.hysky.skyblocker.skyblock.tabhud.widget.JacobsContestWidget; +import de.hysky.skyblocker.utils.Formatters; import de.hysky.skyblocker.utils.SkyblockTime; import de.hysky.skyblocker.utils.render.RenderHelper; import de.hysky.skyblocker.utils.scheduler.MessageScheduler; @@ -24,6 +18,13 @@ import net.minecraft.text.Style; import net.minecraft.text.Text; import net.minecraft.util.Colors; import net.minecraft.util.Formatting; +import org.jetbrains.annotations.Nullable; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; public class UpcomingEventsTab implements RecipeTab { private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); @@ -97,17 +98,9 @@ public class UpcomingEventsTab implements RecipeTab { @Override public void updateSearchResults(String query, FilterOption filterOption, boolean refresh) {} - private static class EventRenderer { + private record EventRenderer(String eventName, LinkedList<EventNotifications.SkyblockEvent> events) { private static final int HEIGHT = 20; - private final String eventName; - private final LinkedList<EventNotifications.SkyblockEvent> events; - - private EventRenderer(String eventName, LinkedList<EventNotifications.SkyblockEvent> events) { - this.eventName = eventName; - this.events = events; - } - private void render(DrawContext context, int x, int y, int mouseX, int mouseY) { long time = System.currentTimeMillis() / 1000; TextRenderer textRenderer = CLIENT.textRenderer; @@ -121,7 +114,7 @@ public class UpcomingEventsTab implements RecipeTab { context.drawTextWithShadow(textRenderer, formatted, x, y + textRenderer.fontHeight, -1); } else { - Text formatted = Text.literal(" ").append(Text.translatable( "skyblocker.events.tab.endsIn", SkyblockTime.formatTime((int) (events.peekFirst().start() + events.peekFirst().duration() - time)))).formatted(Formatting.GREEN); + Text formatted = Text.literal(" ").append(Text.translatable("skyblocker.events.tab.endsIn", SkyblockTime.formatTime((int) (events.peekFirst().start() + events.peekFirst().duration() - time)))).formatted(Formatting.GREEN); context.drawTextWithShadow(textRenderer, formatted, x, y + textRenderer.fontHeight, -1); } @@ -134,15 +127,18 @@ public class UpcomingEventsTab implements RecipeTab { private List<TooltipComponent> getTooltip() { List<TooltipComponent> components = new ArrayList<>(); - if (events.peekFirst() == null) return components; + EventNotifications.SkyblockEvent event = events.peekFirst(); + if (event == null) return components; if (eventName.equals(EventNotifications.JACOBS)) { - components.add(new JacobsTooltip(events.peekFirst().extras())); + components.add(new JacobsTooltip(event.extras())); } - if (events.peekFirst().warpCommand() != null) { + if (event.warpCommand() != null) { components.add(TooltipComponent.of(Text.translatable("skyblocker.events.tab.clickToWarp").formatted(Formatting.ITALIC).asOrderedText())); } + components.add(TooltipComponent.of(Text.literal(Formatters.DATE_FORMATTER.format(Instant.ofEpochSecond(event.start()))).formatted(Formatting.ITALIC, Formatting.DARK_GRAY).asOrderedText())); + return components; } diff --git a/src/main/java/de/hysky/skyblocker/utils/RegexUtils.java b/src/main/java/de/hysky/skyblocker/utils/RegexUtils.java index 3d6b8842..866d510e 100644 --- a/src/main/java/de/hysky/skyblocker/utils/RegexUtils.java +++ b/src/main/java/de/hysky/skyblocker/utils/RegexUtils.java @@ -36,6 +36,18 @@ public class RegexUtils { return OptionalInt.of(parseIntFromMatcher(matcher, 1)); } + public static OptionalInt parseOptionalIntFromMatcher(Matcher matcher, int group) { + String s = matcher.group(group); + if (s == null) return OptionalInt.empty(); + return OptionalInt.of(Integer.parseInt(s.replace(",", ""))); + } + + public static OptionalInt parseOptionalIntFromMatcher(Matcher matcher, String group) { + String s = matcher.group(group); + if (s == null) return OptionalInt.empty(); + return OptionalInt.of(Integer.parseInt(s.replace(",", ""))); + } + public static int parseIntFromMatcher(Matcher matcher, int group) { return Integer.parseInt(matcher.group(group).replace(",", "")); } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index ab086c22..48a2ffc2 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -408,10 +408,12 @@ "skyblocker.config.helpers.enableBitsHelper": "Highlight best Community Store (Bits Shop) offer", "skyblocker.config.helpers.enableBitsHelper.@Tooltip": "Highlights best offers in Community Store (Bits Shop). Also shows coins per bit. Green if best offer that is in list of items that quickly sell. Yellow for best offer overall - may include stuff that sells once in a year. \n\nBoth may include price manipulated items - please use common sense or at least 1day/3day avg tooltip", - "skyblocker.config.helpers.enableWardrobeHelper": "Enable Wardrobe Helper", "skyblocker.config.helpers.enableWardrobeHelper.@Tooltip": "Allows changing armor from the wardrobe by pressing hotbar keys 1-9 while the menu is open. The corresponding armor set in the wardrobe menu will be equipped.", + "skyblocker.config.helpers.enableDateCalculator": "Enable Date Calculator", + "skyblocker.config.helpers.enableDateCalculator.@Tooltip": "Shows the date and time of events in the future, such as calendar events.", + "skyblocker.config.helpers.experiments": "Experiments Solver", "skyblocker.config.helpers.experiments.enableChronomatronSolver": "Enable Chronomatron Solver", "skyblocker.config.helpers.experiments.enableSuperpairsSolver": "Enable Superpairs Solver", |
