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..2b66f99ddb6 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/chat/filters/RareCropFilter.java @@ -0,0 +1,78 @@ +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.SkyBlockIcons; +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; + +import static java.util.Map.entry; + +public class RareCropFilter extends ChatPatternListener { + 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() { + super("^RARE CROP!\\s+(?[\\w\\s]+)\\s+\\(\\+\\d+(?:\\.\\d+)?" + SkyBlockIcons.OVERBLOOM + "\\).*"); + } + + 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; + } +} 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..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,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+(?:\\.\\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'; 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",