summaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features/inventory/ItemStars.kt
blob: 8e2a5c5927e53154c809346872fa8d1bdf57c48e (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package at.hannibal2.skyhanni.features.inventory

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.features.inventory.InventoryConfig.ItemNumberEntry.CRIMSON_ARMOR
import at.hannibal2.skyhanni.data.jsonobjects.repo.ItemsJson
import at.hannibal2.skyhanni.events.LorenzToolTipEvent
import at.hannibal2.skyhanni.events.RenderItemTipEvent
import at.hannibal2.skyhanni.events.RepositoryReloadEvent
import at.hannibal2.skyhanni.features.inventory.ItemDisplayOverlayFeatures.isSelected
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.ItemUtils.name
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.RegexUtils.matches
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraftforge.fml.common.eventhandler.EventPriority
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

@SkyHanniModule
object ItemStars {

    private val config get() = SkyHanniMod.feature.inventory

    private val starPattern by RepoPattern.pattern(
        "inventory.itemstars.stars",
        "(.*)§.✪(.*)"
    )

    private val armorNames = mutableListOf<String>()
    private val tiers = mutableMapOf<String, Int>()
    private val armorParts = listOf("Helmet", "Chestplate", "Leggings", "Boots")

    @SubscribeEvent(priority = EventPriority.LOW)
    fun onTooltip(event: LorenzToolTipEvent) {
        if (!isEnabled()) return
        val stack = event.itemStack ?: return
        if (stack.stackSize != 1) return

        val itemName = stack.name
        val stars = getStars(itemName)

        if (stars > 0) {
            var name = itemName
            while (starPattern.matches(name)) {
                name = name.replaceFirst("§.✪".toRegex(), "")
            }
            name = name.trim()
            event.toolTip[0] = "$name §c$stars✪"
        }
    }

    @SubscribeEvent
    fun onRepoReload(event: RepositoryReloadEvent) {
        val data = event.getConstant<ItemsJson>("Items")
        armorNames.clear()
        tiers.clear()
        armorNames.addAll(data.crimsonArmors)
        for (tier in data.crimsonTiers) {
            tiers[tier.key] = tier.value
        }
    }

    @SubscribeEvent
    fun onRenderItemTip(event: RenderItemTipEvent) {
        if (!CRIMSON_ARMOR.isSelected()) return
        val stack = event.stack
        val number = getCrimsonStars(stack.name)
        if (number != -1) {
            event.stackTip = number.toString()
        }
    }

    private fun getStars(name: String): Int {
        val stars = getCrimsonStars(name)
        if (stars != -1) {
            return stars
        }

        return getOtherStars(name)
    }

    private fun getCrimsonStars(name: String): Int {
        if (!armorNames.any { name.contains(it) } || !armorParts.any { name.contains(it) }) {
            return -1
        }
        var name1 = name
        var gold = 0
        var pink = 0
        var aqua = 0
        while (name1.contains("§6✪")) {
            name1 = name1.replaceFirst("§6✪", "")
            gold++
        }
        while (name1.contains("§d✪")) {
            name1 = name1.replaceFirst("§d✪", "")
            pink++
        }
        while (name1.contains("§b✪")) {
            name1 = name1.replaceFirst("§b✪", "")
            aqua++
        }
        return (tiers.entries.find { name1.contains(it.key) }?.value ?: 0) + if (aqua > 0) {
            10 + aqua
        } else if (pink > 0) {
            5 + pink
        } else {
            gold
        }
    }

    private fun getOtherStars(originalName: String): Int {
        var name = originalName

        var gold = 0
        var red = 0
        while (name.contains("§6✪")) {
            name = name.replaceFirst("§6✪", "")
            gold++
        }
        while (name.contains("§c✪")) {
            name = name.replaceFirst("§c✪", "")
            red++
        }
        while (name.contains("§d✪")) {
            name = name.replaceFirst("§d✪", "")
            red++
        }

        if (red > 0) return 5 + red
        if (gold > 0) return gold

        return -1
    }

    private fun isEnabled() = LorenzUtils.inSkyBlock && config.itemStars
}