forked from hannibal002/SkyHanni
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Feature: AH estimated item value comparison (hannibal002#339)
Co-authored-by: hannibal2 <24389977+hannibal00212@users.noreply.github.com> Co-authored-by: Cal <cwolfson58@gmail.com>
- Loading branch information
1 parent
5244cfb
commit 8feecf4
Showing
8 changed files
with
202 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
41 changes: 41 additions & 0 deletions
41
...va/at/hannibal2/skyhanni/config/features/inventory/AuctionHousePriceComparisonConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package at.hannibal2.skyhanni.config.features.inventory; | ||
|
||
import at.hannibal2.skyhanni.config.FeatureToggle; | ||
import at.hannibal2.skyhanni.utils.LorenzColor; | ||
import com.google.gson.annotations.Expose; | ||
import io.github.moulberry.moulconfig.annotations.ConfigEditorBoolean; | ||
import io.github.moulberry.moulconfig.annotations.ConfigEditorColour; | ||
import io.github.moulberry.moulconfig.annotations.ConfigOption; | ||
|
||
public class AuctionHousePriceComparisonConfig { | ||
|
||
@Expose | ||
@ConfigOption( | ||
name = "Show Price Comparison", | ||
desc = "Highlight auctions based on the difference between their estimated value and the value they are listed for. §eCan " + | ||
"be very inaccurate." | ||
) | ||
@ConfigEditorBoolean | ||
@FeatureToggle | ||
public boolean enabled = false; | ||
|
||
@Expose | ||
@ConfigOption(name = "Good Colour", desc = "What colour to highlight good value items with.") | ||
@ConfigEditorColour | ||
public String good = LorenzColor.GREEN.toConfigColour(); | ||
|
||
@Expose | ||
@ConfigOption(name = "Very Good Colour", desc = "What colour to highlight very good value items with.") | ||
@ConfigEditorColour | ||
public String veryGood = "0:255:0:139:0"; | ||
|
||
@Expose | ||
@ConfigOption(name = "Bad Colour", desc = "What colour to highlight bad items with.") | ||
@ConfigEditorColour | ||
public String bad = LorenzColor.YELLOW.toConfigColour(); | ||
|
||
@Expose | ||
@ConfigOption(name = "Very Bad Colour", desc = "What colour to highlight very bad items with.") | ||
@ConfigEditorColour | ||
public String veryBad = "0:255:225:43:30"; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
139 changes: 139 additions & 0 deletions
139
src/main/java/at/hannibal2/skyhanni/features/misc/AuctionHousePriceComparison.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters