From cbace3933d4ec3b74b45bbfbb1f8d00a7964fdeb Mon Sep 17 00:00:00 2001 From: TurtleOnFire2 Date: Tue, 18 Aug 2026 02:07:25 +0200 Subject: [PATCH 01/11] fix vesuvius not working at all --- .../com/odtheking/odin/features/impl/nether/Vesuvius.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt index 7e4053862..73ab12e60 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt @@ -13,6 +13,7 @@ import net.minecraft.client.gui.GuiGraphicsExtractor import net.minecraft.network.chat.Component import net.minecraft.network.chat.Style import net.minecraft.network.chat.TextColor +import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket import net.minecraft.world.item.ItemStack @@ -36,7 +37,7 @@ object Vesuvius : Module( private val shardRegex = Regex("^([A-Za-z' ]+) Shard(?: x(\\d+))?$") private val teethRegex = Regex("^Kuudra Teeth x(\\d+)$") private val pearlRegex = Regex("^Heavy Pearl x(\\d+)$") - private val chestRegex = Regex("^((Free|Paid) Chest Chest)|(Kuudra - .+)|Vesuvius$") + private val chestRegex = Regex("^((Free|Paid) Chest Chest)|(Kuudra - .+)|.*Vesuvius|.*Croesus$") private val uselessLinesRegex = Regex("^Contents|Cost|Click to open!|FREE|Already opened!|Can't open another chest!|Paid Chest|") private val salvageItemsRegex = Regex("^Boots|Chestplate|Helmet|Cloak|Aurora Staff|Hollow Wand") @@ -67,13 +68,14 @@ object Vesuvius : Module( } on { - if (screen.title.string.equalsOneOf("Vesuvius", "Croesus") && slot.item.hoverName.string == "Kuudra's Hollow") { + if (screen.title.string.containsOneOf("Vesuvius", "Croesus") && slot.item.hoverName.string == "Kuudra's Hollow") { if (hideClaimed && slot.item.loreString.any { it == "No more chests to open!"}) cancel() } } + //Sometimes this gets sent before the screen title gets sent and the regex wouldn't work if you have more than 1 page onReceive { - val title = mc.screen?.title?.string ?:return@onReceive + val title = mc.screen?.title?.string ?: return@onReceive if (!title.matches(chestRegex)) return@onReceive if (slot == 31 && item.item == Items.CHEST) handleKuudraChest(item) if (slot == 14 && item.item == Items.PLAYER_HEAD) handleKuudraChest(item) From 0346b771934bf87cd6f63acbc9f941bb580286a1 Mon Sep 17 00:00:00 2001 From: TurtleOnFire2 Date: Wed, 19 Aug 2026 00:01:43 +0200 Subject: [PATCH 02/11] vitality rework compat --- .../odin/features/impl/nether/Vesuvius.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt index 73ab12e60..1e2429ecf 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt @@ -37,7 +37,8 @@ object Vesuvius : Module( private val shardRegex = Regex("^([A-Za-z' ]+) Shard(?: x(\\d+))?$") private val teethRegex = Regex("^Kuudra Teeth x(\\d+)$") private val pearlRegex = Regex("^Heavy Pearl x(\\d+)$") - private val chestRegex = Regex("^((Free|Paid) Chest Chest)|(Kuudra - .+)|.*Vesuvius|.*Croesus$") + private val chestRegex = Regex("^((Free|Paid) Chest)|(Kuudra - .+)|.*Vesuvius|.*Croesus$") + private val hudRegex = Regex("^((Free|Paid) Chest)|(Kuudra - .+)$") private val uselessLinesRegex = Regex("^Contents|Cost|Click to open!|FREE|Already opened!|Can't open another chest!|Paid Chest|") private val salvageItemsRegex = Regex("^Boots|Chestplate|Helmet|Cloak|Aurora Staff|Hollow Wand") @@ -54,7 +55,7 @@ object Vesuvius : Module( init { on { val title = screen.title.string - if (vesuviusHud.enabled && title.matches(chestRegex) && currentChest != null && title != "Vesuvius") { + if (vesuviusHud.enabled && title.matches(hudRegex) && currentChest != null) { guiGraphics.pose().pushMatrix() val sf = mc.window.guiScale guiGraphics.pose().scale(1f / sf, 1f / sf) @@ -110,6 +111,8 @@ object Vesuvius : Module( previewEnchantedBookRegex.find(item)?.destructured?.let { (name, level) -> val ult = if (name in ultimateEnchants) "ULTIMATE_" else "" + + enchantReplacements[name]?.let { itemId -> return cachedPrices["$itemId-${romanToInt(level)}"] } return cachedPrices["ENCHANTED_BOOK-$ult${name.uppercase().replace(" ", "_")}-${romanToInt(level)}"] } @@ -219,6 +222,13 @@ object Vesuvius : Module( "Aurora Staff" to "RUNIC_STAFF", ) + private val enchantReplacements = mapOf( + "Vivacious Vitality" to "ENCHANTED_BOOK-FEROCIOUS_MANA", + "Hardened Vitality" to "ENCHANTED_BOOK-HARDENED_MANA", + "Strong Vitality" to "ENCHANTED_BOOK-STRONG_MANA", + "Vampiric Vitality" to "ENCHANTED_BOOK-MANA_VAMPIRE", + ) + private val starCountToEssence = mapOf( 0 to 120.0, 1 to 138.0, From 578d88fa85a4a5ee805340db8e6a13ceadf50cde Mon Sep 17 00:00:00 2001 From: TurtleOnFire2 Date: Mon, 24 Aug 2026 19:28:20 +0200 Subject: [PATCH 03/11] Add lava leech and kuudra pet bonus to profit calculation --- .../odtheking/odin/features/impl/nether/Vesuvius.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt index 1e2429ecf..8ceb3ec04 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt @@ -1,6 +1,7 @@ package com.odtheking.odin.features.impl.nether import com.odtheking.odin.clickgui.settings.impl.BooleanSetting +import com.odtheking.odin.clickgui.settings.impl.NumberSetting import com.odtheking.odin.events.GuiEvent import com.odtheking.odin.events.core.on import com.odtheking.odin.events.core.onReceive @@ -27,6 +28,9 @@ object Vesuvius : Module( private val hideClaimed by BooleanSetting("Hide Claimed", true, desc = "Hides chests that have already been claimed.") private val useSalvagePrices by BooleanSetting("Use Salvaged", false, desc = "Uses the essence you would get by salvaging the piece instead.") + private val kuudraPetBonus by NumberSetting("Kuudra Pet Bonus", 0.0, 0.0, 20.0, 0.05, "The essence bonus from Kuudra pet.", unit = "%") + private val lavaLeechBonus by NumberSetting("Lava Leech Bonus", 0.0, 0.0, 13.0, 0.05, "The essence bonus from the Lava Leech Shard.", unit = "%") + private val vesuviusHud by HUD("Croesus Chest HUD", "Displays all chest contents with prices, sorted by profit.") { if (!it) return@HUD 0 to 0 drawOverlay(true) @@ -92,6 +96,8 @@ object Vesuvius : Module( var starCount = 0 val salvage = salvageItemsRegex.containsMatchIn(component.string) + val essenceBonus = (1 + kuudraPetBonus / 100.0) * (1 + lavaLeechBonus / 100.0) + component.visit({ style, str -> val count = str.count { it == '✪' } if (count > 0) { @@ -106,7 +112,7 @@ object Vesuvius : Module( val item = component.string.replace("✪", "").trim() if (item.contains("Molten") && useSalvagePrices) { - return (cachedPrices["ESSENCE_CRIMSON"] ?: 0.0) * 600.0 + return (cachedPrices["ESSENCE_CRIMSON"] ?: 0.0) * 600.0 * essenceBonus } previewEnchantedBookRegex.find(item)?.destructured?.let { (name, level) -> @@ -118,7 +124,7 @@ object Vesuvius : Module( previewEssenceRegex.find(item)?.destructured?.let { (name, quantity) -> val price = cachedPrices["ESSENCE_${name.uppercase()}"] ?: return null - return price * quantity.toDouble() + return price * quantity.toDouble() * essenceBonus } shardRegex.find(item)?.let { shard -> From 5ca4d0127f5c3b8c7b36334af5282fd753435738 Mon Sep 17 00:00:00 2001 From: TurtleOnFire2 Date: Mon, 24 Aug 2026 20:27:47 +0200 Subject: [PATCH 04/11] better detection --- .../odtheking/odin/features/impl/nether/Vesuvius.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt index 8ceb3ec04..e538f7476 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt @@ -9,6 +9,8 @@ import com.odtheking.odin.features.Module import com.odtheking.odin.features.impl.dungeon.Croesus.cachedPrices import com.odtheking.odin.utils.* import com.odtheking.odin.utils.render.text +import com.odtheking.odin.utils.skyblock.Island +import com.odtheking.odin.utils.skyblock.LocationUtils import net.minecraft.ChatFormatting import net.minecraft.client.gui.GuiGraphicsExtractor import net.minecraft.network.chat.Component @@ -78,12 +80,10 @@ object Vesuvius : Module( } } - //Sometimes this gets sent before the screen title gets sent and the regex wouldn't work if you have more than 1 page onReceive { - val title = mc.screen?.title?.string ?: return@onReceive - if (!title.matches(chestRegex)) return@onReceive + if (!LocationUtils.currentArea.equalsOneOf(Island.CrimsonIsle, Island.DungeonHub)) return@onReceive if (slot == 31 && item.item == Items.CHEST) handleKuudraChest(item) - if (slot == 14 && item.item == Items.PLAYER_HEAD) handleKuudraChest(item) + if (slot.equalsOneOf(13, 14) && item.item == Items.PLAYER_HEAD) handleKuudraChest(item) } onReceive { @@ -164,6 +164,8 @@ object Vesuvius : Module( } private fun handleKuudraChest(item: ItemStack) { + if (!item.hoverName.string.equalsOneOf("Paid Chest", "Open Reward Chest", "Free Chest")) return + val chestItems = mutableListOf() var profit = 0.0 var chestCost = 0.0 From aab6c248c6df9097f67f563ea35f6f41e51a5fbd Mon Sep 17 00:00:00 2001 From: TurtleOnFire2 Date: Mon, 24 Aug 2026 21:21:46 +0200 Subject: [PATCH 05/11] should finally be done :sob: --- .../odin/features/impl/nether/Vesuvius.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt index e538f7476..9c6bfcd34 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt @@ -43,8 +43,7 @@ object Vesuvius : Module( private val shardRegex = Regex("^([A-Za-z' ]+) Shard(?: x(\\d+))?$") private val teethRegex = Regex("^Kuudra Teeth x(\\d+)$") private val pearlRegex = Regex("^Heavy Pearl x(\\d+)$") - private val chestRegex = Regex("^((Free|Paid) Chest)|(Kuudra - .+)|.*Vesuvius|.*Croesus$") - private val hudRegex = Regex("^((Free|Paid) Chest)|(Kuudra - .+)$") + private val chestRegex = Regex("^((Free|Paid) Chest)|(Kuudra - .+)$") private val uselessLinesRegex = Regex("^Contents|Cost|Click to open!|FREE|Already opened!|Can't open another chest!|Paid Chest|") private val salvageItemsRegex = Regex("^Boots|Chestplate|Helmet|Cloak|Aurora Staff|Hollow Wand") @@ -61,7 +60,7 @@ object Vesuvius : Module( init { on { val title = screen.title.string - if (vesuviusHud.enabled && title.matches(hudRegex) && currentChest != null) { + if (vesuviusHud.enabled && title.matches(chestRegex) && currentChest != null) { guiGraphics.pose().pushMatrix() val sf = mc.window.guiScale guiGraphics.pose().scale(1f / sf, 1f / sf) @@ -80,10 +79,13 @@ object Vesuvius : Module( } } - onReceive { - if (!LocationUtils.currentArea.equalsOneOf(Island.CrimsonIsle, Island.DungeonHub)) return@onReceive - if (slot == 31 && item.item == Items.CHEST) handleKuudraChest(item) - if (slot.equalsOneOf(13, 14) && item.item == Items.PLAYER_HEAD) handleKuudraChest(item) + on { + if (!screen.title.string.matches(chestRegex)) return@on + + val item = packet.item + + if (packet.slot == 31 && item.item == Items.CHEST) handleKuudraChest(item) + if (packet.slot.equalsOneOf(13, 14) && item.item == Items.PLAYER_HEAD) handleKuudraChest(item) } onReceive { @@ -164,8 +166,6 @@ object Vesuvius : Module( } private fun handleKuudraChest(item: ItemStack) { - if (!item.hoverName.string.equalsOneOf("Paid Chest", "Open Reward Chest", "Free Chest")) return - val chestItems = mutableListOf() var profit = 0.0 var chestCost = 0.0 From 260ab4569f4d1e0e3bed58c940cee2366f2de626 Mon Sep 17 00:00:00 2001 From: TurtleOnFire2 Date: Mon, 24 Aug 2026 21:22:00 +0200 Subject: [PATCH 06/11] should finally be done :sob: --- .../com/odtheking/odin/features/impl/nether/Vesuvius.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt index 9c6bfcd34..cecd313b3 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt @@ -9,15 +9,11 @@ import com.odtheking.odin.features.Module import com.odtheking.odin.features.impl.dungeon.Croesus.cachedPrices import com.odtheking.odin.utils.* import com.odtheking.odin.utils.render.text -import com.odtheking.odin.utils.skyblock.Island -import com.odtheking.odin.utils.skyblock.LocationUtils import net.minecraft.ChatFormatting import net.minecraft.client.gui.GuiGraphicsExtractor import net.minecraft.network.chat.Component import net.minecraft.network.chat.Style import net.minecraft.network.chat.TextColor -import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket -import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket import net.minecraft.network.protocol.game.ClientboundOpenScreenPacket import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items From 34bf4226c8f9686b42f106b0fadbd93bd741a29f Mon Sep 17 00:00:00 2001 From: TurtleOnFire2 Date: Thu, 27 Aug 2026 17:43:07 +0200 Subject: [PATCH 07/11] profit tracker for kuudra --- .../odtheking/odin/features/ModuleManager.kt | 1 + .../features/impl/nether/KuudraTracker.kt | 287 ++++++++++++++++++ .../odin/features/impl/nether/Vesuvius.kt | 23 +- 3 files changed, 301 insertions(+), 10 deletions(-) create mode 100644 src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt diff --git a/src/main/kotlin/com/odtheking/odin/features/ModuleManager.kt b/src/main/kotlin/com/odtheking/odin/features/ModuleManager.kt index ac7baac0f..cf6b4061c 100644 --- a/src/main/kotlin/com/odtheking/odin/features/ModuleManager.kt +++ b/src/main/kotlin/com/odtheking/odin/features/ModuleManager.kt @@ -77,6 +77,7 @@ object ModuleManager { // nether SupplyHelper, BuildHelper, RemovePerks, NoPre, PearlWaypoints, FreshTools, KuudraInfo, Misc, Vesuvius, + KuudraTracker, RenderTest, ) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt new file mode 100644 index 000000000..8516bfdf2 --- /dev/null +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt @@ -0,0 +1,287 @@ +package com.odtheking.odin.features.impl.nether + +import com.google.gson.Gson +import com.google.gson.JsonArray +import com.google.gson.JsonElement +import com.google.gson.JsonObject +import com.mojang.serialization.JsonOps +import com.odtheking.odin.clickgui.settings.Saving +import com.odtheking.odin.clickgui.settings.Setting +import com.odtheking.odin.clickgui.settings.impl.ListSetting +import com.odtheking.odin.clickgui.settings.impl.NumberSetting +import com.odtheking.odin.events.ChatPacketEvent +import com.odtheking.odin.events.GuiEvent +import com.odtheking.odin.events.core.on +import com.odtheking.odin.events.core.onSend +import com.odtheking.odin.features.Module +import com.odtheking.odin.features.ModuleManager +import com.odtheking.odin.features.impl.nether.Vesuvius.getPriceOfKey +import com.odtheking.odin.features.impl.nether.Vesuvius.keys +import com.odtheking.odin.utils.Colors +import com.odtheking.odin.utils.equalsOneOf +import com.odtheking.odin.utils.lore +import com.odtheking.odin.utils.render.text +import net.minecraft.ChatFormatting +import net.minecraft.client.gui.GuiGraphicsExtractor +import net.minecraft.network.chat.Component +import net.minecraft.network.chat.ComponentSerialization +import net.minecraft.network.chat.MutableComponent +import net.minecraft.network.chat.Style +import net.minecraft.network.chat.TextColor +import net.minecraft.network.protocol.game.ServerboundContainerClickPacket +import net.minecraft.world.item.Items +import java.util.Optional + +object KuudraTracker : Module( + name = "Kuudra Tracker", + description = "Tracks your Kuudra runs." +) { + private val lineAmount by NumberSetting("Lines", 10, 0,40, 1, "The amount of items to display in the profit tracker.") + + private val chestRegex = Regex("(Free|Paid) Chest") + private val hudRegex = Regex("^((Free|Paid) Chest)|(Kuudra - .+)|(.+)?Vesuvius$") + private val uselessLinesRegex = Regex("^Contents|Cost|Click to open!|FREE|Already opened!|Can't open another chest!|Paid Chest|") + private val amountRegex = Regex("""x(\d+)$""") + + val profitHud by HUD("Kuudra Tracker HUD", "") { + if (!it) return@HUD 0 to 0 + drawOverlay(true) + } + + private var singleItems by ComponentCountMapSetting("Single Items", ::updateDisplay) + private var multiItems by ComponentCountMapSetting("Multi Items", ::updateDisplay) + + private var paid by NumberSetting("Paid Chests", 0, 0, Int.MAX_VALUE, 1, "").hide() + private var free by NumberSetting("Free Chests", 0, 0,Int.MAX_VALUE, 1, "").hide() + + private var toDisplay = mutableListOf>() + private var totalKeys by ListSetting("Total Keys", mutableListOf(0, 0, 0, 0, 0)).hide() //Tier 1-5 + + private var last = LastAdded(mutableListOf(), mutableListOf(), 0) + + init { + updateDisplay() + + on { + val title = screen.title.string + if (enabled && title.matches(hudRegex)) { + guiGraphics.pose().pushMatrix() + val sf = mc.window.guiScale + guiGraphics.pose().scale(1f / sf, 1f / sf) + guiGraphics.pose().translate(profitHud.x.toFloat(), profitHud.y.toFloat()) + guiGraphics.pose().scale(profitHud.scale) + + guiGraphics.drawOverlay(false) + + guiGraphics.pose().popMatrix() + } + } + + on { + val title = mc.screen?.title?.string ?: return@on + if (value.equalsOneOf("You cannot afford this!", "Whoa! Slow down there!") && title.matches(chestRegex)) { + for (single in last.single) { + singleItems[single] = (singleItems.getOrDefault(single, 0) - 1).coerceAtLeast(0) + } + for (multi in last.multi) { + multiItems[multi.component] = (multiItems.getOrDefault(multi.component, 0) - multi.amount).coerceAtLeast(0) + } + totalKeys[last.key - 1]-- + paid-- + + updateDisplay() + ModuleManager.saveConfigurations() + } + } + + onSend { + val title = mc.screen?.title?.string ?: return@onSend + if (!title.matches(chestRegex)) return@onSend + + val cursorStack = mc.player?.containerMenu?.carried ?: return@onSend + + if (!cursorStack.`is`(Items.CHEST)) return@onSend + + val loreLines = cursorStack.lore + + updateDisplay() + + if (loreLines.any { it.string.equalsOneOf("Already opened!", "Can't open another chest!")}) return@onSend + + last = LastAdded(mutableListOf(), mutableListOf(), 0) + + for (lore in loreLines) { + if (lore.string.matches(uselessLinesRegex)) continue + + if (lore.string.contains("Kuudra Key")) { + keys.find { it.type == lore.string }?.let { key -> + totalKeys[key.tier - 1]++ + last.key = key.tier + continue + } + } + + val (item, amount) = split(lore) ?: continue + + if (amount == 1) { + singleItems[item] = singleItems.getOrDefault(item, 0).coerceAtLeast(0) + amount + last.single.add(item) + } else { + multiItems[item] = multiItems.getOrDefault(item, 0).coerceAtLeast(0) + amount + last.multi.add(Multi(item, amount)) + } + } + + if (title == "Paid Chest") paid++ + if (title == "Free Chest") free++ + + updateDisplay() + ModuleManager.saveConfigurations() + } + } + + private fun split(line: Component): Pair? { + val result = Component.empty() + + val amount = amountRegex.find(line.string.trim()) + ?.groupValues + ?.get(1) + ?.toIntOrNull() + ?: 1 + + line.visit( + { style, str -> + if (style.color != TextColor.fromLegacyFormat(ChatFormatting.DARK_GRAY)) { + result.append(Component.literal(str).withStyle(style)) + } + + Optional.empty() + }, + Style.EMPTY + ) + + if (result.string.isBlank()) return null + return result to amount + } + + private fun updateDisplay() { + toDisplay.clear() + singleItems.forEach { (item, amount) -> + if (amount == 0) return@forEach + + val new = Component.empty() + new.append(item).append(Component.literal(" x$amount").withStyle(ChatFormatting.DARK_GRAY)) + + val price = Vesuvius.parseItemValue(item)?.times(amount) ?: 0.0 + + toDisplay.add(Pair(new, price)) + } + multiItems.forEach { (item, amount) -> + if (amount == 0) return@forEach + + val new = Component.empty() + new.append(item).append(Component.literal("x$amount").withStyle(ChatFormatting.DARK_GRAY)) + + val price = Vesuvius.parseItemValue(new) ?: 0.0 + + toDisplay.add(Pair(new, price)) + } + } + + private fun getKeyPrices(): Double { + return getPriceOfKey("Kuudra Key") * totalKeys[0] + + getPriceOfKey("Hot Kuudra Key") * totalKeys[1] + + getPriceOfKey("Burning Kuudra Key") * totalKeys[2] + + getPriceOfKey("Fiery Kuudra Key") * totalKeys[3] + + getPriceOfKey("Infernal Kuudra Key") * totalKeys[4] + } + + private fun GuiGraphicsExtractor.drawOverlay(isEditing: Boolean): Pair { + var yOffset = 100 + val maxWidth = 300 + + var profit = 0.0 + + for ((index, pair) in toDisplay + .sortedByDescending { it.second } + .withIndex() + ) { + val price = "%,.0f".format(pair.second) + + profit += pair.second + + if (index >= lineAmount) continue + + text(mc.font, pair.first, 0, yOffset, -1) + text(mc.font, price, maxWidth - mc.font.width(price), yOffset, Colors.MINECRAFT_DARK_GRAY.rgba) + + yOffset += 9 + } + + yOffset += 6 + + val keyPrices = "%,.0f".format(getKeyPrices()) + + text(mc.font, "§cTotal Key Costs:", 0, yOffset, -1) + text(mc.font, keyPrices, maxWidth - mc.font.width(keyPrices), yOffset, Colors.MINECRAFT_RED.rgba) + + yOffset += 12 + + val profitStr = "%,.0f".format(profit - getKeyPrices()) + + text("§aProfit:", 0, yOffset) + text(profitStr, maxWidth - mc.font.width(profitStr), yOffset, Colors.MINECRAFT_GREEN) + + yOffset += 15 + + val avg = "%,.0f".format((profit - getKeyPrices()) / (free + paid)) + + text(mc.font, "Total Chests: Free [$free], Paid [$paid]", 0, yOffset, Colors.MINECRAFT_YELLOW.rgba) + text(mc.font, "Avg [$avg]", maxWidth - mc.font.width("Avg [$avg]"), yOffset, Colors.MINECRAFT_GOLD.rgba) + + return maxWidth to yOffset + } + + data class LastAdded(var single: MutableList, var multi: MutableList, var key: Int) + data class Multi(val component: Component, val amount: Int) + + private class ComponentCountMapSetting( + name: String, + private val afterLoad: () -> Unit + ) : Setting>(name), Saving { + override val default = mutableMapOf() + override var value = default + + init { + hidden = true + } + + override fun write(gson: Gson): JsonElement = JsonArray().apply { + value.forEach { (component, count) -> + val encoded = ComponentSerialization.CODEC + .encodeStart(JsonOps.INSTANCE, component) + .result() + .orElse(null) ?: return@forEach + + add(JsonObject().apply { + add("component", encoded) + addProperty("count", count) + }) + } + } + + override fun read(element: JsonElement, gson: Gson) { + value.clear() + element.asJsonArray.forEach { entry -> + val obj = entry.asJsonObject + val component = ComponentSerialization.CODEC + .parse(JsonOps.INSTANCE, obj["component"]) + .result() + .orElse(null) ?: return@forEach + val count = obj["count"]?.asInt ?: return@forEach + value[component] = count + } + afterLoad() + } + } +} diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt index cecd313b3..b81196f53 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt @@ -41,13 +41,13 @@ object Vesuvius : Module( private val pearlRegex = Regex("^Heavy Pearl x(\\d+)$") private val chestRegex = Regex("^((Free|Paid) Chest)|(Kuudra - .+)$") private val uselessLinesRegex = Regex("^Contents|Cost|Click to open!|FREE|Already opened!|Can't open another chest!|Paid Chest|") - private val salvageItemsRegex = Regex("^Boots|Chestplate|Helmet|Cloak|Aurora Staff|Hollow Wand") + private val salvageItemsRegex = Regex("Boots|Chestplate|Helmet|Cloak|Aurora Staff|Hollow Wand") private val ultimateEnchants = setOf( "Fatal Tempo", "Inferno" ) - private data class Key(val type: String, val coins: Int, val quantity: Int) + data class Key(val type: String, val coins: Int, val quantity: Int, val tier: Int) private data class ChestItem(val name: Component, val price: Double) private data class ChestData(val items: List, val cost: Double, val profit: Double) @@ -89,11 +89,13 @@ object Vesuvius : Module( } } - private fun parseItemValue(component: Component): Double? { + fun parseItemValue(component: Component): Double? { var starCount = 0 val salvage = salvageItemsRegex.containsMatchIn(component.string) + modMessage("$salvage with ${component.string}") + val essenceBonus = (1 + kuudraPetBonus / 100.0) * (1 + lavaLeechBonus / 100.0) component.visit({ style, str -> @@ -141,6 +143,7 @@ object Vesuvius : Module( } if (useSalvagePrices && salvage) { + modMessage("$component}") val price = cachedPrices["ESSENCE_CRIMSON"] ?: 0.0 val quantity = starCountToEssence[starCount] ?: 0.0 return price * quantity @@ -151,7 +154,7 @@ object Vesuvius : Module( return cachedPrices[item.uppercase().replace(" ", "_")] } - private fun getPriceOfKey(key: String): Double { + fun getPriceOfKey(key: String): Double { keys.find { it.type == key }?.let { val material = minOf(cachedPrices["ENCHANTED_RED_SAND"] ?: 0.0, cachedPrices["ENCHANTED_MYCELIUM"] ?: 0.0) val star = (cachedPrices["CORRUPTED_NETHER_STAR"] ?: 0.0) @@ -213,12 +216,12 @@ object Vesuvius : Module( return maxWidth to yOffset } - private val keys = listOf( - Key("Kuudra Key", 155200, 2), - Key("Hot Kuudra Key", 310400, 4), - Key("Burning Kuudra Key", 582000, 16), - Key("Fiery Kuudra Key", 1164000, 40), - Key("Infernal Kuudra Key", 2328000, 80) + val keys = listOf( + Key("Kuudra Key", 155200, 2, 1), + Key("Hot Kuudra Key", 310400, 4, 2), + Key("Burning Kuudra Key", 582000, 16, 3), + Key("Fiery Kuudra Key", 1164000, 40, 4), + Key("Infernal Kuudra Key", 2328000, 80, 5) ) private val itemReplacements = mapOf( From f659774803513f89244002c24203426131be4305 Mon Sep 17 00:00:00 2001 From: TurtleOnFire2 Date: Thu, 27 Aug 2026 17:49:00 +0200 Subject: [PATCH 08/11] maybe dont leave in the debug ig --- .../kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt index b81196f53..b0f15174a 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt @@ -94,8 +94,6 @@ object Vesuvius : Module( var starCount = 0 val salvage = salvageItemsRegex.containsMatchIn(component.string) - modMessage("$salvage with ${component.string}") - val essenceBonus = (1 + kuudraPetBonus / 100.0) * (1 + lavaLeechBonus / 100.0) component.visit({ style, str -> From d74aebcb2bde7c47aa08c208eea8a455c9a9f068 Mon Sep 17 00:00:00 2001 From: TurtleOnFire2 Date: Thu, 27 Aug 2026 21:36:44 +0200 Subject: [PATCH 09/11] fixed stuff --- .../features/impl/nether/KuudraTracker.kt | 198 ++++++++---------- .../odin/features/impl/nether/Vesuvius.kt | 2 +- 2 files changed, 93 insertions(+), 107 deletions(-) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt index 8516bfdf2..46b8cddeb 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt @@ -1,13 +1,8 @@ package com.odtheking.odin.features.impl.nether -import com.google.gson.Gson -import com.google.gson.JsonArray -import com.google.gson.JsonElement -import com.google.gson.JsonObject -import com.mojang.serialization.JsonOps -import com.odtheking.odin.clickgui.settings.Saving -import com.odtheking.odin.clickgui.settings.Setting +import com.odtheking.odin.clickgui.settings.impl.ActionSetting import com.odtheking.odin.clickgui.settings.impl.ListSetting +import com.odtheking.odin.clickgui.settings.impl.MapSetting import com.odtheking.odin.clickgui.settings.impl.NumberSetting import com.odtheking.odin.events.ChatPacketEvent import com.odtheking.odin.events.GuiEvent @@ -24,35 +19,49 @@ import com.odtheking.odin.utils.render.text import net.minecraft.ChatFormatting import net.minecraft.client.gui.GuiGraphicsExtractor import net.minecraft.network.chat.Component -import net.minecraft.network.chat.ComponentSerialization import net.minecraft.network.chat.MutableComponent -import net.minecraft.network.chat.Style -import net.minecraft.network.chat.TextColor import net.minecraft.network.protocol.game.ServerboundContainerClickPacket import net.minecraft.world.item.Items -import java.util.Optional +import kotlin.let object KuudraTracker : Module( name = "Kuudra Tracker", description = "Tracks your Kuudra runs." ) { private val lineAmount by NumberSetting("Lines", 10, 0,40, 1, "The amount of items to display in the profit tracker.") + private val reset by ActionSetting("Reset Profit", "Resets the Profit Tracker") { + totalKeys = mutableListOf(0, 0, 0, 0, 0) + singleItems.clear() + multiItems.clear() + paid = 0 + free = 0 + last = LastAdded(mutableListOf(), mutableListOf(), 0) + + updateDisplay() + ModuleManager.saveConfigurations() + } private val chestRegex = Regex("(Free|Paid) Chest") private val hudRegex = Regex("^((Free|Paid) Chest)|(Kuudra - .+)|(.+)?Vesuvius$") - private val uselessLinesRegex = Regex("^Contents|Cost|Click to open!|FREE|Already opened!|Can't open another chest!|Paid Chest|") - private val amountRegex = Regex("""x(\d+)$""") + private val uselessLinesRegex = Regex("^Contents|Cost|Click to open!|FREE|Already opened!|Can't open another chest!|Paid Chest$") + private val amountRegex = Regex("(.+)? x(\\d+)$") + + private val lightPurpleRegex = Regex("Crimson Essence") + private val whiteRegex = Regex("Fatal Tempo|Inferno|Book") + private val darkPurpleRegex = Regex("Kuudra Teeth|Fire Eel Shard|Kuudra Mandible|Barbarian Duke X Shard|XYZ Shard") + private val blueRegex = Regex("Kada Knight Shard|Wheel of Fate|Ananke Feather|Burning Kuudra Core|Matcho Shard|Kuudra Tentacle|Lava Flame Shard|Wither Spectre Shard") + private val goldRegex = Regex("Boots|Leggings|Chestplate|Helmet|Cloak|Aurora Staff|Hollow Wand|Heavy Pearl|Kraken Shard|Hellwisp Shard|Ananke Shard|Moltenfish Shard") - val profitHud by HUD("Kuudra Tracker HUD", "") { + val profitHud by HUD("Kuudra Tracker HUD", "Displays the profit of all your Kudura chests.") { if (!it) return@HUD 0 to 0 drawOverlay(true) } - private var singleItems by ComponentCountMapSetting("Single Items", ::updateDisplay) - private var multiItems by ComponentCountMapSetting("Multi Items", ::updateDisplay) + private var singleItems by MapSetting("Single Items",mutableMapOf()) + private var multiItems by MapSetting("Multi Items", mutableMapOf()) - private var paid by NumberSetting("Paid Chests", 0, 0, Int.MAX_VALUE, 1, "").hide() - private var free by NumberSetting("Free Chests", 0, 0,Int.MAX_VALUE, 1, "").hide() + private var paid by NumberSetting("Paid Chests", 0, 0, Int.MAX_VALUE, 1, "Amount of Paid Chests opened.").hide() + private var free by NumberSetting("Free Chests", 0, 0, Int.MAX_VALUE, 1, "Amount of Paid Chests opened").hide() private var toDisplay = mutableListOf>() private var totalKeys by ListSetting("Total Keys", mutableListOf(0, 0, 0, 0, 0)).hide() //Tier 1-5 @@ -121,15 +130,12 @@ object KuudraTracker : Module( } } - val (item, amount) = split(lore) ?: continue - - if (amount == 1) { - singleItems[item] = singleItems.getOrDefault(item, 0).coerceAtLeast(0) + amount - last.single.add(item) - } else { - multiItems[item] = multiItems.getOrDefault(item, 0).coerceAtLeast(0) + amount - last.multi.add(Multi(item, amount)) + amountRegex.find(lore.string)?.destructured?.let { (name, amount) -> + multiItems[name] = multiItems.getOrDefault(name, 0) + (amount.toIntOrNull() ?: 0) + continue } + + singleItems[lore.string] = singleItems.getOrDefault(lore.string, 0) + 1 } if (title == "Paid Chest") paid++ @@ -140,51 +146,25 @@ object KuudraTracker : Module( } } - private fun split(line: Component): Pair? { - val result = Component.empty() - - val amount = amountRegex.find(line.string.trim()) - ?.groupValues - ?.get(1) - ?.toIntOrNull() - ?: 1 - - line.visit( - { style, str -> - if (style.color != TextColor.fromLegacyFormat(ChatFormatting.DARK_GRAY)) { - result.append(Component.literal(str).withStyle(style)) - } - - Optional.empty() - }, - Style.EMPTY - ) - - if (result.string.isBlank()) return null - return result to amount - } - private fun updateDisplay() { toDisplay.clear() - singleItems.forEach { (item, amount) -> - if (amount == 0) return@forEach - val new = Component.empty() - new.append(item).append(Component.literal(" x$amount").withStyle(ChatFormatting.DARK_GRAY)) + singleItems.forEach { (name, amount) -> + if (amount == 0) return@forEach - val price = Vesuvius.parseItemValue(item)?.times(amount) ?: 0.0 + val price = Vesuvius.parseItemValue(Component.literal(name))?.times(amount) ?: return@forEach - toDisplay.add(Pair(new, price)) + toDisplay.add(Component.literal(name).withStyle(getColor(name)).append(Component.literal(" x$amount").withStyle(ChatFormatting.DARK_GRAY)) to price) } - multiItems.forEach { (item, amount) -> + + multiItems.forEach { (name, amount) -> if (amount == 0) return@forEach - val new = Component.empty() - new.append(item).append(Component.literal("x$amount").withStyle(ChatFormatting.DARK_GRAY)) + val built = Component.literal(name).append(Component.literal(" x$amount").withStyle(ChatFormatting.DARK_GRAY)) - val price = Vesuvius.parseItemValue(new) ?: 0.0 + val price = Vesuvius.parseItemValue(built) ?: return@forEach - toDisplay.add(Pair(new, price)) + toDisplay.add(built.withStyle(getColor(name)) to price) } } @@ -197,12 +177,14 @@ object KuudraTracker : Module( } private fun GuiGraphicsExtractor.drawOverlay(isEditing: Boolean): Pair { - var yOffset = 100 + var yOffset = 0 val maxWidth = 300 var profit = 0.0 - for ((index, pair) in toDisplay + val display = if (isEditing) { sampleProfitData } else toDisplay + + for ((index, pair) in display .sortedByDescending { it.second } .withIndex() ) { @@ -220,7 +202,7 @@ object KuudraTracker : Module( yOffset += 6 - val keyPrices = "%,.0f".format(getKeyPrices()) + val keyPrices = if (isEditing) getPriceOfKey("Infernal Kuudra Key").toString() else "%,.0f".format(getKeyPrices()) text(mc.font, "§cTotal Key Costs:", 0, yOffset, -1) text(mc.font, keyPrices, maxWidth - mc.font.width(keyPrices), yOffset, Colors.MINECRAFT_RED.rgba) @@ -234,54 +216,58 @@ object KuudraTracker : Module( yOffset += 15 - val avg = "%,.0f".format((profit - getKeyPrices()) / (free + paid)) + val freeChests = if (isEditing) 0 else free + val paidChests = if (isEditing) 1 else paid + + val avg = "%,.0f".format((profit - getKeyPrices()) / (freeChests + paidChests)) - text(mc.font, "Total Chests: Free [$free], Paid [$paid]", 0, yOffset, Colors.MINECRAFT_YELLOW.rgba) + text(mc.font, "Total Chests: Free [$freeChests], Paid [$paidChests]", 0, yOffset, Colors.MINECRAFT_YELLOW.rgba) text(mc.font, "Avg [$avg]", maxWidth - mc.font.width("Avg [$avg]"), yOffset, Colors.MINECRAFT_GOLD.rgba) + yOffset += 9 + return maxWidth to yOffset } - data class LastAdded(var single: MutableList, var multi: MutableList, var key: Int) - data class Multi(val component: Component, val amount: Int) - - private class ComponentCountMapSetting( - name: String, - private val afterLoad: () -> Unit - ) : Setting>(name), Saving { - override val default = mutableMapOf() - override var value = default - - init { - hidden = true - } + private fun getColor(name: String): ChatFormatting { + if (name.contains(whiteRegex)) return ChatFormatting.WHITE + if (name.contains(goldRegex)) return ChatFormatting.GOLD + if (name.contains(darkPurpleRegex)) return ChatFormatting.DARK_PURPLE + if (name.contains(lightPurpleRegex)) return ChatFormatting.LIGHT_PURPLE + if (name.contains(blueRegex)) return ChatFormatting.BLUE - override fun write(gson: Gson): JsonElement = JsonArray().apply { - value.forEach { (component, count) -> - val encoded = ComponentSerialization.CODEC - .encodeStart(JsonOps.INSTANCE, component) - .result() - .orElse(null) ?: return@forEach - - add(JsonObject().apply { - add("component", encoded) - addProperty("count", count) - }) - } - } - - override fun read(element: JsonElement, gson: Gson) { - value.clear() - element.asJsonArray.forEach { entry -> - val obj = entry.asJsonObject - val component = ComponentSerialization.CODEC - .parse(JsonOps.INSTANCE, obj["component"]) - .result() - .orElse(null) ?: return@forEach - val count = obj["count"]?.asInt ?: return@forEach - value[component] = count - } - afterLoad() - } + return ChatFormatting.WHITE } + + data class LastAdded(var single: MutableList, var multi: MutableList, var key: Int) + data class Multi(val component: String, val amount: Int) + + private val sampleProfitData = listOf( + Pair( + Component.literal("Fervor Helmet") + .withStyle(ChatFormatting.GOLD), + 748000.0 + ), + Pair( + Component.literal("Enchanted Book (").withStyle(ChatFormatting.WHITE) + .append(Component.literal("Ferocious Mana V").withStyle(ChatFormatting.LIGHT_PURPLE)) + .append(Component.literal(")").withStyle(ChatFormatting.WHITE)), + 118500000.0 + ), + Pair( + Component.literal("Crimson Essence").withStyle(ChatFormatting.LIGHT_PURPLE) + .append(Component.literal(" x2000").withStyle(ChatFormatting.DARK_GRAY)), + 2420000.0 + ), + Pair( + Component.literal("Kuudra Teeth").withStyle(ChatFormatting.DARK_PURPLE) + .append(Component.literal(" x4").withStyle(ChatFormatting.DARK_GRAY)), + 35480.0 + ), + Pair( + Component.literal("Kraken Shard").withStyle(ChatFormatting.GOLD) + .append(Component.literal(" x2").withStyle(ChatFormatting.DARK_GRAY)), + 821226.0 + ) + ) } diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt index b0f15174a..fbaf42edc 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt @@ -41,7 +41,7 @@ object Vesuvius : Module( private val pearlRegex = Regex("^Heavy Pearl x(\\d+)$") private val chestRegex = Regex("^((Free|Paid) Chest)|(Kuudra - .+)$") private val uselessLinesRegex = Regex("^Contents|Cost|Click to open!|FREE|Already opened!|Can't open another chest!|Paid Chest|") - private val salvageItemsRegex = Regex("Boots|Chestplate|Helmet|Cloak|Aurora Staff|Hollow Wand") + private val salvageItemsRegex = Regex("Boots|Leggings|Chestplate|Helmet|Cloak|Aurora Staff|Hollow Wand") private val ultimateEnchants = setOf( "Fatal Tempo", "Inferno" From a2dac087d9e28c34df0066d688d56b28f9a3e8cf Mon Sep 17 00:00:00 2001 From: TurtleOnFire2 Date: Thu, 27 Aug 2026 21:39:37 +0200 Subject: [PATCH 10/11] forgot some item colors --- .../odtheking/odin/features/impl/nether/KuudraTracker.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt index 46b8cddeb..8f6a646d9 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt @@ -46,11 +46,11 @@ object KuudraTracker : Module( private val uselessLinesRegex = Regex("^Contents|Cost|Click to open!|FREE|Already opened!|Can't open another chest!|Paid Chest$") private val amountRegex = Regex("(.+)? x(\\d+)$") - private val lightPurpleRegex = Regex("Crimson Essence") - private val whiteRegex = Regex("Fatal Tempo|Inferno|Book") - private val darkPurpleRegex = Regex("Kuudra Teeth|Fire Eel Shard|Kuudra Mandible|Barbarian Duke X Shard|XYZ Shard") + private val lightPurpleRegex = Regex("Fatal Tempo|Inferno|Crimson Essence") + private val whiteRegex = Regex("Book") + private val darkPurpleRegex = Regex("Kuudra Teeth|Fire Eel Shard|Kuudra Mandible|Barbarian Duke X Shard|XYZ Shard|Hellstorm Wand|Tentacle Dye") private val blueRegex = Regex("Kada Knight Shard|Wheel of Fate|Ananke Feather|Burning Kuudra Core|Matcho Shard|Kuudra Tentacle|Lava Flame Shard|Wither Spectre Shard") - private val goldRegex = Regex("Boots|Leggings|Chestplate|Helmet|Cloak|Aurora Staff|Hollow Wand|Heavy Pearl|Kraken Shard|Hellwisp Shard|Ananke Shard|Moltenfish Shard") + private val goldRegex = Regex("Boots|Leggings|Chestplate|Helmet|Cloak|Aurora Staff|Hollow Wand|Heavy Pearl|Kraken Shard|Hellwisp Shard|Ananke Shard|Moltenfish Shard|Tormentor") val profitHud by HUD("Kuudra Tracker HUD", "Displays the profit of all your Kudura chests.") { if (!it) return@HUD 0 to 0 From 7477266bd71ba1584349f3472598d131ad4a19b0 Mon Sep 17 00:00:00 2001 From: odtheking Date: Fri, 11 Sep 2026 09:50:36 +0300 Subject: [PATCH 11/11] Cleanup merge --- .../odtheking/odin/features/impl/dungeon/Croesus.kt | 6 ++---- .../odin/features/impl/nether/KuudraTracker.kt | 11 +++++------ .../odtheking/odin/features/impl/nether/Vesuvius.kt | 11 ++++------- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/dungeon/Croesus.kt b/src/main/kotlin/com/odtheking/odin/features/impl/dungeon/Croesus.kt index a9c18f06a..448d05efd 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/dungeon/Croesus.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/dungeon/Croesus.kt @@ -22,7 +22,6 @@ import com.odtheking.odin.utils.render.textDim import com.odtheking.odin.utils.skyblock.dungeon.DungeonUtils import kotlinx.coroutines.launch import net.minecraft.client.gui.GuiGraphicsExtractor -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen import net.minecraft.network.chat.Component import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket import net.minecraft.world.item.ItemStack @@ -140,11 +139,10 @@ object Croesus : Module( on { val screenTitle = mc.screen?.title?.string ?: return@on - val items = (mc.screen as? AbstractContainerScreen<*>)?.menu?.items ?: return@on when { - screenTitle.matches(chestNameRegex) -> handleChestContents(items) - screenTitle.matches(chestPreviewScreenRegex) -> handleCroesusScreen(items) + screenTitle.matches(chestNameRegex) -> handleChestContents(menu.items) + screenTitle.matches(chestPreviewScreenRegex) -> handleCroesusScreen(menu.items) } } diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt index 8f6a646d9..a010f6b82 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/KuudraTracker.kt @@ -4,8 +4,8 @@ import com.odtheking.odin.clickgui.settings.impl.ActionSetting import com.odtheking.odin.clickgui.settings.impl.ListSetting import com.odtheking.odin.clickgui.settings.impl.MapSetting import com.odtheking.odin.clickgui.settings.impl.NumberSetting -import com.odtheking.odin.events.ChatPacketEvent import com.odtheking.odin.events.GuiEvent +import com.odtheking.odin.events.MessageEvent import com.odtheking.odin.events.core.on import com.odtheking.odin.events.core.onSend import com.odtheking.odin.features.Module @@ -22,7 +22,6 @@ import net.minecraft.network.chat.Component import net.minecraft.network.chat.MutableComponent import net.minecraft.network.protocol.game.ServerboundContainerClickPacket import net.minecraft.world.item.Items -import kotlin.let object KuudraTracker : Module( name = "Kuudra Tracker", @@ -86,14 +85,14 @@ object KuudraTracker : Module( } } - on { + on { val title = mc.screen?.title?.string ?: return@on - if (value.equalsOneOf("You cannot afford this!", "Whoa! Slow down there!") && title.matches(chestRegex)) { + if (message.equalsOneOf("You cannot afford this!", "Whoa! Slow down there!") && title.matches(chestRegex)) { for (single in last.single) { singleItems[single] = (singleItems.getOrDefault(single, 0) - 1).coerceAtLeast(0) } - for (multi in last.multi) { - multiItems[multi.component] = (multiItems.getOrDefault(multi.component, 0) - multi.amount).coerceAtLeast(0) + for ((itemComponent, amount) in last.multi) { + multiItems[itemComponent] = (multiItems.getOrDefault(itemComponent, 0) - amount).coerceAtLeast(0) } totalKeys[last.key - 1]-- paid-- diff --git a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt index 14019b55e..172cbcae7 100644 --- a/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt +++ b/src/main/kotlin/com/odtheking/odin/features/impl/nether/Vesuvius.kt @@ -75,13 +75,11 @@ object Vesuvius : Module( } } - on { - if (!screen.title.string.matches(chestRegex)) return@on + on { + if (mc.screen?.title?.string?.matches(chestRegex) != true) return@on - val item = packet.item - - if (packet.slot == 31 && item.item == Items.CHEST) handleKuudraChest(item) - if (packet.slot.equalsOneOf(13, 14) && item.item == Items.PLAYER_HEAD) handleKuudraChest(item) + if (slotIndex == 31 && itemStack.item == Items.CHEST) handleKuudraChest(itemStack) + if (slotIndex.equalsOneOf(13, 14) && itemStack.item == Items.PLAYER_HEAD) handleKuudraChest(itemStack) } on { @@ -90,7 +88,6 @@ object Vesuvius : Module( } fun parseItemValue(component: Component): Double? { - var starCount = 0 val salvage = salvageItemsRegex.containsMatchIn(component.string)