aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features/misc
diff options
context:
space:
mode:
authorhannibal2 <24389977+hannibal002@users.noreply.github.com>2024-03-14 12:18:43 +0100
committerGitHub <noreply@github.com>2024-03-14 12:18:43 +0100
commit578069c68c0dc648bcc9e5fa6a2d445da7fc8e9c (patch)
tree512fd0dbfe9e411d7df0133d58190b7f4c2e9a74 /src/main/java/at/hannibal2/skyhanni/features/misc
parent020f9b5758870d806754051f1e87ec276b0a8521 (diff)
downloadskyhanni-578069c68c0dc648bcc9e5fa6a2d445da7fc8e9c.tar.gz
skyhanni-578069c68c0dc648bcc9e5fa6a2d445da7fc8e9c.tar.bz2
skyhanni-578069c68c0dc648bcc9e5fa6a2d445da7fc8e9c.zip
Feature: AH estimated item value comparison (#339)
Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com> Co-authored-by: Cal <cwolfson58@gmail.com>
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/features/misc')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/misc/AuctionHousePriceComparison.kt139
-rw-r--r--src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValueCalculator.kt1
2 files changed, 140 insertions, 0 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/AuctionHousePriceComparison.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/AuctionHousePriceComparison.kt
new file mode 100644
index 000000000..187641835
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/features/misc/AuctionHousePriceComparison.kt
@@ -0,0 +1,139 @@
+package at.hannibal2.skyhanni.features.misc
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.events.GuiContainerEvent
+import at.hannibal2.skyhanni.events.InventoryOpenEvent
+import at.hannibal2.skyhanni.events.LorenzToolTipEvent
+import at.hannibal2.skyhanni.features.inventory.AuctionsHighlighter
+import at.hannibal2.skyhanni.features.misc.items.EstimatedItemValueCalculator
+import at.hannibal2.skyhanni.utils.ColorUtils.toChromaColor
+import at.hannibal2.skyhanni.utils.InventoryUtils
+import at.hannibal2.skyhanni.utils.ItemUtils.getLore
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators
+import at.hannibal2.skyhanni.utils.NumberUtil.formatLong
+import at.hannibal2.skyhanni.utils.RenderUtils.highlight
+import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher
+import net.minecraft.item.ItemStack
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import java.awt.Color
+
+class AuctionHousePriceComparison {
+
+ private val config get() = SkyHanniMod.feature.inventory.auctionsPriceComparison
+
+ private var slotPriceMap = mapOf<Int, Long>()
+ private var bestPrice = 0L
+ private var worstPrice = 0L
+ private var inInventory = false
+
+ @SubscribeEvent
+ fun onInventoryOpen(event: InventoryOpenEvent) {
+ inInventory = false
+ if (!event.inventoryName.startsWith("Auctions")) return
+ inInventory = true
+
+ bestPrice = 0L
+ worstPrice = 0L
+
+ val map = mutableMapOf<Int, Long>()
+
+ for ((slot, stack) in event.inventoryItems) {
+ for (line in stack.getLore()) {
+ AuctionsHighlighter.buyItNowPattern.matchMatcher(line) {
+ map.add(stack, group("coins").formatLong(), slot)
+ }
+ AuctionsHighlighter.auctionPattern.matchMatcher(line) {
+ map.add(stack, group("coins").formatLong(), slot)
+ }
+ }
+ }
+ this.slotPriceMap = map
+ }
+
+ private fun MutableMap<Int, Long>.add(stack: ItemStack, binPrice: Long, slot: Int) {
+ val (totalPrice, basePrice) = EstimatedItemValueCalculator.calculate(stack, mutableListOf())
+ if (totalPrice == basePrice) return
+ val estimatedPrice = totalPrice.toLong()
+
+ val diff = estimatedPrice - binPrice
+ this[slot] = diff
+ if (diff >= 0) {
+ if (diff > bestPrice) {
+ bestPrice = diff
+ }
+ } else {
+ if (diff < worstPrice) {
+ worstPrice = diff
+ }
+ }
+ }
+
+ @SubscribeEvent
+ fun onBackgroundDrawn(event: GuiContainerEvent.BackgroundDrawnEvent) {
+ if (!isEnabled()) return
+
+ val good = config.good.toChromaColor()
+ val veryGood = config.veryGood.toChromaColor()
+
+ val bad = config.bad.toChromaColor()
+ val veryBad = config.veryBad.toChromaColor()
+
+
+ for (slot in InventoryUtils.getItemsInOpenChest()) {
+ val diff = slotPriceMap[slot.slotIndex] ?: continue
+ if (diff == 0L) {
+ slot highlight good
+ continue
+ }
+ val isGood = diff >= 0
+ val percentage = if (isGood) {
+ diff.toDouble() / bestPrice
+ } else {
+ -diff.toDouble() / -worstPrice
+ }
+ val color = if (isGood) {
+ getColorInBetween(good, veryGood, percentage)
+ } else {
+ getColorInBetween(bad, veryBad, percentage)
+ }
+ slot highlight color
+ }
+ }
+
+ @SubscribeEvent
+ fun onTooltip(event: LorenzToolTipEvent) {
+ if (!isEnabled()) return
+
+ val diff = slotPriceMap[event.slot.slotIndex] ?: return
+
+ event.toolTip.add("")
+ if (diff >= 0) {
+ event.toolTip.add("§aThis item is §6${diff.addSeparators()} coins §acheaper")
+ event.toolTip.add("§athan the estimated item value!")
+ } else {
+ event.toolTip.add("§cThis item is §6${(-diff).addSeparators()} coins §cmore")
+ event.toolTip.add("§cexpensive than the estimated item value!")
+ }
+ }
+
+ private fun getColorInBetween(color1: Color, color2: Color, percentage: Double): Color {
+ val r1 = color1.red
+ val g1 = color1.green
+ val b1 = color1.blue
+
+ val r2 = color2.red
+ val g2 = color2.green
+ val b2 = color2.blue
+
+ val newRed = (lerp(percentage, r1, r2)).toInt().coerceIn(0, 255)
+ val newGreen = (lerp(percentage, g1, g2)).toInt().coerceIn(0, 255)
+ val newBlue = (lerp(percentage, b1, b2)).toInt().coerceIn(0, 255)
+
+ return Color(newRed, newGreen, newBlue)
+ }
+
+ private fun lerp(delta: Double, start: Int, end: Int) = start + delta * (end - start)
+
+ private fun isEnabled() = LorenzUtils.inSkyBlock && config.enabled && inInventory
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValueCalculator.kt b/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValueCalculator.kt
index 87e582545..6b90adba6 100644
--- a/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValueCalculator.kt
+++ b/src/main/java/at/hannibal2/skyhanni/features/misc/items/EstimatedItemValueCalculator.kt
@@ -546,6 +546,7 @@ object EstimatedItemValueCalculator {
var totalPrice = 0.0
val map = mutableMapOf<String, Double>()
+ //todo use repo
val tieredEnchants = listOf("compact", "cultivating", "champion", "expertise", "hecatomb")
val onlyTierOnePrices =
listOf("ultimate_chimera", "ultimate_fatal_tempo", "smoldering", "ultimate_flash", "divine_gift")