From f3ae2bafce4a039f3395491a684b03560966b20c Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Wed, 31 Jul 2024 23:38:30 -0400 Subject: [PATCH 01/16] WIP, profit per functional --- .../mining/CrystalNucleusTrackerConfig.java | 45 +++++++++ .../config/features/mining/MiningConfig.java | 5 + .../events/mining/CrystalNucleusLootEvent.kt | 5 + .../crystalhollows/CrystalNucleusAPI.kt | 95 +++++++++++++++++++ .../crystalhollows/CrystalNucleusProfitPer.kt | 43 +++++++++ .../crystalhollows/CrystalNucleusTracker.kt | 9 ++ 6 files changed, 202 insertions(+) create mode 100644 src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java create mode 100644 src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt create mode 100644 src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java new file mode 100644 index 000000000000..3db983b20fac --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java @@ -0,0 +1,45 @@ +package at.hannibal2.skyhanni.config.features.mining; + +import at.hannibal2.skyhanni.config.FeatureToggle; +import com.google.gson.annotations.Expose; +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean; +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorDropdown; +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorSlider; +import io.github.notenoughupdates.moulconfig.annotations.ConfigOption; + +public class CrystalNucleusTrackerConfig { + @Expose + @ConfigOption(name = "Enabled", desc = "Enable the Powder Tracker overlay for mining.") + @ConfigEditorBoolean + @FeatureToggle + public boolean enabled = false; + + @Expose + @ConfigOption(name = "Profit Per", desc = "Show profit summary message for the completed nucleus run.") + @ConfigEditorBoolean + public boolean profitPer = true; + + @Expose + @ConfigOption(name = "Chat Modification Type", desc = "What should be done about the long run summary messages.") + @ConfigEditorDropdown + public CrystalNucleusTrackerFilterEntry chatModificationType = CrystalNucleusTrackerFilterEntry.SHOW_ABOVE; + + public enum CrystalNucleusTrackerFilterEntry { + HIDE("Hide Completely"), + SHOW("Show Completely"), + SHOW_ABOVE("Show Above §6_ coins"), + COMPACT("Compact"); + + private final String str; + + CrystalNucleusTrackerFilterEntry(String str) { this.str = str; } + + @Override + public String toString() { return str; } + } + + @Expose + @ConfigOption(name = "Coin Threshold", desc = "How many coins loot must be worth to be shown with §7\"§rShow Above §6_ coins§7\" enabled.") + @ConfigEditorSlider(minValue = 0, maxValue = 1000000000, minStep = 25000) + public int chatModificationThresholdValue = 10000; +} diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java index 08c8ec894a71..10d463e0aab5 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/mining/MiningConfig.java @@ -37,6 +37,11 @@ public class MiningConfig { @Accordion public AreaWallsConfig crystalHollowsAreaWalls = new AreaWallsConfig(); + @Expose + @ConfigOption(name = "Crystal Nucleus Tracker", desc = "") + @Accordion + public CrystalNucleusTrackerConfig crystalNucleusTracker = new CrystalNucleusTrackerConfig(); + @Expose @ConfigOption(name = "Cold Overlay", desc = "") @Accordion diff --git a/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt new file mode 100644 index 000000000000..09d34fd3a1f2 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt @@ -0,0 +1,5 @@ +package at.hannibal2.skyhanni.events.mining; + +import at.hannibal2.skyhanni.events.LorenzEvent + +class CrystalNucleusLootEvent(val loot: List>) : LorenzEvent() diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt new file mode 100644 index 000000000000..3444b0454157 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt @@ -0,0 +1,95 @@ +package at.hannibal2.skyhanni.features.mining.crystalhollows + +import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.events.LorenzChatEvent +import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent +import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule +import at.hannibal2.skyhanni.utils.ItemUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland +import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher +import at.hannibal2.skyhanni.utils.RegexUtils.matches +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +@SkyHanniModule +object CrystalNucleusAPI { + + private val patternGroup = RepoPattern.group("mining.crystalnucleus") + + /** + * REGEX-TEST: §r§5§lCRYSTAL NUCLEUS LOOT BUNDLE + */ + private val startPattern by patternGroup.pattern( + "loot.start", + " {2}§r§5§lCRYSTAL NUCLEUS LOOT BUNDLE" + ) + + /** + * REGEX-TEST: §3§l▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ + */ + private val endPattern by patternGroup.pattern( + "loot.end", + "§3§l▬{64}" + ) + + /** + * REGEX-TEST: §r§2Jade Dye §r§8x4 + * REGEX-TEST: §r§5Divan Fragment §r§8x2 + * REGEX-TEST: §r§5Pickonimbus 2000 + * REGEX-TEST: §r§9⸕ Fine Amber Gemstone + * REGEX-TEST: §r§9❈ Fine Amethyst Gemstone + * REGEX-TEST: §r§9☘ Fine Jade Gemstone + * REGEX-TEST: §r§9❁ Fine Jasper Gemstone + * REGEX-TEST: §r§9❤ Fine Ruby Gemstone + * REGEX-TEST: §r§9✎ Fine Sapphire Gemstone + * REGEX-TEST: §r§9✧ Fine Topaz Gemstone + * REGEX-TEST: §r§9Jaderald + * REGEX-TEST: §r§a⸕ Flawed Amber Gemstone §r§8x12 + * REGEX-TEST: §r§a❈ Flawed Amethyst Gemstone §r§8x48 + * REGEX-TEST: §r§a☘ Flawed Jade Gemstone §r§8x12 + * REGEX-TEST: §r§a❁ Flawed Jasper Gemstone §r§8x6 + * REGEX-TEST: §r§a❤ Flawed Ruby Gemstone §r§8x36 + * REGEX-TEST: §r§a✎ Flawed Sapphire Gemstone §r§8x6 + * REGEX-TEST: §r§a✧ Flawed Topaz Gemstone §r§8x6 + * REGEX-TEST: §r§fPrehistoric Egg + * REGEX-TEST: §r§dGemstone Powder §r§8x4,178 + */ + private val itemPattern by patternGroup.pattern("loot.item", "§r(?.+)") + + private var inLoot = false + private val loot = mutableListOf>() + + @SubscribeEvent + fun onChat(event: LorenzChatEvent) { + if (!IslandType.CRYSTAL_HOLLOWS.isInIsland()) return + + val message = event.message + + if (startPattern.matches(message)) { + inLoot = true + return + } + if (!inLoot) return + + if (endPattern.matches(message)) { + CrystalNucleusLootEvent(loot).postAndCatch() + loot.clear() + inLoot = false + return + } + + // All loot rewards start with 4 spaces. + // To simplify regex statements, this check is done outside the main logic. + // This also nerfs the "§r§a§lREWARDS" message. + val ssMessage = message.takeIf { it.startsWith(" ") }?.substring(4) ?: return + + var pair = itemPattern.matchMatcher(ssMessage) { + ItemUtils.readItemAmount(group("item")) + } ?: return + // Assume enchanted books are Fortune IV books + if (pair.first.let { it == "§fEnchanted" || it == "§fEnchanted Book" }) { + pair = "§9Fortune IV" to pair.second + } + loot.add(pair) + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt new file mode 100644 index 000000000000..4231e738cddc --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt @@ -0,0 +1,43 @@ +package at.hannibal2.skyhanni.features.mining.crystalhollows + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent +import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule +import at.hannibal2.skyhanni.utils.ChatUtils +import at.hannibal2.skyhanni.utils.CollectionUtils.sortedDesc +import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.NEUItems.getPrice +import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent + +@SkyHanniModule +class CrystalNucleusProfitPer { + private val config get() = SkyHanniMod.feature.mining.crystalNucleusTracker + + @SubscribeEvent + fun onCrystalNucleusLoot(event: CrystalNucleusLootEvent) { + if (!config.profitPer) return + val loot = event.loot + + var totalProfit = 0.0 + val map = mutableMapOf() + for ((name, amount) in loot) { + if (name == "§bGlacite Powder") continue + NEUInternalName.fromItemNameOrNull(name)?.let { + val pricePer = it.getPrice() + if (pricePer == -1.0) continue + val profit = amount * pricePer + val text = "§eFound $name §8${amount.addSeparators()}x §7(§6${profit.shortFormat()}§7)" + map[text] = profit + totalProfit += profit + } + } + + val hover = map.sortedDesc().keys.toMutableList() + val totalMessage = "Profit for Crystal Nucleus Run§e: §6${totalProfit.shortFormat()}" + hover.add("") + hover.add("§e$totalMessage") + ChatUtils.hoverableChat(totalMessage, hover) + } +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt new file mode 100644 index 000000000000..0460cb49b3e1 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -0,0 +1,9 @@ +package at.hannibal2.skyhanni.features.mining.crystalhollows + +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule + +@SkyHanniModule +object CrystalNucleusTracker { + private val config get() = SkyHanniMod.feature.mining.crystalNucleusTracker +} From 2bcc322529a3bc665d543ae826349183cd61b3b5 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Wed, 31 Jul 2024 23:45:00 -0400 Subject: [PATCH 02/16] Ignore both powders --- .../features/mining/crystalhollows/CrystalNucleusProfitPer.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt index 4231e738cddc..41090741e81e 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt @@ -23,7 +23,8 @@ class CrystalNucleusProfitPer { var totalProfit = 0.0 val map = mutableMapOf() for ((name, amount) in loot) { - if (name == "§bGlacite Powder") continue + // Gemstone and Mithril Powder + if (name.contains(" Powder")) continue NEUInternalName.fromItemNameOrNull(name)?.let { val pricePer = it.getPrice() if (pricePer == -1.0) continue From f3a90909a9dd307b5dc9b7994c5d4dbf9c97431f Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Thu, 1 Aug 2024 00:02:03 -0400 Subject: [PATCH 03/16] Cleanup --- .../skyhanni/events/mining/CrystalNucleusLootEvent.kt | 4 ++-- .../features/mining/crystalhollows/CrystalNucleusAPI.kt | 6 +++--- .../mining/crystalhollows/CrystalNucleusProfitPer.kt | 7 ++++--- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt index 09d34fd3a1f2..a431471c4471 100644 --- a/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt @@ -1,5 +1,5 @@ package at.hannibal2.skyhanni.events.mining; -import at.hannibal2.skyhanni.events.LorenzEvent +import at.hannibal2.skyhanni.api.event.SkyHanniEvent -class CrystalNucleusLootEvent(val loot: List>) : LorenzEvent() +class CrystalNucleusLootEvent(val loot: List>) : SkyHanniEvent() diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt index 3444b0454157..48c4aa7b738f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt @@ -21,7 +21,7 @@ object CrystalNucleusAPI { */ private val startPattern by patternGroup.pattern( "loot.start", - " {2}§r§5§lCRYSTAL NUCLEUS LOOT BUNDLE" + " {2}§r§5§lCRYSTAL NUCLEUS LOOT BUNDLE", ) /** @@ -29,7 +29,7 @@ object CrystalNucleusAPI { */ private val endPattern by patternGroup.pattern( "loot.end", - "§3§l▬{64}" + "§3§l▬{64}", ) /** @@ -72,7 +72,7 @@ object CrystalNucleusAPI { if (!inLoot) return if (endPattern.matches(message)) { - CrystalNucleusLootEvent(loot).postAndCatch() + CrystalNucleusLootEvent(loot).post() loot.clear() inLoot = false return diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt index 41090741e81e..c442af5b5e2d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt @@ -1,6 +1,8 @@ package at.hannibal2.skyhanni.features.mining.crystalhollows import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent +import at.hannibal2.skyhanni.api.event.HandleEvent.Companion.HIGH import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.ChatUtils @@ -9,13 +11,12 @@ import at.hannibal2.skyhanni.utils.NEUInternalName import at.hannibal2.skyhanni.utils.NEUItems.getPrice import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @SkyHanniModule -class CrystalNucleusProfitPer { +object CrystalNucleusProfitPer { private val config get() = SkyHanniMod.feature.mining.crystalNucleusTracker - @SubscribeEvent + @HandleEvent(priority = HIGH) fun onCrystalNucleusLoot(event: CrystalNucleusLootEvent) { if (!config.profitPer) return val loot = event.loot From 65592d1b6b6fc99034f62a7b16ed1da7c542c63e Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Thu, 1 Aug 2024 00:33:03 -0400 Subject: [PATCH 04/16] Progress on tracker, rework API --- .../mining/CrystalNucleusTrackerConfig.java | 13 ++- .../storage/ProfileSpecificStorage.java | 4 + .../crystalhollows/CrystalNucleusAPI.kt | 5 ++ .../crystalhollows/CrystalNucleusTracker.kt | 89 +++++++++++++++++++ 4 files changed, 110 insertions(+), 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java index 3db983b20fac..de887e4b8375 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java @@ -1,19 +1,30 @@ package at.hannibal2.skyhanni.config.features.mining; import at.hannibal2.skyhanni.config.FeatureToggle; +import at.hannibal2.skyhanni.config.core.config.Position; import com.google.gson.annotations.Expose; import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean; import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorDropdown; import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorSlider; +import io.github.notenoughupdates.moulconfig.annotations.ConfigLink; import io.github.notenoughupdates.moulconfig.annotations.ConfigOption; public class CrystalNucleusTrackerConfig { @Expose - @ConfigOption(name = "Enabled", desc = "Enable the Powder Tracker overlay for mining.") + @ConfigOption(name = "Enabled", desc = "Enable the Crystal Nucleus Tracker overlay for mining.") @ConfigEditorBoolean @FeatureToggle public boolean enabled = false; + @Expose + @ConfigLink(owner = CrystalNucleusTrackerConfig.class, field = "enabled") + public Position position = new Position(20, 20, false, true); + + @Expose + @ConfigOption(name = "Show Outside of Nucleus", desc = "Show the tracker anywhere in the Crystal Hollows.") + @ConfigEditorBoolean + public boolean showEverywhere = false; + @Expose @ConfigOption(name = "Profit Per", desc = "Show profit summary message for the completed nucleus run.") @ConfigEditorBoolean diff --git a/src/main/java/at/hannibal2/skyhanni/config/storage/ProfileSpecificStorage.java b/src/main/java/at/hannibal2/skyhanni/config/storage/ProfileSpecificStorage.java index 3410d9b4de08..0a063df6278d 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/storage/ProfileSpecificStorage.java +++ b/src/main/java/at/hannibal2/skyhanni/config/storage/ProfileSpecificStorage.java @@ -32,6 +32,7 @@ import at.hannibal2.skyhanni.features.inventory.chocolatefactory.ChocolateFactoryUpgrade; import at.hannibal2.skyhanni.features.inventory.wardrobe.WardrobeAPI; import at.hannibal2.skyhanni.features.mining.MineshaftPityDisplay; +import at.hannibal2.skyhanni.features.mining.crystalhollows.CrystalNucleusTracker; import at.hannibal2.skyhanni.features.mining.fossilexcavator.ExcavatorProfitTracker; import at.hannibal2.skyhanni.features.mining.powdertracker.PowderTracker; import at.hannibal2.skyhanni.features.misc.trevor.TrevorTracker; @@ -560,6 +561,9 @@ public static class MineshaftStorage { @Expose public List blocksBroken = new ArrayList<>(); } + + @Expose + public CrystalNucleusTracker.Data crystalNucleusTracker = new CrystalNucleusTracker.Data(); } @Expose diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt index 48c4aa7b738f..70ece26e9d27 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt @@ -92,4 +92,9 @@ object CrystalNucleusAPI { } loot.add(pair) } + + //Todo: Actual logic + fun isInNucleus(): Boolean { + return true + } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt index 0460cb49b3e1..820af4a5da80 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -1,9 +1,98 @@ package at.hannibal2.skyhanni.features.mining.crystalhollows import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.api.event.HandleEvent +import at.hannibal2.skyhanni.api.event.HandleEvent.Companion.HIGH +import at.hannibal2.skyhanni.data.IslandType +import at.hannibal2.skyhanni.events.GuiRenderEvent +import at.hannibal2.skyhanni.events.IslandChangeEvent +import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule +import at.hannibal2.skyhanni.utils.CollectionUtils.addAsSingletonList +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland +import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import at.hannibal2.skyhanni.utils.renderables.Renderable +import at.hannibal2.skyhanni.utils.tracker.ItemTrackerData +import at.hannibal2.skyhanni.utils.tracker.SkyHanniItemTracker +import com.google.gson.annotations.Expose +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @SkyHanniModule object CrystalNucleusTracker { private val config get() = SkyHanniMod.feature.mining.crystalNucleusTracker + + private val tracker = SkyHanniItemTracker( + "Crystal Nucleus Tracker", + { Data() }, + { it.mining.crystalNucleusTracker }) { drawDisplay(it)} + + class Data : ItemTrackerData() { + override fun resetItems() { + runsCompleted = 0L + } + + override fun getDescription(timesGained: Long): List { + val percentage = timesGained.toDouble() / runsCompleted + val dropRate = LorenzUtils.formatPercentage(percentage.coerceAtMost(1.0)) + return listOf( + "§7Dropped §e${timesGained.addSeparators()} §7times.", + "§7Your drop rate: §c$dropRate." + ) + } + + // No direct coin drops from nuc runs + override fun getCoinName(item: TrackedItem) = "" + override fun getCoinDescription(item: TrackedItem) = mutableListOf() + + @Expose + var runsCompleted = 0L + } + + @HandleEvent(priority = HIGH) + fun onCrystalNucleusLoot(event: CrystalNucleusLootEvent) { + //Todo: Add items to tracker + } + + private fun addCompletedRun() { + tracker.modify { + it.runsCompleted++ + } + } + + private fun drawDisplay(data: Data): List> = buildList { + addAsSingletonList("§e§lPest Profit Tracker") + val profit = tracker.drawItems(data, { true }, this) + + val runsCompleted = data.runsCompleted + addAsSingletonList( + Renderable.hoverTips( + "§7Runs completed: §e${runsCompleted.addSeparators()}", + listOf("§7You completed §e${runsCompleted.addSeparators()} §7Crystal Nucleus Runs.") + ) + ) + addAsSingletonList(tracker.addTotalProfit(profit, data.runsCompleted, "run")) + + tracker.addPriceFromButton(this) + } + + @SubscribeEvent + fun onRenderOverlay(event: GuiRenderEvent) { + if (!isEnabled()) return + + tracker.renderDisplay(config.position) + } + + @SubscribeEvent + fun onIslandChange(event: IslandChangeEvent) { + if (event.newIsland == IslandType.CRYSTAL_HOLLOWS) { + tracker.firstUpdate() + } + } + + fun resetCommand() { + tracker.resetCommand() + } + + fun isEnabled() = IslandType.CRYSTAL_HOLLOWS.isInIsland() && config.enabled && (CrystalNucleusAPI.isInNucleus() || config.showEverywhere) } From 7a5690ee7abe0c995910750817303c02a998a050 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Thu, 1 Aug 2024 21:10:33 -0400 Subject: [PATCH 05/16] Sto progress --- .../skyhanni/config/commands/Commands.kt | 2 + .../features/chat/CrystalNucleusConfig.java | 59 +++++++++++++++++++ .../features/chat/FilterTypesConfig.java | 7 ++- ...terConfig.java => PowderMiningConfig.java} | 30 +++++----- ...g.java => PowderMiningGemstoneConfig.java} | 2 +- .../mining/CrystalNucleusTrackerConfig.java | 33 ++--------- .../skyhanni/features/chat/ChatFilter.kt | 2 +- .../features/chat/PowderMiningChatFilter.kt | 52 ++++++++-------- .../crystalhollows/CrystalNucleusAPI.kt | 6 +- .../crystalhollows/CrystalNucleusTracker.kt | 14 ++++- 10 files changed, 131 insertions(+), 76 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java rename src/main/java/at/hannibal2/skyhanni/config/features/chat/{PowderMiningFilterConfig.java => PowderMiningConfig.java} (81%) rename src/main/java/at/hannibal2/skyhanni/config/features/chat/{PowderMiningGemstoneFilterConfig.java => PowderMiningGemstoneConfig.java} (97%) diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt index 6dd8db8ad710..2ce3ac98798e 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -54,6 +54,7 @@ import at.hannibal2.skyhanni.features.garden.visitor.GardenVisitorDropStatistics import at.hannibal2.skyhanni.features.inventory.chocolatefactory.ChocolateFactoryStrayTracker import at.hannibal2.skyhanni.features.mining.KingTalismanHelper import at.hannibal2.skyhanni.features.mining.MineshaftPityDisplay +import at.hannibal2.skyhanni.features.mining.crystalhollows.CrystalNucleusTracker import at.hannibal2.skyhanni.features.mining.powdertracker.PowderTracker import at.hannibal2.skyhanni.features.minion.MinionFeatures import at.hannibal2.skyhanni.features.misc.CollectionTracker @@ -210,6 +211,7 @@ object Commands { ) { clearFarmingItems() } registerCommand("shresetghostcounter", "Resets the ghost counter") { GhostUtil.reset() } registerCommand("shresetpowdertracker", "Resets the Powder Tracker") { PowderTracker.resetCommand() } + registerCommand("shresetcrystalnucleustracker", "Resets the Crystal Nucleus Tracker") { CrystalNucleusTracker.resetCommand() } registerCommand("shresetdicertracker", "Resets the Dicer Drop Tracker") { DicerRngDropTracker.resetCommand() } registerCommand( "shresetendernodetracker", diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java new file mode 100644 index 000000000000..a859e9e2a6ae --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java @@ -0,0 +1,59 @@ +package at.hannibal2.skyhanni.config.features.chat; + +import at.hannibal2.skyhanni.config.FeatureToggle; +import com.google.gson.annotations.Expose; +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean; +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorDraggableList; +import io.github.notenoughupdates.moulconfig.annotations.ConfigOption; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class CrystalNucleusConfig { + + @Expose + @ConfigOption(name = "Enabled", desc = "Modify or hide messages relating to Crystal Nucleus runs in the Crystal Hollows.") + @ConfigEditorBoolean + @FeatureToggle + public boolean enabled = false; + + public enum CrystalNucleusMessageTypes { + RUN_COMPLETED("§5Run Completed"), + CRYSTAL_COLLECTED("§aC§6r§dy§bs§et§aa§6l §7Collected"), + CRYSTAL_PLACED("§aC§6r§dy§bs§et§aa§6l §fPlaced"), + NPC_KEEPER("§e[NPC] §6Keeper"), + NPC_PROF_ROBOT("§e[NPC] Professor Robot"), + NPC_KING_YOLKAR("§e[NPC] §6King Yolkar"), + NON_TOOL_SCAVENGE("§7Non-Tool §cMetal Detector") + ; + + private final String name; + + CrystalNucleusMessageTypes(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } + } + + @Expose + @ConfigOption(name = "Hidden Messages", desc = "Messages that should be completely hidden.") + @ConfigEditorDraggableList + public List hiddenMessages = new ArrayList<>(Arrays.asList( + CrystalNucleusMessageTypes.CRYSTAL_PLACED, + CrystalNucleusMessageTypes.NON_TOOL_SCAVENGE + )); + + @Expose + @ConfigOption(name = "Compacted Messages", desc = "Messages that should be compacted (where possible).") + @ConfigEditorDraggableList + public List compactedMessages = new ArrayList<>(Arrays.asList( + CrystalNucleusMessageTypes.CRYSTAL_COLLECTED, + CrystalNucleusMessageTypes.RUN_COMPLETED + )); +} diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/chat/FilterTypesConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/chat/FilterTypesConfig.java index 0187af82eac6..a8e750fd5b23 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/chat/FilterTypesConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/chat/FilterTypesConfig.java @@ -11,7 +11,12 @@ public class FilterTypesConfig { @Expose @ConfigOption(name = "Powder Mining", desc = "") @Accordion - public PowderMiningFilterConfig powderMiningFilter = new PowderMiningFilterConfig(); + public PowderMiningConfig powderMining = new PowderMiningConfig(); + + @Expose + @ConfigOption(name = "Crystal Nucleus", desc = "") + @Accordion + public CrystalNucleusConfig crystalNucleus = new CrystalNucleusConfig(); @Expose @ConfigOption(name = "Hypixel Lobbies", desc = "Hide announcements in Hypixel lobbies " + diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningFilterConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningConfig.java similarity index 81% rename from src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningFilterConfig.java rename to src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningConfig.java index 42a53f8dd3bf..a18324e69598 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningFilterConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningConfig.java @@ -13,15 +13,15 @@ import java.util.Arrays; import java.util.List; -import static at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.ASCENSION_ROPE; -import static at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.JUNGLE_HEART; -import static at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.OIL_BARREL; -import static at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.SLUDGE_JUICE; -import static at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.TREASURITE; -import static at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.WISHING_COMPASS; -import static at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.YOGGIE; - -public class PowderMiningFilterConfig { +import static at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.ASCENSION_ROPE; +import static at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.JUNGLE_HEART; +import static at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.OIL_BARREL; +import static at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.SLUDGE_JUICE; +import static at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.TREASURITE; +import static at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.WISHING_COMPASS; +import static at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.YOGGIE; + +public class PowderMiningConfig { @Expose @ConfigOption(name = "Enabled", desc = "Hide messages while opening chests in the Crystal Hollows.") @ConfigEditorBoolean @@ -34,7 +34,7 @@ public class PowderMiningFilterConfig { "\n§a0§7: §aShow all\n§c60000§7: §cHide all" ) @ConfigEditorSlider(minValue = 0, maxValue = 60000, minStep = 500) - public int powderFilterThreshold = 1000; + public int powderThreshold = 1000; @Expose @ConfigOption( @@ -42,7 +42,7 @@ public class PowderMiningFilterConfig { "\n§a0§7: §aShow all\n§c20§7: §cHide all" ) @ConfigEditorSlider(minValue = 0, maxValue = 20, minStep = 1) - public int essenceFilterThreshold = 5; + public int essenceThreshold = 5; public enum SimplePowderMiningRewardTypes { @@ -86,9 +86,9 @@ public String toString() { @Expose @ConfigOption(name = "Goblin Egg", desc = "Hide Goblin Egg rewards that are below a certain rarity.") @ConfigEditorDropdown - public GoblinEggFilterEntry goblinEggs = GoblinEggFilterEntry.YELLOW_UP; + public GoblinEggEntry goblinEggs = GoblinEggEntry.YELLOW_UP; - public enum GoblinEggFilterEntry { + public enum GoblinEggEntry { SHOW_ALL("Show all"), HIDE_ALL("Hide all"), GREEN_UP("Show §aGreen §7and up"), @@ -98,7 +98,7 @@ public enum GoblinEggFilterEntry { private final String name; - GoblinEggFilterEntry(String name) { + GoblinEggEntry(String name) { this.name = name; } @@ -112,6 +112,6 @@ public String toString() { @ConfigOption(name = "Gemstones", desc = "") @Accordion // TODO remove config - public PowderMiningGemstoneFilterConfig gemstoneFilterConfig = new PowderMiningGemstoneFilterConfig(); + public PowderMiningGemstoneConfig gemstoneConfig = new PowderMiningGemstoneConfig(); } diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningGemstoneFilterConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningGemstoneConfig.java similarity index 97% rename from src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningGemstoneFilterConfig.java rename to src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningGemstoneConfig.java index 3a44738ca6e8..1e0118e926e5 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningGemstoneFilterConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningGemstoneConfig.java @@ -5,7 +5,7 @@ import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorDropdown; import io.github.notenoughupdates.moulconfig.annotations.ConfigOption; -public class PowderMiningGemstoneFilterConfig { +public class PowderMiningGemstoneConfig { @Expose @ConfigOption(name = "Stronger Tool Messages", desc = "Hide 'You need a stronger tool..' messages.") diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java index de887e4b8375..6a5362c2669f 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java @@ -4,14 +4,12 @@ import at.hannibal2.skyhanni.config.core.config.Position; import com.google.gson.annotations.Expose; import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean; -import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorDropdown; -import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorSlider; import io.github.notenoughupdates.moulconfig.annotations.ConfigLink; import io.github.notenoughupdates.moulconfig.annotations.ConfigOption; public class CrystalNucleusTrackerConfig { @Expose - @ConfigOption(name = "Enabled", desc = "Enable the Crystal Nucleus Tracker overlay for mining.") + @ConfigOption(name = "Enabled", desc = "Enable the Crystal Nucleus Tracker overlay.") @ConfigEditorBoolean @FeatureToggle public boolean enabled = false; @@ -20,6 +18,11 @@ public class CrystalNucleusTrackerConfig { @ConfigLink(owner = CrystalNucleusTrackerConfig.class, field = "enabled") public Position position = new Position(20, 20, false, true); + @Expose + @ConfigOption(name = "Hide in Chocolate Factory", desc = "Hide tracker while the Chocolate Factory is open.") + @ConfigEditorBoolean + public boolean hideInCf = true; + @Expose @ConfigOption(name = "Show Outside of Nucleus", desc = "Show the tracker anywhere in the Crystal Hollows.") @ConfigEditorBoolean @@ -29,28 +32,4 @@ public class CrystalNucleusTrackerConfig { @ConfigOption(name = "Profit Per", desc = "Show profit summary message for the completed nucleus run.") @ConfigEditorBoolean public boolean profitPer = true; - - @Expose - @ConfigOption(name = "Chat Modification Type", desc = "What should be done about the long run summary messages.") - @ConfigEditorDropdown - public CrystalNucleusTrackerFilterEntry chatModificationType = CrystalNucleusTrackerFilterEntry.SHOW_ABOVE; - - public enum CrystalNucleusTrackerFilterEntry { - HIDE("Hide Completely"), - SHOW("Show Completely"), - SHOW_ABOVE("Show Above §6_ coins"), - COMPACT("Compact"); - - private final String str; - - CrystalNucleusTrackerFilterEntry(String str) { this.str = str; } - - @Override - public String toString() { return str; } - } - - @Expose - @ConfigOption(name = "Coin Threshold", desc = "How many coins loot must be worth to be shown with §7\"§rShow Above §6_ coins§7\" enabled.") - @ConfigEditorSlider(minValue = 0, maxValue = 1000000000, minStep = 25000) - public int chatModificationThresholdValue = 10000; } diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt index e4e411d4c6d7..0bc7e4c4aa74 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt @@ -459,7 +459,7 @@ object ChatFilter { @SubscribeEvent fun onChat(event: LorenzChatEvent) { var blockReason = block(event.message) - if (blockReason == null && config.powderMiningFilter.enabled) blockReason = powderMiningBlock(event) + if (blockReason == null && config.powderMining.enabled) blockReason = powderMiningBlock(event) event.blockedReason = blockReason ?: return } diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/PowderMiningChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/PowderMiningChatFilter.kt index 32ce17b8d788..33fb16a4795d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/PowderMiningChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/PowderMiningChatFilter.kt @@ -1,18 +1,18 @@ package at.hannibal2.skyhanni.features.chat import at.hannibal2.skyhanni.SkyHanniMod -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.ASCENSION_ROPE -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.JUNGLE_HEART -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.OIL_BARREL -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.PICKONIMBUS -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.PREHISTORIC_EGG -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.ROBOT_PARTS -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.SLUDGE_JUICE -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.TREASURITE -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.WISHING_COMPASS -import at.hannibal2.skyhanni.config.features.chat.PowderMiningFilterConfig.SimplePowderMiningRewardTypes.YOGGIE -import at.hannibal2.skyhanni.config.features.chat.PowderMiningGemstoneFilterConfig.GemstoneFilterEntry +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.ASCENSION_ROPE +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.JUNGLE_HEART +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.OIL_BARREL +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.PICKONIMBUS +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.PREHISTORIC_EGG +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.ROBOT_PARTS +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.SLUDGE_JUICE +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.TREASURITE +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.WISHING_COMPASS +import at.hannibal2.skyhanni.config.features.chat.PowderMiningConfig.SimplePowderMiningRewardTypes.YOGGIE +import at.hannibal2.skyhanni.config.features.chat.PowderMiningGemstoneConfig.GemstoneFilterEntry import at.hannibal2.skyhanni.events.RepositoryReloadEvent import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.test.command.ErrorManager @@ -27,8 +27,8 @@ import java.util.regex.Pattern @SkyHanniModule object PowderMiningChatFilter { - private val config get() = SkyHanniMod.feature.chat.filterType.powderMiningFilter - private val gemstoneConfig get() = config.gemstoneFilterConfig + private val config get() = SkyHanniMod.feature.chat.filterType.powderMining + private val gemstoneConfig get() = config.gemstoneConfig val patternGroup = RepoPattern.group("filter.powdermining") @@ -266,22 +266,22 @@ object PowderMiningChatFilter { //Powder powderRewardPattern.matchMatcher(ssMessage) { - if (config.powderFilterThreshold == 60000) return "powder_mining_powder" + if (config.powderThreshold == 60000) return "powder_mining_powder" val amountStr = groupOrNull("amount") ?: "1" - if (amountStr.isNotEmpty() && config.powderFilterThreshold > 0) { + if (amountStr.isNotEmpty() && config.powderThreshold > 0) { val amountParsed = amountStr.replace(",", "").toInt() - return if (amountParsed < config.powderFilterThreshold) "powder_mining_powder" + return if (amountParsed < config.powderThreshold) "powder_mining_powder" else "no_filter" } } //Essence essenceRewardPattern.matchMatcher(ssMessage) { - if (config.essenceFilterThreshold == 20) return "powder_mining_essence" + if (config.essenceThreshold == 20) return "powder_mining_essence" val amountStr = groupOrNull("amount") ?: "1" - if (amountStr.isNotEmpty() && config.essenceFilterThreshold > 0) { + if (amountStr.isNotEmpty() && config.essenceThreshold > 0) { val amountParsed = amountStr.toInt() - return if (amountParsed < config.essenceFilterThreshold) "powder_mining_essence" + return if (amountParsed < config.essenceThreshold) "powder_mining_essence" else "no_filter" } } @@ -294,7 +294,7 @@ object PowderMiningChatFilter { return null } - var rewardPatterns: Map, String> = emptyMap() + var rewardPatterns: Map, String> = emptyMap() @SubscribeEvent(priority = EventPriority.HIGHEST) fun onRepoReload(event: RepositoryReloadEvent) { @@ -324,21 +324,21 @@ object PowderMiningChatFilter { private fun blockGoblinEggs(ssMessage: String): String? { goblinEggPattern.matchMatcher(ssMessage) { - if (config.goblinEggs == PowderMiningFilterConfig.GoblinEggFilterEntry.SHOW_ALL) return "no_filter" - if (config.goblinEggs == PowderMiningFilterConfig.GoblinEggFilterEntry.HIDE_ALL) return "powder_mining_goblin_eggs" + if (config.goblinEggs == PowderMiningConfig.GoblinEggEntry.SHOW_ALL) return "no_filter" + if (config.goblinEggs == PowderMiningConfig.GoblinEggEntry.HIDE_ALL) return "powder_mining_goblin_eggs" return when (val colorStr = groupOrNull("color")?.lowercase()) { //'Colorless', base goblin eggs will never be shown in this code path null -> "powder_mining_goblin_eggs" - "green" -> if (config.goblinEggs > PowderMiningFilterConfig.GoblinEggFilterEntry.GREEN_UP) { + "green" -> if (config.goblinEggs > PowderMiningConfig.GoblinEggEntry.GREEN_UP) { "powder_mining_goblin_eggs" } else "no_filter" - "yellow" -> if (config.goblinEggs > PowderMiningFilterConfig.GoblinEggFilterEntry.YELLOW_UP) { + "yellow" -> if (config.goblinEggs > PowderMiningConfig.GoblinEggEntry.YELLOW_UP) { "powder_mining_goblin_eggs" } else "no_filter" - "red" -> if (config.goblinEggs > PowderMiningFilterConfig.GoblinEggFilterEntry.RED_UP) { + "red" -> if (config.goblinEggs > PowderMiningConfig.GoblinEggEntry.RED_UP) { "powder_mining_goblin_eggs" } else "no_filter" // BLUE_ONLY enum not explicitly used in comparison, as the only diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt index 70ece26e9d27..0691139582a4 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt @@ -21,15 +21,15 @@ object CrystalNucleusAPI { */ private val startPattern by patternGroup.pattern( "loot.start", - " {2}§r§5§lCRYSTAL NUCLEUS LOOT BUNDLE", + " {2}§r§5§lCRYSTAL NUCLEUS LOOT BUNDLE.*", ) /** - * REGEX-TEST: §3§l▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ + * REGEX-TEST: §7Pick it up near the §r§5Nucleus Vault§r§7! */ private val endPattern by patternGroup.pattern( "loot.end", - "§3§l▬{64}", + "§7Pick it up near the §r§5Nucleus Vault§r§7!.*", ) /** diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt index 820af4a5da80..083d5971e027 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -7,10 +7,12 @@ import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.IslandChangeEvent import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent +import at.hannibal2.skyhanni.features.inventory.chocolatefactory.ChocolateFactoryAPI import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.CollectionUtils.addAsSingletonList import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland +import at.hannibal2.skyhanni.utils.NEUInternalName import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.renderables.Renderable import at.hannibal2.skyhanni.utils.tracker.ItemTrackerData @@ -51,7 +53,14 @@ object CrystalNucleusTracker { @HandleEvent(priority = HIGH) fun onCrystalNucleusLoot(event: CrystalNucleusLootEvent) { - //Todo: Add items to tracker + addCompletedRun() + for ((itemName, amount) in event.loot) { + // Gemstone and Mithril Powder + if (itemName.contains(" Powder")) continue + NEUInternalName.fromItemNameOrNull(itemName)?.let { + tracker.addItem(it, amount) + } + } } private fun addCompletedRun() { @@ -61,7 +70,7 @@ object CrystalNucleusTracker { } private fun drawDisplay(data: Data): List> = buildList { - addAsSingletonList("§e§lPest Profit Tracker") + addAsSingletonList("§e§lCrystal Nucleus Profit Tracker") val profit = tracker.drawItems(data, { true }, this) val runsCompleted = data.runsCompleted @@ -79,6 +88,7 @@ object CrystalNucleusTracker { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent) { if (!isEnabled()) return + if(config.hideInCf && ChocolateFactoryAPI.inChocolateFactory) return tracker.renderDisplay(config.position) } From 0e08e6d2c14e20a18825ea44012d20a3f72fc3f6 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Fri, 2 Aug 2024 00:43:23 -0400 Subject: [PATCH 06/16] Everything except chat filter done --- .../config/features/chat/CrystalNucleusConfig.java | 1 - .../features/mining/CrystalNucleusTrackerConfig.java | 8 +++++++- .../skyhanni/features/chat/CrystalNucleusChatFilter.kt | 7 +++++++ .../features/mining/crystalhollows/CrystalNucleusAPI.kt | 6 +----- .../mining/crystalhollows/CrystalNucleusProfitPer.kt | 3 ++- .../mining/crystalhollows/CrystalNucleusTracker.kt | 2 +- 6 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 src/main/java/at/hannibal2/skyhanni/features/chat/CrystalNucleusChatFilter.kt diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java index a859e9e2a6ae..0585867d3426 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java @@ -8,7 +8,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; public class CrystalNucleusConfig { diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java index 6a5362c2669f..d9d84a63f305 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/mining/CrystalNucleusTrackerConfig.java @@ -4,6 +4,7 @@ import at.hannibal2.skyhanni.config.core.config.Position; import com.google.gson.annotations.Expose; import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorBoolean; +import io.github.notenoughupdates.moulconfig.annotations.ConfigEditorSlider; import io.github.notenoughupdates.moulconfig.annotations.ConfigLink; import io.github.notenoughupdates.moulconfig.annotations.ConfigOption; @@ -26,10 +27,15 @@ public class CrystalNucleusTrackerConfig { @Expose @ConfigOption(name = "Show Outside of Nucleus", desc = "Show the tracker anywhere in the Crystal Hollows.") @ConfigEditorBoolean - public boolean showEverywhere = false; + public boolean showOutsideNucleus = false; @Expose @ConfigOption(name = "Profit Per", desc = "Show profit summary message for the completed nucleus run.") @ConfigEditorBoolean public boolean profitPer = true; + + @Expose + @ConfigOption(name = "Profit Per Minimum", desc = "Only show items above this coin amount in the summary message hover.") + @ConfigEditorSlider(minValue = 0, maxValue = 1000000, minStep = 5000) + public int profitPerMinimum = 20000; } diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/CrystalNucleusChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/CrystalNucleusChatFilter.kt new file mode 100644 index 000000000000..21f320b51a99 --- /dev/null +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/CrystalNucleusChatFilter.kt @@ -0,0 +1,7 @@ +package at.hannibal2.skyhanni.features.chat + +import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule + +@SkyHanniModule +object CrystalNucleusChatFilter { +} diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt index 0691139582a4..d2c68d9d6725 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt @@ -5,6 +5,7 @@ import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.ItemUtils +import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher import at.hannibal2.skyhanni.utils.RegexUtils.matches @@ -92,9 +93,4 @@ object CrystalNucleusAPI { } loot.add(pair) } - - //Todo: Actual logic - fun isInNucleus(): Boolean { - return true - } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt index c442af5b5e2d..a76348d8e4e3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt @@ -36,7 +36,8 @@ object CrystalNucleusProfitPer { } } - val hover = map.sortedDesc().keys.toMutableList() + val hover = map.sortedDesc().filter{ it.value >= config.profitPerMinimum }.keys.toMutableList() + if(hover.size != map.size) hover.add("§7${map.size - hover.size} cheap items are hidden.") val totalMessage = "Profit for Crystal Nucleus Run§e: §6${totalProfit.shortFormat()}" hover.add("") hover.add("§e$totalMessage") diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt index 083d5971e027..36548b9dd432 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -104,5 +104,5 @@ object CrystalNucleusTracker { tracker.resetCommand() } - fun isEnabled() = IslandType.CRYSTAL_HOLLOWS.isInIsland() && config.enabled && (CrystalNucleusAPI.isInNucleus() || config.showEverywhere) + fun isEnabled() = config.enabled && IslandType.CRYSTAL_HOLLOWS.isInIsland() && (config.showOutsideNucleus || LorenzUtils.skyBlockArea == "Crystal Nucleus") } From 81438a7aaaa143bdef11e2a60ac56546d0efe6c5 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:30:28 -0400 Subject: [PATCH 07/16] All features functional --- .../features/chat/CrystalNucleusConfig.java | 27 +-- .../skyhanni/features/chat/ChatFilter.kt | 16 ++ .../features/chat/CrystalNucleusChatFilter.kt | 220 ++++++++++++++++++ .../crystalhollows/CrystalNucleusAPI.kt | 1 - .../crystalhollows/CrystalNucleusProfitPer.kt | 26 ++- .../crystalhollows/CrystalNucleusTracker.kt | 14 +- 6 files changed, 279 insertions(+), 25 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java index 0585867d3426..4a33127b2d04 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/chat/CrystalNucleusConfig.java @@ -13,19 +13,19 @@ public class CrystalNucleusConfig { @Expose - @ConfigOption(name = "Enabled", desc = "Modify or hide messages relating to Crystal Nucleus runs in the Crystal Hollows.") + @ConfigOption(name = "Enabled", desc = "Hide or compact messages relating to Crystal Nucleus runs in the Crystal Hollows.") @ConfigEditorBoolean @FeatureToggle public boolean enabled = false; public enum CrystalNucleusMessageTypes { - RUN_COMPLETED("§5Run Completed"), + RUN_COMPLETED("§5Run Completed Summary"), CRYSTAL_COLLECTED("§aC§6r§dy§bs§et§aa§6l §7Collected"), - CRYSTAL_PLACED("§aC§6r§dy§bs§et§aa§6l §fPlaced"), - NPC_KEEPER("§e[NPC] §6Keeper"), + CRYSTAL_PLACED("§aC§6r§dy§bs§et§aa§6l §7Placed"), + NPC_DIVAN_KEEPERS("§e[NPC] §6Keepers §7(§2Mines of Divan§7)"), NPC_PROF_ROBOT("§e[NPC] Professor Robot"), NPC_KING_YOLKAR("§e[NPC] §6King Yolkar"), - NON_TOOL_SCAVENGE("§7Non-Tool §cMetal Detector") + NON_TOOL_SCAVENGE("§7Non-Tool §cMetal Detector §7loot") ; private final String name; @@ -41,18 +41,15 @@ public String toString() { } @Expose - @ConfigOption(name = "Hidden Messages", desc = "Messages that should be completely hidden.") + @ConfigOption(name = "Modified Messages", desc = "Messages that should be hidden or compacted.\n§cImportant information will still appear§7.") @ConfigEditorDraggableList - public List hiddenMessages = new ArrayList<>(Arrays.asList( + public List modifiedMessages = new ArrayList<>(Arrays.asList( + CrystalNucleusMessageTypes.CRYSTAL_COLLECTED, CrystalNucleusMessageTypes.CRYSTAL_PLACED, + CrystalNucleusMessageTypes.RUN_COMPLETED, + CrystalNucleusMessageTypes.NPC_DIVAN_KEEPERS, + CrystalNucleusMessageTypes.NPC_PROF_ROBOT, + CrystalNucleusMessageTypes.NPC_KING_YOLKAR, CrystalNucleusMessageTypes.NON_TOOL_SCAVENGE )); - - @Expose - @ConfigOption(name = "Compacted Messages", desc = "Messages that should be compacted (where possible).") - @ConfigEditorDraggableList - public List compactedMessages = new ArrayList<>(Arrays.asList( - CrystalNucleusMessageTypes.CRYSTAL_COLLECTED, - CrystalNucleusMessageTypes.RUN_COMPLETED - )); } diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt index 0bc7e4c4aa74..ec64be74a7c8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt @@ -16,6 +16,7 @@ import at.hannibal2.skyhanni.utils.StringUtils import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraft.util.ChatComponentText import net.minecraftforge.fml.common.eventhandler.SubscribeEvent +import tv.twitch.chat.Chat import java.util.regex.Pattern @SkyHanniModule @@ -460,6 +461,7 @@ object ChatFilter { fun onChat(event: LorenzChatEvent) { var blockReason = block(event.message) if (blockReason == null && config.powderMining.enabled) blockReason = powderMiningBlock(event) + if (blockReason == null && config.crystalNucleus.enabled) blockReason = crystalNucleusBlock(event) event.blockedReason = blockReason ?: return } @@ -519,6 +521,20 @@ object ChatFilter { return powderMiningMatchResult } + /** + * Checks if the message is a blocked Crystal Nucleus Run message, as defined in CrystalNucleusChatFilter. + * Will conditionally modify/compact messages in some cases, or return a blocking code + * @param event The event to check + * @return Block reason if applicable + * @see block + */ + private fun crystalNucleusBlock(event: LorenzChatEvent): String? { + val (blockCode, newMessage) = CrystalNucleusChatFilter.block(event.message)?.getPair() ?: Pair(null, null) + newMessage?.let { event.chatComponent = ChatComponentText(it) } + blockCode?.let { return it } + return null + } + private var othersMsg: String? = null /** diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/CrystalNucleusChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/CrystalNucleusChatFilter.kt index 21f320b51a99..a8fcc6db4f13 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/CrystalNucleusChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/CrystalNucleusChatFilter.kt @@ -1,7 +1,227 @@ package at.hannibal2.skyhanni.features.chat +import at.hannibal2.skyhanni.SkyHanniMod +import at.hannibal2.skyhanni.config.features.chat.CrystalNucleusConfig.CrystalNucleusMessageTypes +import at.hannibal2.skyhanni.data.IslandType import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule +import at.hannibal2.skyhanni.utils.LorenzUtils +import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland +import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher +import at.hannibal2.skyhanni.utils.RegexUtils.matches +import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern @SkyHanniModule object CrystalNucleusChatFilter { + + class NucleusChatFilterRes(private var blockMessage: String? = null, private var newMessage: String? = null) { + fun getPair(): Pair { + return Pair(blockMessage, newMessage) + } + } + + private val config get() = SkyHanniMod.feature.chat.filterType.crystalNucleus + private val patternGroup = RepoPattern.group("filter.crystalnucleus") + + private var unclosedRunCompleted = false + private var unclosedCrystalCollected = false + private var crystalCount = 0 + private var crystalCollected = "" + + /** + * REGEX-TEST: §3§l▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ + */ + private val runCompletedWrapperPattern by patternGroup.pattern( + "run.completed", + "§3§l▬{64}", + ) + + /** + * REGEX-TEST: §5§l▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ + */ + private val crystalCollectedWrapperPattern by patternGroup.pattern( + "crystal.collected.wrapper", + "§5§l▬{64}", + ) + + /** + * REGEX-TEST: §f §r§5§l✦ CRYSTAL FOUND §r§7(1§r§7/5§r§7) + */ + private val crystalCollectedCountPattern by patternGroup.pattern( + "crystal.collected.count", + "§f *§r§5§l✦ CRYSTAL FOUND §r§7\\((?\\d)§r§7/5§r§7\\)", + ) + + /** + * REGEX-TEST: §f §r§5Amethyst Crystal + * REGEX-TEST: §f §r§bSapphire Crystal + * REGEX-TEST: §f §r§6Amber Crystal + * REGEX-TEST: §f §r§eTopaz Crystal + * REGEX-TEST: §f §r§aJade Crystal + */ + private val crystalCollectedIdentifierPattern by patternGroup.pattern( + "crystal.collected.id", + "§f *§r(?(.* Crystal)) *", + ) + + /** + * REGEX-TEST: §5§l✦ §r§dYou placed the §r§bSapphire Crystal§r§d! + */ + private val crystalPlacedPattern by patternGroup.pattern( + "crystal.placed", + "§5§l✦ §r§dYou placed the §r(?.* Crystal)§r§d!", + ) + + /** + * REGEX-TEST: §aYou found §r§cScavenged Diamond Axe §r§awith your §r§cMetal Detector§r§a! + * REGEX-TEST: §aYou found §r§cScavenged Emerald Hammer §r§awith your §r§cMetal Detector§r§a! + * REGEX-TEST: §aYou found §r§a☘ Flawed Jade Gemstone §r§8x2 §r§awith your §r§cMetal Detector§r§a! + */ + private val scavengeLootPattern by patternGroup.pattern( + "divan.scavenge", + "§aYou found §r(?.*) §r§awith your §r§cMetal Detector§r§a!", + ) + + /** + * REGEX-TEST: Thanks for bringing me the §9Synthetic Heart§r! Bring me 5 more components to fix the giant! + * REGEX-TEST: Thanks for bringing me the §9Robotron Reflector§r! Bring me 5 more components to fix the giant! + * REGEX-TEST: Thanks for bringing me the §9Superlite Motor§r! Bring me 4 more components to fix the giant! + * REGEX-TEST: Thanks for bringing me the §9Synthetic Heart§r! Bring me 3 more components to fix the giant! + * REGEX-TEST: Thanks for bringing me the §9FTX 3070§r! Bring me 2 more components to fix the giant! + * REGEX-TEST: Thanks for bringing me the §9Electron Transmitter§r! Bring me one more component to fix the giant! + * REGEX-TEST: §rYou've brought me all of the components! + * REGEX-TEST: §rYou've brought me all of the components... I think? To be honest, I kind of lost count... + */ + private val componentSubmittedPattern by patternGroup.pattern( + "precursor.submitted", + ".*(You've brought me all|me the (?.*)§r! Bring me (?(\\d|one)) more).*", + ) + + fun block(message: String): NucleusChatFilterRes? { + if (!isEnabled()) return null + + blockCrystalCollected(message)?.let { return it } + blockCrystalPlaced(message)?.let { return it } + blockRunCompleted(message)?.let { return it } + blockNonToolScavenge(message)?.let { return it } + blockNPC(message)?.let { return it } + + return null + } + + private fun blockCrystalCollected(message: String): NucleusChatFilterRes? { + if (!shouldBlock(CrystalNucleusMessageTypes.CRYSTAL_COLLECTED)) return null + if (crystalCollectedWrapperPattern.matches(message)) { + unclosedCrystalCollected = !unclosedCrystalCollected + return NucleusChatFilterRes("crystal_collected") + } + + if (!unclosedCrystalCollected) return null + + crystalCollectedCountPattern.matchMatcher(message) { + crystalCount = group("count").toInt() + } + + crystalCollectedIdentifierPattern.matchMatcher(message) { + crystalCollected = group("crystal") + return NucleusChatFilterRes("", "§5§l✦ $crystalCollected §5found§d! §7(§a$crystalCount§7/§a5§7)") + } + + return NucleusChatFilterRes("crystal_collected") + } + + private fun blockCrystalPlaced(message: String): NucleusChatFilterRes? { + if (!inNucleus()) return null + if (!shouldBlock(CrystalNucleusMessageTypes.CRYSTAL_PLACED)) return null + + if (message == " §r§dKeep exploring the §r§5Crystal Hollows §r§dto find the rest!") return NucleusChatFilterRes("crystal_placed") + crystalPlacedPattern.matchMatcher(message) { + return NucleusChatFilterRes("", "§5§l✦ ${group("crystal")} §5placed§d!") + } + return null + } + + private fun blockRunCompleted(message: String): NucleusChatFilterRes? { + if (!inNucleus()) return null + if (!shouldBlock(CrystalNucleusMessageTypes.RUN_COMPLETED)) return null + + if (runCompletedWrapperPattern.matches(message)) { + unclosedRunCompleted = !unclosedRunCompleted + return NucleusChatFilterRes("run_completed") + } + + if (message == "§7Pick it up near the §r§5Nucleus Vault§r§7!") return NucleusChatFilterRes("", "§5Crystal Nucleus Run complete§d!") + if (!unclosedRunCompleted) return null + + return NucleusChatFilterRes("run_completed") + } + + private fun blockNonToolScavenge(message: String): NucleusChatFilterRes? { + if (!shouldBlock(CrystalNucleusMessageTypes.NON_TOOL_SCAVENGE)) return null + + scavengeLootPattern.matchMatcher(message) { + if (!group("loot").startsWith("§cScavenged")) return NucleusChatFilterRes("non_tool_scavenge") + } + + return null + } + + private fun blockNPC(message: String): NucleusChatFilterRes? { + if (!message.startsWith("§e[NPC]")) return null + + blockProfessorRobot(message)?.let { return it } + blockKingYolkar(message)?.let { return it } + blockKeepers(message)?.let { return it } + + return null + } + + private fun blockProfessorRobot(message: String): NucleusChatFilterRes? { + if (!shouldBlock(CrystalNucleusMessageTypes.NPC_PROF_ROBOT)) return null + if (!message.startsWith("§e[NPC] Professor Robot")) return null + + componentSubmittedPattern.matchMatcher(message) { + if (message.contains("brought me all")) { + return NucleusChatFilterRes("", "§e[NPC] Professor Robot§f: §rAll components submitted.") + } else { + return NucleusChatFilterRes( + "", + "§e[NPC] Professor Robot§f: ${group("component")} submitted. ${group("remaining")} components left.", + ) + } + } + + return NucleusChatFilterRes("npc_prof_robot") + } + + private fun blockKingYolkar(message: String): NucleusChatFilterRes? { + if (!shouldBlock(CrystalNucleusMessageTypes.NPC_KING_YOLKAR)) return null + if (!message.startsWith("§e[NPC] §6King Yolkar")) return null + + if (message.contains("*rumble* *rumble*")) { + return NucleusChatFilterRes("", "§e[NPC] §6King Yolkar§f: ...") + } + if (message.contains("Bring me back §a3 §9Goblin Egg")) { + return NucleusChatFilterRes("", "§e[NPC] §6King Yolkar§f: §rBring me §a3 §9Goblin Egg §rof any type.") + } + if (message.contains("These eggs will help me stomach my pain.")) { + return NucleusChatFilterRes("", "§e[NPC] §6King Yolkar§f: §2King's Scent§r applied.") + } + + return NucleusChatFilterRes("npc_king_yolkar") + } + + private fun blockKeepers(message: String): NucleusChatFilterRes? { + if (!shouldBlock(CrystalNucleusMessageTypes.NPC_DIVAN_KEEPERS)) return null + if (!message.startsWith("§e[NPC] §6Keeper of ")) return null + + if (message.contains("You found all of the items!")) { + return NucleusChatFilterRes("", "§e[NPC] §6Keeper of §k§6Gold§f: §rAll tools submitted.") + } + + return NucleusChatFilterRes("npc_divan_keeper") + } + + private fun shouldBlock(type: CrystalNucleusMessageTypes) = config.modifiedMessages.contains(type) + private fun inNucleus() = LorenzUtils.skyBlockArea == "Crystal Nucleus" + private fun isEnabled() = config.enabled && IslandType.CRYSTAL_HOLLOWS.isInIsland() } diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt index d2c68d9d6725..149cc9d3ee7b 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt @@ -5,7 +5,6 @@ import at.hannibal2.skyhanni.events.LorenzChatEvent import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.ItemUtils -import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher import at.hannibal2.skyhanni.utils.RegexUtils.matches diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt index a76348d8e4e3..4c8d9dd2d69d 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt @@ -8,6 +8,7 @@ import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.ChatUtils import at.hannibal2.skyhanni.utils.CollectionUtils.sortedDesc import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName import at.hannibal2.skyhanni.utils.NEUItems.getPrice import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat @@ -16,6 +17,15 @@ import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat object CrystalNucleusProfitPer { private val config get() = SkyHanniMod.feature.mining.crystalNucleusTracker + private val robotParts = listOf( + "CONTROL_SWITCH", + "ELECTRON_TRANSMITTER", + "FTX_3070", + "ROBOTRON_REFLECTOR", + "SUPERLITE_MOTOR", + "SYNTHETIC_HEART", + ) + @HandleEvent(priority = HIGH) fun onCrystalNucleusLoot(event: CrystalNucleusLootEvent) { if (!config.profitPer) return @@ -36,9 +46,19 @@ object CrystalNucleusProfitPer { } } - val hover = map.sortedDesc().filter{ it.value >= config.profitPerMinimum }.keys.toMutableList() - if(hover.size != map.size) hover.add("§7${map.size - hover.size} cheap items are hidden.") - val totalMessage = "Profit for Crystal Nucleus Run§e: §6${totalProfit.shortFormat()}" + val jungleKeyPrice = "JUNGLE_KEY".asInternalName().getPrice() + map["§9Used §5Jungle Key§7: §c-${jungleKeyPrice.shortFormat()}"] = -jungleKeyPrice + totalProfit -= jungleKeyPrice + + var robotPartsPrice = 0.0 + robotParts.forEach { robotPartsPrice += it.asInternalName().getPrice() } + map["§9Used §9Robot Parts§7: §c-${robotPartsPrice.shortFormat()}"] = -robotPartsPrice + totalProfit -= robotPartsPrice + + val hover = map.sortedDesc().filter { it.value >= config.profitPerMinimum || it.value < 0 }.keys.toMutableList() + if (hover.size != map.size) hover.add("§7${map.size - hover.size} cheap items are hidden.") + val profitPrefix = if (totalProfit < 0) "§c" else "§6" + val totalMessage = "Profit for Crystal Nucleus Run§e: $profitPrefix${totalProfit.shortFormat()}" hover.add("") hover.add("§e$totalMessage") ChatUtils.hoverableChat(totalMessage, hover) diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt index 36548b9dd432..7e3f87172a72 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -27,7 +27,8 @@ object CrystalNucleusTracker { private val tracker = SkyHanniItemTracker( "Crystal Nucleus Tracker", { Data() }, - { it.mining.crystalNucleusTracker }) { drawDisplay(it)} + { it.mining.crystalNucleusTracker }, + ) { drawDisplay(it) } class Data : ItemTrackerData() { override fun resetItems() { @@ -39,7 +40,7 @@ object CrystalNucleusTracker { val dropRate = LorenzUtils.formatPercentage(percentage.coerceAtMost(1.0)) return listOf( "§7Dropped §e${timesGained.addSeparators()} §7times.", - "§7Your drop rate: §c$dropRate." + "§7Your drop rate: §c$dropRate.", ) } @@ -77,8 +78,8 @@ object CrystalNucleusTracker { addAsSingletonList( Renderable.hoverTips( "§7Runs completed: §e${runsCompleted.addSeparators()}", - listOf("§7You completed §e${runsCompleted.addSeparators()} §7Crystal Nucleus Runs.") - ) + listOf("§7You completed §e${runsCompleted.addSeparators()} §7Crystal Nucleus Runs."), + ), ) addAsSingletonList(tracker.addTotalProfit(profit, data.runsCompleted, "run")) @@ -88,7 +89,7 @@ object CrystalNucleusTracker { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent) { if (!isEnabled()) return - if(config.hideInCf && ChocolateFactoryAPI.inChocolateFactory) return + if (config.hideInCf && ChocolateFactoryAPI.inChocolateFactory) return tracker.renderDisplay(config.position) } @@ -104,5 +105,6 @@ object CrystalNucleusTracker { tracker.resetCommand() } - fun isEnabled() = config.enabled && IslandType.CRYSTAL_HOLLOWS.isInIsland() && (config.showOutsideNucleus || LorenzUtils.skyBlockArea == "Crystal Nucleus") + fun isEnabled() = + config.enabled && IslandType.CRYSTAL_HOLLOWS.isInIsland() && (config.showOutsideNucleus || LorenzUtils.skyBlockArea == "Crystal Nucleus") } From 88d134c6ce4a12c6f15038865c35082753251407 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:35:56 -0400 Subject: [PATCH 08/16] Update end pattern and formatting --- .../features/mining/crystalhollows/CrystalNucleusAPI.kt | 4 ++-- .../features/mining/crystalhollows/CrystalNucleusProfitPer.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt index 149cc9d3ee7b..91b3a8101867 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt @@ -25,11 +25,11 @@ object CrystalNucleusAPI { ) /** - * REGEX-TEST: §7Pick it up near the §r§5Nucleus Vault§r§7! + * REGEX-TEST: §3§l▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ */ private val endPattern by patternGroup.pattern( "loot.end", - "§7Pick it up near the §r§5Nucleus Vault§r§7!.*", + "§3§l▬{64}", ) /** diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt index 4c8d9dd2d69d..9c6a420d296f 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt @@ -47,12 +47,12 @@ object CrystalNucleusProfitPer { } val jungleKeyPrice = "JUNGLE_KEY".asInternalName().getPrice() - map["§9Used §5Jungle Key§7: §c-${jungleKeyPrice.shortFormat()}"] = -jungleKeyPrice + map["§cUsed §5Jungle Key§7: §c-${jungleKeyPrice.shortFormat()}"] = -jungleKeyPrice totalProfit -= jungleKeyPrice var robotPartsPrice = 0.0 robotParts.forEach { robotPartsPrice += it.asInternalName().getPrice() } - map["§9Used §9Robot Parts§7: §c-${robotPartsPrice.shortFormat()}"] = -robotPartsPrice + map["§cUsed §9Robot Parts§7: §c-${robotPartsPrice.shortFormat()}"] = -robotPartsPrice totalProfit -= robotPartsPrice val hover = map.sortedDesc().filter { it.value >= config.profitPerMinimum || it.value < 0 }.keys.toMutableList() From 16d68dace6403acdc7fad3ae133c3452bfb6a90f Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:52:37 -0400 Subject: [PATCH 09/16] Add key and robot parts to tracker --- .../crystalhollows/CrystalNucleusProfitPer.kt | 2 +- .../crystalhollows/CrystalNucleusTracker.kt | 46 +++++++++++++++---- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt index 9c6a420d296f..81e624426281 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt @@ -17,7 +17,7 @@ import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat object CrystalNucleusProfitPer { private val config get() = SkyHanniMod.feature.mining.crystalNucleusTracker - private val robotParts = listOf( + val robotParts = listOf( "CONTROL_SWITCH", "ELECTRON_TRANSMITTER", "FTX_3070", diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt index 7e3f87172a72..3959b00ffe50 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -8,12 +8,16 @@ import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.IslandChangeEvent import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent import at.hannibal2.skyhanni.features.inventory.chocolatefactory.ChocolateFactoryAPI +import at.hannibal2.skyhanni.features.mining.crystalhollows.CrystalNucleusProfitPer.robotParts import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.CollectionUtils.addAsSingletonList import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.NEUInternalName +import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName +import at.hannibal2.skyhanni.utils.NEUItems.getPrice import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators +import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat import at.hannibal2.skyhanni.utils.renderables.Renderable import at.hannibal2.skyhanni.utils.tracker.ItemTrackerData import at.hannibal2.skyhanni.utils.tracker.SkyHanniItemTracker @@ -72,16 +76,42 @@ object CrystalNucleusTracker { private fun drawDisplay(data: Data): List> = buildList { addAsSingletonList("§e§lCrystal Nucleus Profit Tracker") - val profit = tracker.drawItems(data, { true }, this) + var profit = tracker.drawItems(data, { true }, this) val runsCompleted = data.runsCompleted - addAsSingletonList( - Renderable.hoverTips( - "§7Runs completed: §e${runsCompleted.addSeparators()}", - listOf("§7You completed §e${runsCompleted.addSeparators()} §7Crystal Nucleus Runs."), - ), - ) - addAsSingletonList(tracker.addTotalProfit(profit, data.runsCompleted, "run")) + + if (runsCompleted > 0) { + val jungleKeyCost = "JUNGLE_KEY".asInternalName().getPrice() * runsCompleted + profit -= jungleKeyCost + val jungleKeyCostFormat = jungleKeyCost.shortFormat() + addAsSingletonList( + Renderable.hoverTips( + " §c${runsCompleted}x §5Jungle Key§7: §c-$jungleKeyCostFormat", + listOf("§7You paid §c$jungleKeyCostFormat §7in total", "§7for §5 Jungle Keys§7.") + ) + ) + + var robotPartsCost = 0.0 + robotParts.forEach { robotPartsCost += it.asInternalName().getPrice() } + robotPartsCost *= runsCompleted + profit -= robotPartsCost + val robotPartsCostFormat = jungleKeyCost.shortFormat() + addAsSingletonList( + Renderable.hoverTips( + " §c${runsCompleted * 6}x §9Robot Parts§7: §c-$robotPartsCostFormat", + listOf("§7You lost §c$robotPartsCostFormat §7in total", "§7for §9Robot Parts§7.") + ) + ) + + addAsSingletonList( + Renderable.hoverTips( + "§7Runs completed: §e${runsCompleted.addSeparators()}", + listOf("§7You completed §e${runsCompleted.addSeparators()} §7Crystal Nucleus Runs."), + ), + ) + + addAsSingletonList(tracker.addTotalProfit(profit, data.runsCompleted, "run")) + } tracker.addPriceFromButton(this) } From a96ffa81b73fe47fadbb542136c6c17ee148f597 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:55:51 -0400 Subject: [PATCH 10/16] Formatting --- .../features/mining/crystalhollows/CrystalNucleusTracker.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt index 3959b00ffe50..3d18ce10f791 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -87,7 +87,7 @@ object CrystalNucleusTracker { addAsSingletonList( Renderable.hoverTips( " §c${runsCompleted}x §5Jungle Key§7: §c-$jungleKeyCostFormat", - listOf("§7You paid §c$jungleKeyCostFormat §7in total", "§7for §5 Jungle Keys§7.") + listOf("§7You lost §c$jungleKeyCostFormat §7of total profit", "due to §5Jungle Keys§7.") ) ) @@ -95,11 +95,11 @@ object CrystalNucleusTracker { robotParts.forEach { robotPartsCost += it.asInternalName().getPrice() } robotPartsCost *= runsCompleted profit -= robotPartsCost - val robotPartsCostFormat = jungleKeyCost.shortFormat() + val robotPartsCostFormat = robotPartsCost.shortFormat() addAsSingletonList( Renderable.hoverTips( " §c${runsCompleted * 6}x §9Robot Parts§7: §c-$robotPartsCostFormat", - listOf("§7You lost §c$robotPartsCostFormat §7in total", "§7for §9Robot Parts§7.") + listOf("§7You lost §c$robotPartsCostFormat §7of total profit", "due to §9Robot Parts§7.") ) ) From a79e4d6e7fdea884a643508245128646b94c18b1 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Fri, 2 Aug 2024 16:59:32 -0400 Subject: [PATCH 11/16] last formatting one --- .../features/mining/crystalhollows/CrystalNucleusTracker.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt index 3d18ce10f791..e06a15f9c0c8 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -87,7 +87,7 @@ object CrystalNucleusTracker { addAsSingletonList( Renderable.hoverTips( " §c${runsCompleted}x §5Jungle Key§7: §c-$jungleKeyCostFormat", - listOf("§7You lost §c$jungleKeyCostFormat §7of total profit", "due to §5Jungle Keys§7.") + listOf("§7You lost §c$jungleKeyCostFormat §7of total profit", "§7due to §5Jungle Keys§7.") ) ) @@ -99,7 +99,7 @@ object CrystalNucleusTracker { addAsSingletonList( Renderable.hoverTips( " §c${runsCompleted * 6}x §9Robot Parts§7: §c-$robotPartsCostFormat", - listOf("§7You lost §c$robotPartsCostFormat §7of total profit", "due to §9Robot Parts§7.") + listOf("§7You lost §c$robotPartsCostFormat §7of total profit", "§7due to §9Robot Parts§7.") ) ) From eab8c9de2361a24e860cb30d4066ddd7052cc8a5 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Sun, 4 Aug 2024 06:06:19 -0400 Subject: [PATCH 12/16] More formattin' --- .../features/mining/crystalhollows/CrystalNucleusTracker.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt index e06a15f9c0c8..36f4bf39d931 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -86,7 +86,7 @@ object CrystalNucleusTracker { val jungleKeyCostFormat = jungleKeyCost.shortFormat() addAsSingletonList( Renderable.hoverTips( - " §c${runsCompleted}x §5Jungle Key§7: §c-$jungleKeyCostFormat", + " §7${runsCompleted}x §5Jungle Key§7: §c-$jungleKeyCostFormat", listOf("§7You lost §c$jungleKeyCostFormat §7of total profit", "§7due to §5Jungle Keys§7.") ) ) @@ -98,7 +98,7 @@ object CrystalNucleusTracker { val robotPartsCostFormat = robotPartsCost.shortFormat() addAsSingletonList( Renderable.hoverTips( - " §c${runsCompleted * 6}x §9Robot Parts§7: §c-$robotPartsCostFormat", + " §7${runsCompleted * 6}x §9Robot Parts§7: §c-$robotPartsCostFormat", listOf("§7You lost §c$robotPartsCostFormat §7of total profit", "§7due to §9Robot Parts§7.") ) ) From 286ca364699ce8c9e18bb3090d2ece8bc1761d23 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Mon, 9 Sep 2024 09:33:37 -0400 Subject: [PATCH 13/16] Update tracker to use Searchables, new syntaxes --- .../crystalhollows/CrystalNucleusTracker.kt | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt index 36f4bf39d931..14330a1160a7 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -10,15 +10,17 @@ import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent import at.hannibal2.skyhanni.features.inventory.chocolatefactory.ChocolateFactoryAPI import at.hannibal2.skyhanni.features.mining.crystalhollows.CrystalNucleusProfitPer.robotParts import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule -import at.hannibal2.skyhanni.utils.CollectionUtils.addAsSingletonList +import at.hannibal2.skyhanni.utils.CollectionUtils.addSearchString +import at.hannibal2.skyhanni.utils.ItemPriceUtils.getPrice import at.hannibal2.skyhanni.utils.LorenzUtils import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland import at.hannibal2.skyhanni.utils.NEUInternalName import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName -import at.hannibal2.skyhanni.utils.NEUItems.getPrice import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat import at.hannibal2.skyhanni.utils.renderables.Renderable +import at.hannibal2.skyhanni.utils.renderables.Searchable +import at.hannibal2.skyhanni.utils.renderables.toSearchable import at.hannibal2.skyhanni.utils.tracker.ItemTrackerData import at.hannibal2.skyhanni.utils.tracker.SkyHanniItemTracker import com.google.gson.annotations.Expose @@ -63,7 +65,7 @@ object CrystalNucleusTracker { // Gemstone and Mithril Powder if (itemName.contains(" Powder")) continue NEUInternalName.fromItemNameOrNull(itemName)?.let { - tracker.addItem(it, amount) + tracker.addItem(it, amount, false) } } } @@ -74,8 +76,8 @@ object CrystalNucleusTracker { } } - private fun drawDisplay(data: Data): List> = buildList { - addAsSingletonList("§e§lCrystal Nucleus Profit Tracker") + private fun drawDisplay(data: Data): List = buildList { + addSearchString("§e§lCrystal Nucleus Profit Tracker") var profit = tracker.drawItems(data, { true }, this) val runsCompleted = data.runsCompleted @@ -84,11 +86,11 @@ object CrystalNucleusTracker { val jungleKeyCost = "JUNGLE_KEY".asInternalName().getPrice() * runsCompleted profit -= jungleKeyCost val jungleKeyCostFormat = jungleKeyCost.shortFormat() - addAsSingletonList( + add( Renderable.hoverTips( " §7${runsCompleted}x §5Jungle Key§7: §c-$jungleKeyCostFormat", - listOf("§7You lost §c$jungleKeyCostFormat §7of total profit", "§7due to §5Jungle Keys§7.") - ) + listOf("§7You lost §c$jungleKeyCostFormat §7of total profit", "§7due to §5Jungle Keys§7."), + ).toSearchable(), ) var robotPartsCost = 0.0 @@ -96,21 +98,21 @@ object CrystalNucleusTracker { robotPartsCost *= runsCompleted profit -= robotPartsCost val robotPartsCostFormat = robotPartsCost.shortFormat() - addAsSingletonList( + add( Renderable.hoverTips( " §7${runsCompleted * 6}x §9Robot Parts§7: §c-$robotPartsCostFormat", - listOf("§7You lost §c$robotPartsCostFormat §7of total profit", "§7due to §9Robot Parts§7.") - ) + listOf("§7You lost §c$robotPartsCostFormat §7of total profit", "§7due to §9Robot Parts§7."), + ).toSearchable(), ) - addAsSingletonList( + add( Renderable.hoverTips( "§7Runs completed: §e${runsCompleted.addSeparators()}", listOf("§7You completed §e${runsCompleted.addSeparators()} §7Crystal Nucleus Runs."), - ), + ).toSearchable(), ) - addAsSingletonList(tracker.addTotalProfit(profit, data.runsCompleted, "run")) + add(tracker.addTotalProfit(profit, data.runsCompleted, "run")) } tracker.addPriceFromButton(this) From 800905d4b23968ad24d345161c4cb780c1a4ab04 Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Fri, 13 Sep 2024 14:54:30 -0400 Subject: [PATCH 14/16] I'm not even sure how that one happened --- src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt index 02f5777141b1..d3b9dcee2a76 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/commands/Commands.kt @@ -62,7 +62,6 @@ import at.hannibal2.skyhanni.features.mining.MineshaftPityDisplay import at.hannibal2.skyhanni.features.mining.crystalhollows.CrystalNucleusTracker import at.hannibal2.skyhanni.features.mining.glacitemineshaft.CorpseTracker import at.hannibal2.skyhanni.features.mining.fossilexcavator.ExcavatorProfitTracker -import at.hannibal2.skyhanni.features.mining.glacitemineshaft.CorpseTracker import at.hannibal2.skyhanni.features.mining.powdertracker.PowderTracker import at.hannibal2.skyhanni.features.minion.MinionFeatures import at.hannibal2.skyhanni.features.misc.CollectionTracker From f472ed4a922c82ae52c9c125beb157c84b1d31fa Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Mon, 30 Sep 2024 09:03:20 -0400 Subject: [PATCH 15/16] Address TODO --- .../java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt | 2 +- .../skyhanni/config/features/chat/PowderMiningConfig.java | 3 +-- .../java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt | 2 ++ .../hannibal2/skyhanni/features/chat/PowderMiningChatFilter.kt | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt b/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt index aa15461f5af2..7c41245fc7f8 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt +++ b/src/main/java/at/hannibal2/skyhanni/config/ConfigUpdaterMigrator.kt @@ -12,7 +12,7 @@ import com.google.gson.JsonPrimitive object ConfigUpdaterMigrator { val logger = LorenzLogger("ConfigMigration") - const val CONFIG_VERSION = 60 + const val CONFIG_VERSION = 61 fun JsonElement.at(chain: List, init: Boolean): JsonElement? { if (chain.isEmpty()) return this if (this !is JsonObject) return null diff --git a/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningConfig.java b/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningConfig.java index c34c174f863e..b2dc68039981 100644 --- a/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningConfig.java +++ b/src/main/java/at/hannibal2/skyhanni/config/features/chat/PowderMiningConfig.java @@ -111,7 +111,6 @@ public String toString() { @Expose @ConfigOption(name = "Gemstones", desc = "") @Accordion - // todo: remove config - public PowderMiningGemstoneConfig gemstoneFilterConfig = new PowderMiningGemstoneConfig(); + public PowderMiningGemstoneConfig gemstone = new PowderMiningGemstoneConfig(); } diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt index cba0e14f6df7..3a412c981d13 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/ChatFilter.kt @@ -656,5 +656,7 @@ object ChatFilter { } } } + event.move(61, "chat.filterType.powderMiningFilter", "chat.filterType.powderMining") + event.move(61, "chat.filterType.gemstoneFilterConfig", "chat.filterType.powderMining.gemstone") } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/chat/PowderMiningChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/features/chat/PowderMiningChatFilter.kt index 265fe754c3af..adbfc67942a3 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/chat/PowderMiningChatFilter.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/chat/PowderMiningChatFilter.kt @@ -29,7 +29,7 @@ import java.util.regex.Pattern object PowderMiningChatFilter { private val config get() = SkyHanniMod.feature.chat.filterType.powderMining - private val gemstoneConfig get() = config.gemstoneFilterConfig + private val gemstoneConfig get() = config.gemstone val patternGroup = RepoPattern.group("filter.powdermining") From fdfec9868a1e5b2549ca7be3e0b5e3b17ff1af0b Mon Sep 17 00:00:00 2001 From: David Cole <40234707+DavidArthurCole@users.noreply.github.com> Date: Wed, 16 Oct 2024 09:37:22 -0400 Subject: [PATCH 16/16] Fixes & improvements --- .../events/mining/CrystalNucleusLootEvent.kt | 2 +- .../crystalhollows/CrystalNucleusAPI.kt | 45 +++++-------------- .../crystalhollows/CrystalNucleusProfitPer.kt | 31 +++++++------ .../crystalhollows/CrystalNucleusTracker.kt | 26 ++++++----- 4 files changed, 45 insertions(+), 59 deletions(-) diff --git a/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt b/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt index a431471c4471..98a97e2ea964 100644 --- a/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt +++ b/src/main/java/at/hannibal2/skyhanni/events/mining/CrystalNucleusLootEvent.kt @@ -1,4 +1,4 @@ -package at.hannibal2.skyhanni.events.mining; +package at.hannibal2.skyhanni.events.mining import at.hannibal2.skyhanni.api.event.SkyHanniEvent diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt index 91b3a8101867..262889300ba6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusAPI.kt @@ -6,7 +6,6 @@ import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.ItemUtils import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland -import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher import at.hannibal2.skyhanni.utils.RegexUtils.matches import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern import net.minecraftforge.fml.common.eventhandler.SubscribeEvent @@ -32,30 +31,6 @@ object CrystalNucleusAPI { "§3§l▬{64}", ) - /** - * REGEX-TEST: §r§2Jade Dye §r§8x4 - * REGEX-TEST: §r§5Divan Fragment §r§8x2 - * REGEX-TEST: §r§5Pickonimbus 2000 - * REGEX-TEST: §r§9⸕ Fine Amber Gemstone - * REGEX-TEST: §r§9❈ Fine Amethyst Gemstone - * REGEX-TEST: §r§9☘ Fine Jade Gemstone - * REGEX-TEST: §r§9❁ Fine Jasper Gemstone - * REGEX-TEST: §r§9❤ Fine Ruby Gemstone - * REGEX-TEST: §r§9✎ Fine Sapphire Gemstone - * REGEX-TEST: §r§9✧ Fine Topaz Gemstone - * REGEX-TEST: §r§9Jaderald - * REGEX-TEST: §r§a⸕ Flawed Amber Gemstone §r§8x12 - * REGEX-TEST: §r§a❈ Flawed Amethyst Gemstone §r§8x48 - * REGEX-TEST: §r§a☘ Flawed Jade Gemstone §r§8x12 - * REGEX-TEST: §r§a❁ Flawed Jasper Gemstone §r§8x6 - * REGEX-TEST: §r§a❤ Flawed Ruby Gemstone §r§8x36 - * REGEX-TEST: §r§a✎ Flawed Sapphire Gemstone §r§8x6 - * REGEX-TEST: §r§a✧ Flawed Topaz Gemstone §r§8x6 - * REGEX-TEST: §r§fPrehistoric Egg - * REGEX-TEST: §r§dGemstone Powder §r§8x4,178 - */ - private val itemPattern by patternGroup.pattern("loot.item", "§r(?.+)") - private var inLoot = false private val loot = mutableListOf>() @@ -81,15 +56,17 @@ object CrystalNucleusAPI { // All loot rewards start with 4 spaces. // To simplify regex statements, this check is done outside the main logic. // This also nerfs the "§r§a§lREWARDS" message. - val ssMessage = message.takeIf { it.startsWith(" ") }?.substring(4) ?: return - - var pair = itemPattern.matchMatcher(ssMessage) { - ItemUtils.readItemAmount(group("item")) - } ?: return - // Assume enchanted books are Fortune IV books - if (pair.first.let { it == "§fEnchanted" || it == "§fEnchanted Book" }) { - pair = "§9Fortune IV" to pair.second + message.takeIf { it.startsWith(" ") }?.substring(4)?.let { lootMessage -> + ItemUtils.readItemAmount(lootMessage)?.let { pair -> + loot.add( + when(pair.first) { + // Assume enchanted books are Fortune IV books + "§fEnchanted" -> "§9Fortune IV" to pair.second + "§fEnchanted Book" -> "§9Fortune IV" to pair.second + else -> pair + } + ) + } } - loot.add(pair) } } diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt index 81e624426281..cfdbbc9727c6 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusProfitPer.kt @@ -7,9 +7,9 @@ import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.ChatUtils import at.hannibal2.skyhanni.utils.CollectionUtils.sortedDesc +import at.hannibal2.skyhanni.utils.ItemPriceUtils.getPrice import at.hannibal2.skyhanni.utils.NEUInternalName import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName -import at.hannibal2.skyhanni.utils.NEUItems.getPrice import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat @@ -17,14 +17,15 @@ import at.hannibal2.skyhanni.utils.NumberUtil.shortFormat object CrystalNucleusProfitPer { private val config get() = SkyHanniMod.feature.mining.crystalNucleusTracker - val robotParts = listOf( + val jungleKeyItem = "JUNGLE_KEY".asInternalName() + val robotPartItems = listOf( "CONTROL_SWITCH", "ELECTRON_TRANSMITTER", "FTX_3070", "ROBOTRON_REFLECTOR", "SUPERLITE_MOTOR", "SYNTHETIC_HEART", - ) + ).map { it.asInternalName()} @HandleEvent(priority = HIGH) fun onCrystalNucleusLoot(event: CrystalNucleusLootEvent) { @@ -37,27 +38,31 @@ object CrystalNucleusProfitPer { // Gemstone and Mithril Powder if (name.contains(" Powder")) continue NEUInternalName.fromItemNameOrNull(name)?.let { - val pricePer = it.getPrice() - if (pricePer == -1.0) continue - val profit = amount * pricePer - val text = "§eFound $name §8${amount.addSeparators()}x §7(§6${profit.shortFormat()}§7)" - map[text] = profit - totalProfit += profit + it.getPrice().takeIf { price -> price != -1.0 }?.let { pricePer -> + val profit = amount * pricePer + val text = "§eFound $name §8${amount.addSeparators()}x §7(§6${profit.shortFormat()}§7)" + map[text] = profit + totalProfit += profit + } } } - val jungleKeyPrice = "JUNGLE_KEY".asInternalName().getPrice() + val jungleKeyPrice = jungleKeyItem.getPrice() map["§cUsed §5Jungle Key§7: §c-${jungleKeyPrice.shortFormat()}"] = -jungleKeyPrice totalProfit -= jungleKeyPrice var robotPartsPrice = 0.0 - robotParts.forEach { robotPartsPrice += it.asInternalName().getPrice() } + robotPartItems.forEach { robotPartsPrice += it.getPrice() } map["§cUsed §9Robot Parts§7: §c-${robotPartsPrice.shortFormat()}"] = -robotPartsPrice totalProfit -= robotPartsPrice - val hover = map.sortedDesc().filter { it.value >= config.profitPerMinimum || it.value < 0 }.keys.toMutableList() + val hover = map.sortedDesc().filter { + it.value >= config.profitPerMinimum || it.value < 0 + }.keys.toMutableList() if (hover.size != map.size) hover.add("§7${map.size - hover.size} cheap items are hidden.") - val profitPrefix = if (totalProfit < 0) "§c" else "§6" + val profitPrefix = + if (totalProfit < 0) "§c" + else "§6" val totalMessage = "Profit for Crystal Nucleus Run§e: $profitPrefix${totalProfit.shortFormat()}" hover.add("") hover.add("§e$totalMessage") diff --git a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt index 14330a1160a7..d7cd4e18f762 100644 --- a/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt +++ b/src/main/java/at/hannibal2/skyhanni/features/mining/crystalhollows/CrystalNucleusTracker.kt @@ -8,7 +8,8 @@ import at.hannibal2.skyhanni.events.GuiRenderEvent import at.hannibal2.skyhanni.events.IslandChangeEvent import at.hannibal2.skyhanni.events.mining.CrystalNucleusLootEvent import at.hannibal2.skyhanni.features.inventory.chocolatefactory.ChocolateFactoryAPI -import at.hannibal2.skyhanni.features.mining.crystalhollows.CrystalNucleusProfitPer.robotParts +import at.hannibal2.skyhanni.features.mining.crystalhollows.CrystalNucleusProfitPer.jungleKeyItem +import at.hannibal2.skyhanni.features.mining.crystalhollows.CrystalNucleusProfitPer.robotPartItems import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule import at.hannibal2.skyhanni.utils.CollectionUtils.addSearchString import at.hannibal2.skyhanni.utils.ItemPriceUtils.getPrice @@ -83,25 +84,29 @@ object CrystalNucleusTracker { val runsCompleted = data.runsCompleted if (runsCompleted > 0) { - val jungleKeyCost = "JUNGLE_KEY".asInternalName().getPrice() * runsCompleted + val jungleKeyCost = jungleKeyItem.getPrice() * runsCompleted profit -= jungleKeyCost val jungleKeyCostFormat = jungleKeyCost.shortFormat() add( Renderable.hoverTips( " §7${runsCompleted}x §5Jungle Key§7: §c-$jungleKeyCostFormat", - listOf("§7You lost §c$jungleKeyCostFormat §7of total profit", "§7due to §5Jungle Keys§7."), + listOf( + "§7You lost §c$jungleKeyCostFormat §7of total profit", + "§7due to §5Jungle Keys§7." + ), ).toSearchable(), ) - var robotPartsCost = 0.0 - robotParts.forEach { robotPartsCost += it.asInternalName().getPrice() } - robotPartsCost *= runsCompleted + val robotPartsCost = robotPartItems.sumOf { it.getPrice() } * runsCompleted profit -= robotPartsCost val robotPartsCostFormat = robotPartsCost.shortFormat() add( Renderable.hoverTips( " §7${runsCompleted * 6}x §9Robot Parts§7: §c-$robotPartsCostFormat", - listOf("§7You lost §c$robotPartsCostFormat §7of total profit", "§7due to §9Robot Parts§7."), + listOf( + "§7You lost §c$robotPartsCostFormat §7of total profit", + "§7due to §9Robot Parts§7." + ), ).toSearchable(), ) @@ -121,8 +126,6 @@ object CrystalNucleusTracker { @SubscribeEvent fun onRenderOverlay(event: GuiRenderEvent) { if (!isEnabled()) return - if (config.hideInCf && ChocolateFactoryAPI.inChocolateFactory) return - tracker.renderDisplay(config.position) } @@ -137,6 +140,7 @@ object CrystalNucleusTracker { tracker.resetCommand() } - fun isEnabled() = - config.enabled && IslandType.CRYSTAL_HOLLOWS.isInIsland() && (config.showOutsideNucleus || LorenzUtils.skyBlockArea == "Crystal Nucleus") + private fun isCfEnabled() = !config.hideInCf || !ChocolateFactoryAPI.inChocolateFactory + private fun isNucEnabled() = config.showOutsideNucleus || LorenzUtils.skyBlockArea == "Crystal Nucleus" + private fun isEnabled() = config.enabled && IslandType.CRYSTAL_HOLLOWS.isInIsland() && isNucEnabled() && isCfEnabled() }