From 7af7069c401657ef69acab78857bf17e6d448c54 Mon Sep 17 00:00:00 2001 From: LJNeon <23249107+LJNeon@users.noreply.github.com> Date: Mon, 13 Jul 2026 21:09:33 -0700 Subject: [PATCH 1/4] Add rare crops chat filter --- .../config/categories/ChatCategory.java | 7 ++ .../skyblocker/config/configs/ChatConfig.java | 2 + .../skyblock/chat/filters/RareCropFilter.java | 79 +++++++++++++++++++ .../utils/chat/ChatMessageListener.java | 2 + .../assets/skyblocker/lang/en_us.json | 1 + 5 files changed, 91 insertions(+) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java diff --git a/src/main/java/de/hysky/skyblocker/config/categories/ChatCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/ChatCategory.java index 2275ca5b765..1a5099ed923 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/ChatCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/ChatCategory.java @@ -94,6 +94,13 @@ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig newValue -> config.chat.hideMoltenWave = newValue) .controller(ConfigUtils.createEnumController()) .build()) + .option(Option.createBuilder() + .name(Component.translatable("skyblocker.config.chat.filter.hideRareCrops")) + .binding(defaults.chat.hideRareCrops, + () -> config.chat.hideRareCrops, + newValue -> config.chat.hideRareCrops = newValue) + .controller(ConfigUtils.createEnumController()) + .build()) .option(Option.createBuilder() .name(Component.translatable("skyblocker.config.chat.filter.hideAds")) .binding(defaults.chat.hideAds, diff --git a/src/main/java/de/hysky/skyblocker/config/configs/ChatConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/ChatConfig.java index 5f955fdf750..970846ca802 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/ChatConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/ChatConfig.java @@ -21,6 +21,8 @@ public class ChatConfig { public ChatFilterResult hideMoltenWave = ChatFilterResult.PASS; + public ChatFilterResult hideRareCrops = ChatFilterResult.PASS; + public ChatFilterResult hideAds = ChatFilterResult.PASS; public ChatFilterResult hideTeleportPad = ChatFilterResult.PASS; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java new file mode 100644 index 00000000000..16c2b7b23b0 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java @@ -0,0 +1,79 @@ +package de.hysky.skyblocker.skyblock.chat.filters; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.itemlist.ItemRepository; +import de.hysky.skyblocker.utils.FlexibleItemStack; +import de.hysky.skyblocker.utils.ItemUtils; +import de.hysky.skyblocker.utils.NEURepoManager; +import de.hysky.skyblocker.utils.chat.ChatFilterResult; +import de.hysky.skyblocker.utils.chat.ChatPatternListener; +import de.hysky.skyblocker.utils.render.gui.BasicToast; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import org.jspecify.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; + +public class RareCropFilter extends ChatPatternListener { + private static final Map IDS; + private static final Map ICONS = new HashMap<>(); + + public RareCropFilter() { + super("^RARE CROP! (?[\\w\\s]+) \\(.*$"); + } + + private @Nullable ItemStack getCropIcon(Matcher matcher) { + String skyblockId = IDS.get(matcher.group("crop")); + if (skyblockId == null) return null; + if (NEURepoManager.isLoading() || !ItemRepository.filesImported()) return ItemUtils.getItemIdPlaceholder(skyblockId).getStack(); + return ICONS.computeIfAbsent(skyblockId, id -> ItemRepository.getItemStack(id, ItemUtils.getItemIdPlaceholder(id))).getStack(); + } + + @Override + public boolean onMatch(Component message, Matcher matcher) { + if (SkyblockerConfigManager.get().chat.hideRareCrops == ChatFilterResult.TOAST) { + Minecraft.getInstance().gui.toastManager().addToast(new BasicToast(message, (long) (SkyblockerConfigManager.get().chat.toastDisplayDuration * 1000L), getCropIcon(matcher))); + } + return true; + } + + @Override + public ChatFilterResult state() { + if (SkyblockerConfigManager.get().chat.hideRareCrops == ChatFilterResult.TOAST) + return ChatFilterResult.FILTER; + else + return SkyblockerConfigManager.get().chat.hideRareCrops; + } + + static { + IDS = new HashMap<>(); + IDS.put("Cropie", "CROPIE"); + IDS.put("Squash", "SQUASH"); + IDS.put("Fermento", "FERMENTO"); + IDS.put("Helianthus", "HELIANTHUS"); + IDS.put("Warty", "WARTY"); + IDS.put("Burrowing Spores", "BURROWING_SPORES"); + IDS.put("Overclocker 3000", "OVERCLOCKER_3000"); + IDS.put("Ethereal Vine", "ETHEREAL_VINE"); + IDS.put("Rarefinder Chip", "RAREFINDER_GARDEN_CHIP"); + // Seasoning has no item to display, so it's excluded here + IDS.put("Cornucopia", "CORNUCOPIA"); + IDS.put("Carrot Zest", "CARROT_ZEST"); + IDS.put("Deepfries", "DEEPFRIES"); + IDS.put("Aggourdian", "AGGOURDIAN"); + IDS.put("Cane Knot", "CANE_KNOT"); + IDS.put("Melon Juice", "MELON_JUICE"); + IDS.put("Cactus Flower", "CACTUS_FLOWER"); + IDS.put("Designer Coffee Beans", "DESIGNER_COFFEE_BEANS"); + IDS.put("Feastfungus", "FEASTFUNGUS"); + IDS.put("Botroot", "BOTROOT"); + IDS.put("Salted Sunflower Seeds", "SALTED_SUNFLOWER_SEEDS"); + IDS.put("Crystalized Moonlight", "CRYSTALIZED_MOONLIGHT"); + IDS.put("Floral Gelatin", "FLORAL_GELATIN"); + IDS.put("Wild Strawberry Dye", "DYE_WILD_STRAWBERRY"); + IDS.put("Ray of Helios", "RAY_OF_HELIOS"); + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/chat/ChatMessageListener.java b/src/main/java/de/hysky/skyblocker/utils/chat/ChatMessageListener.java index bd2690a0c4c..ed8e68d04fe 100644 --- a/src/main/java/de/hysky/skyblocker/utils/chat/ChatMessageListener.java +++ b/src/main/java/de/hysky/skyblocker/utils/chat/ChatMessageListener.java @@ -17,6 +17,7 @@ import de.hysky.skyblocker.skyblock.chat.filters.LotteryFilter; import de.hysky.skyblocker.skyblock.chat.filters.MimicFilter; import de.hysky.skyblocker.skyblock.chat.filters.MoltenWaveFilter; +import de.hysky.skyblocker.skyblock.chat.filters.RareCropFilter; import de.hysky.skyblocker.skyblock.chat.filters.ShowOffFilter; import de.hysky.skyblocker.skyblock.chat.filters.SkyMallFilter; import de.hysky.skyblocker.skyblock.chat.filters.SpiritSceptreFilter; @@ -81,6 +82,7 @@ static void init() { new ImplosionFilter(), new SpiritSceptreFilter(), new MoltenWaveFilter(), + new RareCropFilter(), new TeleportPadFilter(), new AutopetFilter(), new ShowOffFilter(), diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 0e53201a021..38f0dc1754c 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -171,6 +171,7 @@ "skyblocker.config.chat.filter.hideMimicKill": "Hide Mimic Kill Messages", "skyblocker.config.chat.filter.hideMimicKill.@Tooltip": "Filters the \"Mimic dead!\" and \"Mimic killed!\" messages from chat.", "skyblocker.config.chat.filter.hideMoltenWave": "Hide Molten Wave Message", + "skyblocker.config.chat.filter.hideRareCrops": "Hide Rare Crop Messages", "skyblocker.config.chat.filter.hideShowOff": "Hide Show Off Messages", "skyblocker.config.chat.filter.hideShowOff.@Tooltip": "Filters messages from the /show command", "skyblocker.config.chat.filter.hideSpiritSceptre": "Hide Spirit Sceptre Message", From 2681eff33480f906ecf017bace242b85275595a8 Mon Sep 17 00:00:00 2001 From: LJNeon <23249107+LJNeon@users.noreply.github.com> Date: Thu, 16 Jul 2026 20:54:01 -0700 Subject: [PATCH 2/4] Remove dye & move ray of helios to a rare drop --- .../skyblock/chat/filters/RareCropFilter.java | 6 +++--- .../skyblock/special/RareDropSpecialEffects.java | 11 +++++++++++ .../java/de/hysky/skyblocker/utils/SkyBlockIcons.java | 1 + 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java index 16c2b7b23b0..c5783a32cae 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java @@ -5,6 +5,7 @@ import de.hysky.skyblocker.utils.FlexibleItemStack; import de.hysky.skyblocker.utils.ItemUtils; import de.hysky.skyblocker.utils.NEURepoManager; +import de.hysky.skyblocker.utils.SkyBlockIcons; import de.hysky.skyblocker.utils.chat.ChatFilterResult; import de.hysky.skyblocker.utils.chat.ChatPatternListener; import de.hysky.skyblocker.utils.render.gui.BasicToast; @@ -22,7 +23,7 @@ public class RareCropFilter extends ChatPatternListener { private static final Map ICONS = new HashMap<>(); public RareCropFilter() { - super("^RARE CROP! (?[\\w\\s]+) \\(.*$"); + super("^RARE CROP!\\s+(?[\\w\\s]+)\\s+\\(\\+\\d+" + SkyBlockIcons.OVERBLOOM + "\\)$"); } private @Nullable ItemStack getCropIcon(Matcher matcher) { @@ -73,7 +74,6 @@ public ChatFilterResult state() { IDS.put("Salted Sunflower Seeds", "SALTED_SUNFLOWER_SEEDS"); IDS.put("Crystalized Moonlight", "CRYSTALIZED_MOONLIGHT"); IDS.put("Floral Gelatin", "FLORAL_GELATIN"); - IDS.put("Wild Strawberry Dye", "DYE_WILD_STRAWBERRY"); - IDS.put("Ray of Helios", "RAY_OF_HELIOS"); + // Wild Strawberry Dye and Ray of Helios are handled as rare drops instead } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/special/RareDropSpecialEffects.java b/src/main/java/de/hysky/skyblocker/skyblock/special/RareDropSpecialEffects.java index cd44009e019..3709859a03b 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/special/RareDropSpecialEffects.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/special/RareDropSpecialEffects.java @@ -19,6 +19,7 @@ public class RareDropSpecialEffects { private static final Logger LOGGER = LoggerFactory.getLogger(RareDropSpecialEffects.class); private static final Pattern MAGIC_FIND_PATTERN = Pattern.compile("^(?!.*:)(?:RARE|VERY RARE|CRAZY RARE|INSANE) DROP!\\s+\\(?(?.+?)\\)?(?:\\s+\\(\\+\\d+%? "+SkyBlockIcons.MAGIC_FIND+" Magic Find\\))?$"); + private static final Pattern OVERBLOOM_PATTERN = Pattern.compile("^RARE CROP!\\s+(?[\\w\\s]+)\\s+\\(\\+\\d+" + SkyBlockIcons.OVERBLOOM + "\\)$"); @Init public static void init() { @@ -34,6 +35,14 @@ private static boolean displayRareDropEffect(Component message, boolean overlay) if (magicFindMatcher.matches()) { triggerDropEffect(magicFindMatcher.group("item")); + + return true; + } + + Matcher overbloomMatcher = OVERBLOOM_PATTERN.matcher(stringForm); + + if (overbloomMatcher.matches()) { + triggerDropEffect(overbloomMatcher.group("crop")); } } catch (Exception e) { //In case there's a regex failure or something else bad happens LOGGER.error("[Skyblocker Special Effects] An unexpected exception was encountered: ", e); @@ -85,6 +94,8 @@ private static void triggerDropEffect(String itemName) { case "Radioactive Vial" -> "RADIOACTIVE_VIAL"; case "Tiki Mask" -> "TIKI_MASK"; case "Titanoboa Shed" -> "TITANOBOA_SHED"; + //Farming + case "Ray of Helios" -> "RAY_OF_HELIOS"; default -> "NONE"; }; diff --git a/src/main/java/de/hysky/skyblocker/utils/SkyBlockIcons.java b/src/main/java/de/hysky/skyblocker/utils/SkyBlockIcons.java index 54351ca2fc6..645e39acaab 100644 --- a/src/main/java/de/hysky/skyblocker/utils/SkyBlockIcons.java +++ b/src/main/java/de/hysky/skyblocker/utils/SkyBlockIcons.java @@ -19,6 +19,7 @@ public final class SkyBlockIcons { // Farming Stats public static final char FARMING_FORTUNE = '\uE051'; + public static final char OVERBLOOM = '\uE02B'; // Foraging stats public static final char SWEEP = '\uE023'; From 12dd68be9f39725b9a5171ac735421158b21925f Mon Sep 17 00:00:00 2001 From: LJNeon <23249107+LJNeon@users.noreply.github.com> Date: Fri, 24 Jul 2026 15:48:06 -0700 Subject: [PATCH 3/4] Use Map#ofEntries instead --- .../skyblock/chat/filters/RareCropFilter.java | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java index c5783a32cae..a8d923bec57 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java @@ -18,8 +18,35 @@ import java.util.Map; import java.util.regex.Matcher; +import static java.util.Map.entry; + public class RareCropFilter extends ChatPatternListener { - private static final Map IDS; + private static final Map IDS = Map.ofEntries( + entry("Cropie", "CROPIE"), + entry("Squash", "SQUASH"), + entry("Fermento", "FERMENTO"), + entry("Helianthus", "HELIANTHUS"), + entry("Warty", "WARTY"), + entry("Burrowing Spores", "BURROWING_SPORES"), + entry("Overclocker 3000", "OVERCLOCKER_3000"), + entry("Ethereal Vine", "ETHEREAL_VINE"), + entry("Rarefinder Chip", "RAREFINDER_GARDEN_CHIP"), + // Seasoning has no item to display, so it's excluded here + entry("Cornucopia", "CORNUCOPIA"), + entry("Carrot Zest", "CARROT_ZEST"), + entry("Deepfries", "DEEPFRIES"), + entry("Aggourdian", "AGGOURDIAN"), + entry("Cane Knot", "CANE_KNOT"), + entry("Melon Juice", "MELON_JUICE"), + entry("Cactus Flower", "CACTUS_FLOWER"), + entry("Designer Coffee Beans", "DESIGNER_COFFEE_BEANS"), + entry("Feastfungus", "FEASTFUNGUS"), + entry("Botroot", "BOTROOT"), + entry("Salted Sunflower Seeds", "SALTED_SUNFLOWER_SEEDS"), + entry("Crystalized Moonlight", "CRYSTALIZED_MOONLIGHT"), + entry("Floral Gelatin", "FLORAL_GELATIN") + // Wild Strawberry Dye and Ray of Helios are handled as rare drops instead + ); private static final Map ICONS = new HashMap<>(); public RareCropFilter() { @@ -48,32 +75,4 @@ public ChatFilterResult state() { else return SkyblockerConfigManager.get().chat.hideRareCrops; } - - static { - IDS = new HashMap<>(); - IDS.put("Cropie", "CROPIE"); - IDS.put("Squash", "SQUASH"); - IDS.put("Fermento", "FERMENTO"); - IDS.put("Helianthus", "HELIANTHUS"); - IDS.put("Warty", "WARTY"); - IDS.put("Burrowing Spores", "BURROWING_SPORES"); - IDS.put("Overclocker 3000", "OVERCLOCKER_3000"); - IDS.put("Ethereal Vine", "ETHEREAL_VINE"); - IDS.put("Rarefinder Chip", "RAREFINDER_GARDEN_CHIP"); - // Seasoning has no item to display, so it's excluded here - IDS.put("Cornucopia", "CORNUCOPIA"); - IDS.put("Carrot Zest", "CARROT_ZEST"); - IDS.put("Deepfries", "DEEPFRIES"); - IDS.put("Aggourdian", "AGGOURDIAN"); - IDS.put("Cane Knot", "CANE_KNOT"); - IDS.put("Melon Juice", "MELON_JUICE"); - IDS.put("Cactus Flower", "CACTUS_FLOWER"); - IDS.put("Designer Coffee Beans", "DESIGNER_COFFEE_BEANS"); - IDS.put("Feastfungus", "FEASTFUNGUS"); - IDS.put("Botroot", "BOTROOT"); - IDS.put("Salted Sunflower Seeds", "SALTED_SUNFLOWER_SEEDS"); - IDS.put("Crystalized Moonlight", "CRYSTALIZED_MOONLIGHT"); - IDS.put("Floral Gelatin", "FLORAL_GELATIN"); - // Wild Strawberry Dye and Ray of Helios are handled as rare drops instead - } } From 7faffd0c35b91676a386284984a61e128e901db8 Mon Sep 17 00:00:00 2001 From: LJNeon <23249107+LJNeon@users.noreply.github.com> Date: Sun, 26 Jul 2026 23:00:22 -0700 Subject: [PATCH 4/4] Support decimals in overbloom amount --- .../hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java | 2 +- .../skyblocker/skyblock/special/RareDropSpecialEffects.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java index a8d923bec57..2b66f99ddb6 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java @@ -50,7 +50,7 @@ public class RareCropFilter extends ChatPatternListener { private static final Map ICONS = new HashMap<>(); public RareCropFilter() { - super("^RARE CROP!\\s+(?[\\w\\s]+)\\s+\\(\\+\\d+" + SkyBlockIcons.OVERBLOOM + "\\)$"); + super("^RARE CROP!\\s+(?[\\w\\s]+)\\s+\\(\\+\\d+(?:\\.\\d+)?" + SkyBlockIcons.OVERBLOOM + "\\).*"); } private @Nullable ItemStack getCropIcon(Matcher matcher) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/special/RareDropSpecialEffects.java b/src/main/java/de/hysky/skyblocker/skyblock/special/RareDropSpecialEffects.java index 3709859a03b..39672a03ecd 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/special/RareDropSpecialEffects.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/special/RareDropSpecialEffects.java @@ -19,7 +19,7 @@ public class RareDropSpecialEffects { private static final Logger LOGGER = LoggerFactory.getLogger(RareDropSpecialEffects.class); private static final Pattern MAGIC_FIND_PATTERN = Pattern.compile("^(?!.*:)(?:RARE|VERY RARE|CRAZY RARE|INSANE) DROP!\\s+\\(?(?.+?)\\)?(?:\\s+\\(\\+\\d+%? "+SkyBlockIcons.MAGIC_FIND+" Magic Find\\))?$"); - private static final Pattern OVERBLOOM_PATTERN = Pattern.compile("^RARE CROP!\\s+(?[\\w\\s]+)\\s+\\(\\+\\d+" + SkyBlockIcons.OVERBLOOM + "\\)$"); + private static final Pattern OVERBLOOM_PATTERN = Pattern.compile("^RARE CROP!\\s+(?[\\w\\s]+)\\s+\\(\\+\\d+(?:\\.\\d+)?" + SkyBlockIcons.OVERBLOOM + "\\).*"); @Init public static void init() {