From 471f3634fc67e329935d364372981a7735675e26 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Sat, 13 Sep 2025 13:19:18 +0200 Subject: [PATCH 1/4] potato warning --- .../InactivityFpsLimiterAccessor.java | 12 ++++ .../skyblocker/skyblock/PotatoWarning.java | 55 +++++++++++++++++++ .../assets/skyblocker/lang/en_us.json | 8 +++ src/main/resources/skyblocker.mixins.json | 1 + 4 files changed, 76 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/mixins/accessors/InactivityFpsLimiterAccessor.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java diff --git a/src/main/java/de/hysky/skyblocker/mixins/accessors/InactivityFpsLimiterAccessor.java b/src/main/java/de/hysky/skyblocker/mixins/accessors/InactivityFpsLimiterAccessor.java new file mode 100644 index 00000000000..b3bf1c5c6c6 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/mixins/accessors/InactivityFpsLimiterAccessor.java @@ -0,0 +1,12 @@ +package de.hysky.skyblocker.mixins.accessors; + +import net.minecraft.client.option.InactivityFpsLimiter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(InactivityFpsLimiter.class) +public interface InactivityFpsLimiterAccessor { + + @Accessor("lastInputTime") + long getLastInputTime(); +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java b/src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java new file mode 100644 index 00000000000..1f610ec605d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java @@ -0,0 +1,55 @@ +package de.hysky.skyblocker.skyblock; + +import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.events.SkyblockEvents; +import de.hysky.skyblocker.mixins.accessors.InactivityFpsLimiterAccessor; +import de.hysky.skyblocker.utils.scheduler.Scheduler; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.toast.SystemToast; +import net.minecraft.text.Text; +import net.minecraft.util.Util; + +import java.util.Random; + +public class PotatoWarning { + private static final long WARNING_INTERVAL = 60 * 60 * 1000; + private static final long AFK_REQUIRED_FOR_BREAK = 90 * 1000; + private static final int DESCRIPTION_COUNT = 6; + + private static long startedPlayingMillis; + private static long lastWarningMillis; + + @Init + public static void init() { + SkyblockEvents.JOIN.register(() -> { + long l = Util.getMeasuringTimeMs(); + startedPlayingMillis = l; + lastWarningMillis = l; + }); + Scheduler.INSTANCE.scheduleCyclic(PotatoWarning::tick, 20 * 30, true); + } + + private static void tick() { + long time = Util.getMeasuringTimeMs(); + MinecraftClient client = MinecraftClient.getInstance(); + if (time - ((InactivityFpsLimiterAccessor) client.getInactivityFpsLimiter()).getLastInputTime() > AFK_REQUIRED_FOR_BREAK) { + lastWarningMillis = time; + } + if (time - lastWarningMillis > WARNING_INTERVAL) { + lastWarningMillis = time; + client.execute(PotatoWarning::warnCouchPotato); + } + } + + private static void warnCouchPotato() { + MinecraftClient client = MinecraftClient.getInstance(); + long playingFor = lastWarningMillis - startedPlayingMillis; + int playingForHours = (int) (playingFor / 3600_000); + client.getToastManager().add(SystemToast.create( + client, + SystemToast.Type.PERIODIC_NOTIFICATION, + Text.translatable("skyblocker.potato.title", playingForHours), + Text.translatable("skyblocker.potato.description" + new Random().nextInt(DESCRIPTION_COUNT)) + )); + } +} diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 0e155953b05..6b354d85ef6 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -1666,6 +1666,14 @@ "skyblocker.profileviewer.inventory.inactive.description.backpack": "The selected backpack", "skyblocker.profileviewer.inventory.inactive.description.general": "does not contain this slot", + "skyblocker.potato.title": "You have been playing for %s hours.", + "skyblocker.potato.description0": "Get up and go get a glass of water.", + "skyblocker.potato.description1": "You are reaching critical levels of potato.", + "skyblocker.potato.description2": "How are you still alive.", + "skyblocker.potato.description3": "Go take a break... Please.", + "skyblocker.potato.description4": "Might be time for a break don't ya think?", + "skyblocker.potato.description5": "Are you using a macro?", + "skyblocker.armorCustomization.animated": "Animated", "skyblocker.armorCustomization.cannotCustomizeColor": "Cannot customize this piece's color :(", "skyblocker.armorCustomization.cycleBack": "Cycle Back", diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json index 679c9f919bf..77c95b7f2a9 100644 --- a/src/main/resources/skyblocker.mixins.json +++ b/src/main/resources/skyblocker.mixins.json @@ -65,6 +65,7 @@ "accessors.EntityRenderDispatcherAccessor", "accessors.FrustumInvoker", "accessors.HandledScreenAccessor", + "accessors.InactivityFpsLimiterAccessor", "accessors.InGameHudInvoker", "accessors.MapStateAccessor", "accessors.MessageHandlerAccessor", From d61d069df73d81decdda1ccd6393e7e61babc952 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Sat, 13 Sep 2025 13:21:40 +0200 Subject: [PATCH 2/4] check skyblock --- src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java b/src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java index 1f610ec605d..ef5413c35b8 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java @@ -3,6 +3,7 @@ import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.events.SkyblockEvents; import de.hysky.skyblocker.mixins.accessors.InactivityFpsLimiterAccessor; +import de.hysky.skyblocker.utils.Utils; import de.hysky.skyblocker.utils.scheduler.Scheduler; import net.minecraft.client.MinecraftClient; import net.minecraft.client.toast.SystemToast; @@ -30,6 +31,7 @@ public static void init() { } private static void tick() { + if (!Utils.isOnSkyblock()) return; long time = Util.getMeasuringTimeMs(); MinecraftClient client = MinecraftClient.getInstance(); if (time - ((InactivityFpsLimiterAccessor) client.getInactivityFpsLimiter()).getLastInputTime() > AFK_REQUIRED_FOR_BREAK) { From 0114b51444a0632c0e01dd9ac2d382e84c2af4aa Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Sun, 14 Sep 2025 11:57:53 +0200 Subject: [PATCH 3/4] changes --- .../hysky/skyblocker/config/categories/MiscCategory.java | 8 ++++++++ .../de/hysky/skyblocker/config/configs/MiscConfig.java | 2 ++ .../skyblock/{PotatoWarning.java => BreakReminder.java} | 9 +++++---- src/main/resources/assets/skyblocker/lang/en_us.json | 6 ++++-- 4 files changed, 19 insertions(+), 6 deletions(-) rename src/main/java/de/hysky/skyblocker/skyblock/{PotatoWarning.java => BreakReminder.java} (85%) diff --git a/src/main/java/de/hysky/skyblocker/config/categories/MiscCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/MiscCategory.java index 470b0e8dcee..d703128abaf 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/MiscCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/MiscCategory.java @@ -37,6 +37,14 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig .controller(ConfigUtils.createBooleanController()) .build() ) + .option(Option.createBuilder() + .name(Text.translatable("skyblocker.config.misc.disableBreakReminders")) + .description(Text.translatable("skyblocker.config.misc.disableBreakReminders.@Tooltip")) + .binding(defaults.misc.disableBreakReminders, + () -> config.misc.disableBreakReminders, + newValue -> config.misc.disableBreakReminders = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) //Discord RPC .group(OptionGroup.createBuilder() diff --git a/src/main/java/de/hysky/skyblocker/config/configs/MiscConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/MiscConfig.java index 1ab73e101f7..2fe13759c62 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/MiscConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/MiscConfig.java @@ -11,6 +11,8 @@ public class MiscConfig { public boolean cat = true; + public boolean disableBreakReminders = false; + public static class RichPresence { public boolean enableRichPresence = false; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java b/src/main/java/de/hysky/skyblocker/skyblock/BreakReminder.java similarity index 85% rename from src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java rename to src/main/java/de/hysky/skyblocker/skyblock/BreakReminder.java index ef5413c35b8..75d1384b354 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/PotatoWarning.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/BreakReminder.java @@ -1,6 +1,7 @@ package de.hysky.skyblocker.skyblock; import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.events.SkyblockEvents; import de.hysky.skyblocker.mixins.accessors.InactivityFpsLimiterAccessor; import de.hysky.skyblocker.utils.Utils; @@ -12,7 +13,7 @@ import java.util.Random; -public class PotatoWarning { +public class BreakReminder { private static final long WARNING_INTERVAL = 60 * 60 * 1000; private static final long AFK_REQUIRED_FOR_BREAK = 90 * 1000; private static final int DESCRIPTION_COUNT = 6; @@ -27,11 +28,11 @@ public static void init() { startedPlayingMillis = l; lastWarningMillis = l; }); - Scheduler.INSTANCE.scheduleCyclic(PotatoWarning::tick, 20 * 30, true); + Scheduler.INSTANCE.scheduleCyclic(BreakReminder::tick, 20 * 30, true); } private static void tick() { - if (!Utils.isOnSkyblock()) return; + if (!Utils.isOnSkyblock() || SkyblockerConfigManager.get().misc.disableBreakReminders) return; long time = Util.getMeasuringTimeMs(); MinecraftClient client = MinecraftClient.getInstance(); if (time - ((InactivityFpsLimiterAccessor) client.getInactivityFpsLimiter()).getLastInputTime() > AFK_REQUIRED_FOR_BREAK) { @@ -39,7 +40,7 @@ private static void tick() { } if (time - lastWarningMillis > WARNING_INTERVAL) { lastWarningMillis = time; - client.execute(PotatoWarning::warnCouchPotato); + client.execute(BreakReminder::warnCouchPotato); } } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 6b354d85ef6..c317a6a3c86 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -843,6 +843,8 @@ "skyblocker.config.misc.richPresence.info.BITS": "BITS", "skyblocker.config.misc.richPresence.info.LOCATION": "LOCATION", "skyblocker.config.misc.richPresence.info.PURSE": "PURSE", + "skyblocker.config.misc.disableBreakReminders": "Disable break reminders", + "skyblocker.config.misc.disableBreakReminders.@Tooltip": "This is meant for content creators. If you disable this, please remember to take breaks.", "skyblocker.config.otherLocations": "Other Locations", @@ -1669,8 +1671,8 @@ "skyblocker.potato.title": "You have been playing for %s hours.", "skyblocker.potato.description0": "Get up and go get a glass of water.", "skyblocker.potato.description1": "You are reaching critical levels of potato.", - "skyblocker.potato.description2": "How are you still alive.", - "skyblocker.potato.description3": "Go take a break... Please.", + "skyblocker.potato.description2": "Remember to take breaks!", + "skyblocker.potato.description3": "Don't forget to hydrate!", "skyblocker.potato.description4": "Might be time for a break don't ya think?", "skyblocker.potato.description5": "Are you using a macro?", From 48ebd8161909b6f777a80a567eacb9d94090e4d4 Mon Sep 17 00:00:00 2001 From: viciscat <51047087+viciscat@users.noreply.github.com> Date: Sun, 14 Sep 2025 12:01:40 +0200 Subject: [PATCH 4/4] a --- src/main/resources/assets/skyblocker/lang/en_us.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index c317a6a3c86..a70f60c4796 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -834,6 +834,9 @@ "skyblocker.config.misc.configBackend": "Config Backend", "skyblocker.config.misc.configBackend.@Tooltip": "You can choose between having YetAnotherConfigLib (YACL) or MoulConfig as the Config Backend.", + "skyblocker.config.misc.disableBreakReminders": "Disable break reminders", + "skyblocker.config.misc.disableBreakReminders.@Tooltip": "This is meant for content creators. If you disable this, please remember to take breaks.", + "skyblocker.config.misc.richPresence": "Discord RPC", "skyblocker.config.misc.richPresence.customMessage": "Custom Message", "skyblocker.config.misc.richPresence.cycleMode": "Cycle Skyblock Info", @@ -843,8 +846,6 @@ "skyblocker.config.misc.richPresence.info.BITS": "BITS", "skyblocker.config.misc.richPresence.info.LOCATION": "LOCATION", "skyblocker.config.misc.richPresence.info.PURSE": "PURSE", - "skyblocker.config.misc.disableBreakReminders": "Disable break reminders", - "skyblocker.config.misc.disableBreakReminders.@Tooltip": "This is meant for content creators. If you disable this, please remember to take breaks.", "skyblocker.config.otherLocations": "Other Locations",