summaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features/inventory/DojoRankDisplay.kt
blob: b259ee1f43d5f00a88d3d4872280a21ebb947440 (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
package at.hannibal2.skyhanni.features.inventory

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.data.IslandType
import at.hannibal2.skyhanni.data.jsonobjects.repo.BeltsJson
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.events.InventoryCloseEvent
import at.hannibal2.skyhanni.events.InventoryFullyOpenedEvent
import at.hannibal2.skyhanni.events.RepositoryReloadEvent
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.ItemUtils.getLore
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.LorenzUtils.isInIsland
import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators
import at.hannibal2.skyhanni.utils.RegexUtils.matchFirst
import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher
import at.hannibal2.skyhanni.utils.RenderUtils.renderStrings
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraft.item.ItemStack
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent

@SkyHanniModule
object DojoRankDisplay {

    private val config get() = SkyHanniMod.feature.crimsonIsle
    private var display = emptyList<String>()
    private val patternGroup = RepoPattern.group("inventory.dojo.rankdisplay")
    private val testNamePattern by patternGroup.pattern(
        "name",
        "(?<color>§\\w)Test of (?<name>.*)"
    )
    private val testRankPattern by patternGroup.pattern(
        "rank",
        "(?:§\\w)+Your Rank: (?<rank>§\\w.) §8\\((?<score>\\d+)\\)"
    )
    private var belts = mapOf<String, Int>()

    @SubscribeEvent
    fun onBackgroundDraw(event: GuiRenderEvent.ChestGuiOverlayRenderEvent) {
        if (!isEnabled()) return
        config.dojoRankDisplayPosition.renderStrings(display, posLabel = "Dojo Rank Display")
    }

    private fun drawDisplay(items: Collection<ItemStack>) = buildList {
        if (belts.isEmpty()) {
            // TODO make clickable
            add("§cUnable to get Belts data, please run /shupdaterepo")
            return@buildList
        }

        var totalScore = 0
        for (stack in items) {
            val name = stack.displayName ?: continue
            testNamePattern.matchMatcher(name) {
                val testColor = group("color")
                val testName = group("name")
                stack.getLore().matchFirst(testRankPattern) {
                    val rank = group("rank")
                    val score = group("score").toInt()
                    val color = if (score in 0..99) "§c" else "§a"
                    totalScore += score
                    add("$testColor$testName§f: $rank §7($color${score.addSeparators()}§7)")
                }
            }
        }

        val beltPoints = belts.toList()

        val currentBelt = beltPoints.lastOrNull { totalScore >= it.second } ?: beltPoints.first()
        val currentIndex = beltPoints.indexOf(currentBelt)
        val nextBelt = beltPoints.getOrNull(currentIndex + 1) ?: beltPoints.first()
        val pointsNeededForNextBelt = 0.coerceAtLeast(nextBelt.second.minus(totalScore))

        add("§7Total Score: §6${totalScore.addSeparators()} §7(§8${currentBelt.first}§7)")

        if (pointsNeededForNextBelt != 0)
            add("§7Points needed for ${nextBelt.first}§f: §6${pointsNeededForNextBelt.addSeparators()}")
    }

    @SubscribeEvent
    fun onInventoryOpen(event: InventoryFullyOpenedEvent) {
        if (!isEnabled()) return
        if (event.inventoryName != "Challenges") return
        display = drawDisplay(event.inventoryItems.values)
    }

    @SubscribeEvent
    fun onInventoryClose(event: InventoryCloseEvent) {
        display = emptyList()
    }

    @SubscribeEvent
    fun onRepoReload(event: RepositoryReloadEvent) {
        val data = event.getConstant<BeltsJson>("Belts")
        belts = data.belts
    }

    private fun isEnabled() =
        IslandType.CRIMSON_ISLE.isInIsland() && LorenzUtils.skyBlockArea == "Dojo" && config.showDojoRankDisplay
}