summaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/utils/tracker
diff options
context:
space:
mode:
authorhannibal2 <24389977+hannibal00212@users.noreply.github.com>2023-11-25 02:41:24 +0100
committerhannibal2 <24389977+hannibal00212@users.noreply.github.com>2023-11-25 02:41:24 +0100
commit861f3bece9ee7e48c26392443f44aa75afba21c0 (patch)
treed70e37d68cc242526facf3938def7e019a000622 /src/main/java/at/hannibal2/skyhanni/utils/tracker
parentb32344991743f53c94a48f8a0054d0126b15bbfd (diff)
downloadskyhanni-861f3bece9ee7e48c26392443f44aa75afba21c0.tar.gz
skyhanni-861f3bece9ee7e48c26392443f44aa75afba21c0.tar.bz2
skyhanni-861f3bece9ee7e48c26392443f44aa75afba21c0.zip
migrating backend and much of rendering from slayer profit tracker and fishing tracker into SkyHanni item tracker
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/utils/tracker')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/tracker/ItemTrackerData.kt134
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt39
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt15
3 files changed, 186 insertions, 2 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/tracker/ItemTrackerData.kt b/src/main/java/at/hannibal2/skyhanni/utils/tracker/ItemTrackerData.kt
new file mode 100644
index 000000000..985706a38
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/utils/tracker/ItemTrackerData.kt
@@ -0,0 +1,134 @@
+package at.hannibal2.skyhanni.utils.tracker
+
+import at.hannibal2.skyhanni.SkyHanniMod
+import at.hannibal2.skyhanni.utils.ItemUtils.nameWithEnchantment
+import at.hannibal2.skyhanni.utils.KeyboardManager
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import at.hannibal2.skyhanni.utils.NEUInternalName
+import at.hannibal2.skyhanni.utils.NEUInternalName.Companion.asInternalName
+import at.hannibal2.skyhanni.utils.NEUItems.getItemStack
+import at.hannibal2.skyhanni.utils.NumberUtil
+import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators
+import at.hannibal2.skyhanni.utils.SimpleTimeMark
+import at.hannibal2.skyhanni.utils.StringUtils.removeColor
+import at.hannibal2.skyhanni.utils.renderables.Renderable
+import com.google.gson.annotations.Expose
+import kotlin.time.Duration.Companion.seconds
+
+abstract class ItemTrackerData : TrackerData() {
+
+ private val config get() = SkyHanniMod.feature.misc.tracker
+
+ private var lastClickDelay = 0L
+
+ companion object {
+ val SKYBLOCK_COIN by lazy { "SKYBLOCK_COIN".asInternalName() }
+ }
+
+ abstract fun resetItems()
+
+ abstract fun getDescription(timesGained: Long): List<String>
+
+ abstract fun getCoinFormat(item: TrackedItem, numberColor: String): Pair<String, List<String>>
+
+ open fun getCustomPricePer(internalName: NEUInternalName) = SkyHanniTracker.getPricePer(internalName)
+
+ override fun reset() {
+ items.clear()
+ resetItems()
+ }
+
+ fun additem(internalName: NEUInternalName, stackSize: Int) {
+ val item = items.getOrPut(internalName) { TrackedItem() }
+
+ item.timesGained++
+ item.totalAmount += stackSize
+ item.lastTimeUpdated = SimpleTimeMark.now()
+ }
+
+ fun drawItem(
+ tracker: SkyHanniItemTracker<out ItemTrackerData>,
+ item: TrackedItem,
+ internalName: NEUInternalName,
+ map: MutableMap<Renderable, Long>
+ ): Long {
+ val amount = item.totalAmount
+
+ val pricePer = if (internalName == SKYBLOCK_COIN) 1.0 else getCustomPricePer(internalName)
+
+ val price = (pricePer * amount).toLong()
+ val displayAmount = if (internalName == SKYBLOCK_COIN) item.timesGained else amount
+
+ var name = if (internalName == SKYBLOCK_COIN) {
+ "§6Coins"
+ } else {
+ internalName.getItemStack().nameWithEnchantment ?: error("no name for $internalName")
+ }
+ val priceFormat = NumberUtil.format(price)
+ val hidden = item.hidden
+
+ val newDrop = item.lastTimeUpdated.passedSince() < 10.seconds && config.showRecentDrops
+ val numberColor = if (newDrop) "§a§l" else "§7"
+
+ if (hidden) {
+ name = "§8§m" + name.removeColor(keepFormatting = true).replace("§r", "")
+ }
+
+ val text = " $numberColor${displayAmount.addSeparators()}x $name§7: §6$priceFormat"
+ val (displayName, lore) = if (internalName == SKYBLOCK_COIN) {
+ getCoinFormat(item, numberColor)
+ } else text to buildLore(item, hidden, newDrop)
+
+ val renderable = if (tracker.isInventoryOpen()) Renderable.clickAndHover(displayName, lore) {
+ if (System.currentTimeMillis() > lastClickDelay + 150) {
+ if (KeyboardManager.isControlKeyDown()) {
+ items.remove(internalName)
+ LorenzUtils.chat("§e[SkyHanni] Removed ${if (internalName == SKYBLOCK_COIN) "§6Coins" else internalName.getItemStack().nameWithEnchantment} §efrom Fishing Frofit Tracker.")
+ lastClickDelay = System.currentTimeMillis() + 500
+ } else {
+ item.hidden = !hidden
+ lastClickDelay = System.currentTimeMillis()
+ }
+ tracker.update()
+ }
+ } else Renderable.string(displayName)
+ if (tracker.isInventoryOpen() || !hidden) {
+ map[renderable] = price
+ }
+ return price
+ }
+
+ private fun buildLore(
+ item: TrackedItem,
+ hidden: Boolean,
+ newDrop: Boolean
+ ) = buildList {
+ addAll(getDescription(item.timesGained))
+ add("")
+ if (newDrop) {
+ add("§aYou caught this item recently.")
+ add("")
+ }
+ add("§eClick to " + (if (hidden) "show" else "hide") + "!")
+ add("§eControl + Click to remove this item!")
+ }
+
+ @Expose
+ var items: MutableMap<NEUInternalName, TrackedItem> = HashMap()
+
+ class TrackedItem {
+ @Expose
+ var internalName: NEUInternalName? = null
+
+ @Expose
+ var timesGained: Long = 0
+
+ @Expose
+ var totalAmount: Long = 0
+
+ @Expose
+ var hidden = false
+
+ var lastTimeUpdated = SimpleTimeMark.farPast()
+ }
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt
new file mode 100644
index 000000000..8059123fb
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniItemTracker.kt
@@ -0,0 +1,39 @@
+package at.hannibal2.skyhanni.utils.tracker
+
+import at.hannibal2.skyhanni.config.Storage
+import at.hannibal2.skyhanni.test.PriceSource
+import at.hannibal2.skyhanni.utils.LorenzUtils.addSelector
+import at.hannibal2.skyhanni.utils.NEUInternalName
+
+class SkyHanniItemTracker<Data : ItemTrackerData>(
+ name: String,
+ createNewSession: () -> Data,
+ getStorage: (Storage.ProfileSpecific) -> Data,
+ drawDisplay: (Data) -> List<List<Any>>,
+) : SkyHanniTracker<Data>(name, createNewSession, getStorage, drawDisplay) {
+
+ fun addCoins(coins: Int) {
+ addItem(ItemTrackerData.SKYBLOCK_COIN, coins)
+ }
+
+ fun addItem(internalName: NEUInternalName, stackSize: Int) {
+ modify {
+ it.additem(internalName, stackSize)
+ }
+ }
+
+ fun addPriceFromButton(lists: MutableList<List<Any>>) {
+ if (isInventoryOpen()) {
+ lists.addSelector<PriceSource>(
+ "",
+ getName = { type -> type.displayName },
+ isCurrent = { it.ordinal == config.priceFrom },
+ onChange = {
+ config.priceFrom = it.ordinal
+ update()
+ }
+ )
+ }
+
+ }
+}
diff --git a/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt
index 29b61faee..3d68b8316 100644
--- a/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt
+++ b/src/main/java/at/hannibal2/skyhanni/utils/tracker/SkyHanniTracker.kt
@@ -4,9 +4,13 @@ import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.Storage
import at.hannibal2.skyhanni.config.core.config.Position
import at.hannibal2.skyhanni.data.ProfileStorageData
+import at.hannibal2.skyhanni.features.bazaar.BazaarApi.Companion.getBazaarData
import at.hannibal2.skyhanni.features.misc.items.EstimatedItemValue
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.LorenzUtils.addAsSingletonList
+import at.hannibal2.skyhanni.utils.NEUInternalName
+import at.hannibal2.skyhanni.utils.NEUItems.getNpcPriceOrNull
+import at.hannibal2.skyhanni.utils.NEUItems.getPriceOrNull
import at.hannibal2.skyhanni.utils.RenderUtils.renderStringsAndItems
import at.hannibal2.skyhanni.utils.SimpleTimeMark
import at.hannibal2.skyhanni.utils.renderables.Renderable
@@ -14,7 +18,7 @@ import net.minecraft.client.Minecraft
import net.minecraft.client.gui.inventory.GuiInventory
import kotlin.time.Duration.Companion.seconds
-class SkyHanniTracker<Data : TrackerData>(
+open class SkyHanniTracker<Data : TrackerData>(
private val name: String,
private val createNewSession: () -> Data,
private val getStorage: (Storage.ProfileSpecific) -> Data,
@@ -28,8 +32,15 @@ class SkyHanniTracker<Data : TrackerData>(
private var dirty = false
companion object {
- private val config get() = SkyHanniMod.feature.misc.tracker
+ val config get() = SkyHanniMod.feature.misc.tracker
private val storedTrackers get() = SkyHanniMod.feature.storage.trackerDisplayModes
+
+ fun getPricePer(name: NEUInternalName) = when (config.priceFrom) {
+ 0 -> name.getBazaarData()?.sellPrice ?: name.getPriceOrNull() ?: 0.0
+ 1 -> name.getBazaarData()?.buyPrice ?: name.getPriceOrNull() ?: 0.0
+
+ else -> name.getNpcPriceOrNull() ?: 0.0
+ }
}
fun isInventoryOpen() = inventoryOpen