aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/features/inventory/ItemRarityCosmetics.kt
blob: 424f13b2ed925376f1a5ead93652e854948ae71a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package moe.nea.firmament.features.inventory

import java.awt.Color
import net.minecraft.client.gui.DrawContext
import net.minecraft.item.ItemStack
import net.minecraft.util.Formatting
import net.minecraft.util.Identifier
import moe.nea.firmament.annotations.Subscribe
import moe.nea.firmament.events.HotbarItemRenderEvent
import moe.nea.firmament.events.SlotRenderEvents
import moe.nea.firmament.features.FirmamentFeature
import moe.nea.firmament.gui.config.ManagedConfig
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.mc.loreAccordingToNbt
import moe.nea.firmament.util.collections.lastNotNullOfOrNull
import moe.nea.firmament.util.collections.memoizeIdentity
import moe.nea.firmament.util.unformattedString

object ItemRarityCosmetics : FirmamentFeature {
    override val identifier: String
        get() = "item-rarity-cosmetics"

    object TConfig : ManagedConfig(identifier) {
        val showItemRarityBackground by toggle("background") { false }
        val showItemRarityInHotbar by toggle("background-hotbar") { false }
    }

    override val config: ManagedConfig
        get() = TConfig

    private val rarityToColor = mapOf(
        "UNCOMMON" to Formatting.GREEN,
        "COMMON" to Formatting.WHITE,
        "RARE" to Formatting.DARK_BLUE,
        "EPIC" to Formatting.DARK_PURPLE,
        "LEGENDARY" to Formatting.GOLD,
        "LEGENJERRY" to Formatting.GOLD,
        "MYTHIC" to Formatting.LIGHT_PURPLE,
        "DIVINE" to Formatting.BLUE,
        "SPECIAL" to Formatting.DARK_RED,
        "SUPREME" to Formatting.DARK_RED,
    ).mapValues {
        val c = Color(it.value.colorValue!!)
        Triple(c.red / 255F, c.green / 255F, c.blue / 255F)
    }

    private fun getSkyblockRarity0(itemStack: ItemStack): Triple<Float, Float, Float>? {
        return itemStack.loreAccordingToNbt.lastNotNullOfOrNull {
            val entry = it.unformattedString
            rarityToColor.entries.find { (k, v) -> k in entry }?.value
        }
    }

    val getSkyblockRarity = ::getSkyblockRarity0.memoizeIdentity(100)


    fun drawItemStackRarity(drawContext: DrawContext, x: Int, y: Int, item: ItemStack) {
        val (r, g, b) = getSkyblockRarity(item) ?: return
        drawContext.drawSprite(
            x, y,
            0,
            16, 16,
            MC.guiAtlasManager.getSprite(Identifier.of("firmament:item_rarity_background")),
            r, g, b, 1F
        )
    }


    @Subscribe
    fun onRenderSlot(it: SlotRenderEvents.Before) {
        if (!TConfig.showItemRarityBackground) return
        val stack = it.slot.stack ?: return
        drawItemStackRarity(it.context, it.slot.x, it.slot.y, stack)
    }

    @Subscribe
    fun onRenderHotbarItem(it: HotbarItemRenderEvent) {
        if (!TConfig.showItemRarityInHotbar) return
        val stack = it.item
        drawItemStackRarity(it.context, it.x, it.y, stack)
    }
}