diff options
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/utils/tracker')
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 |
