summaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/features/event/diana/MythologicalCreatureTracker.kt
blob: 55e422caba5f3bf0d068dcb35ce87c4db625707e (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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package at.hannibal2.skyhanni.features.event.diana

import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.data.MayorAPI.getElectionYear
import at.hannibal2.skyhanni.events.ConfigLoadEvent
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.features.event.diana.DianaAPI.isDianaSpade
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.CollectionUtils.addOrPut
import at.hannibal2.skyhanni.utils.CollectionUtils.addSearchString
import at.hannibal2.skyhanni.utils.CollectionUtils.sumAllValues
import at.hannibal2.skyhanni.utils.ConditionalUtils
import at.hannibal2.skyhanni.utils.InventoryUtils
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.NumberUtil.addSeparators
import at.hannibal2.skyhanni.utils.RegexUtils.matches
import at.hannibal2.skyhanni.utils.SimpleTimeMark
import at.hannibal2.skyhanni.utils.SkyBlockTime
import at.hannibal2.skyhanni.utils.renderables.Searchable
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import at.hannibal2.skyhanni.utils.tracker.SkyHanniTracker
import at.hannibal2.skyhanni.utils.tracker.TrackerData
import com.google.gson.annotations.Expose
import net.minecraft.util.ChatComponentText
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import java.util.regex.Pattern

@SkyHanniModule
object MythologicalCreatureTracker {

    private val config get() = SkyHanniMod.feature.event.diana.mythologicalMobtracker

    private val patternGroup = RepoPattern.group("event.diana.mythological.tracker")
    private val minotaurPattern by patternGroup.pattern(
        "minotaur",
        ".* §r§eYou dug out a §r§2Minotaur§r§e!",
    )
    private val gaiaConstructPattern by patternGroup.pattern(
        "gaiaconstruct",
        ".* §r§eYou dug out a §r§2Gaia Construct§r§e!",
    )
    private val minosChampionPattern by patternGroup.pattern(
        "minoschampion",
        ".* §r§eYou dug out a §r§2Minos Champion§r§e!",
    )
    private val siameseLynxesPattern by patternGroup.pattern(
        "siameselynxes",
        ".* §r§eYou dug out §r§2Siamese Lynxes§r§e!",
    )
    private val minosHunterPattern by patternGroup.pattern(
        "minoshunter",
        ".* §r§eYou dug out a §r§2Minos Hunter§r§e!",
    )
    private val minosInquisitorPattern by patternGroup.pattern(
        "minosinquisitor",
        ".* §r§eYou dug out a §r§2Minos Inquisitor§r§e!",
    )

    private val tracker = SkyHanniTracker(
        "Mythological Creature Tracker", { Data() }, { it.diana.mythologicalMobTracker },
        SkyHanniTracker.DisplayMode.MAYOR to {
            it.diana.mythologicalMobTrackerPerElectionSeason.getOrPut(
                SkyBlockTime.now().getElectionYear(), ::Data,
            )
        },
    ) { drawDisplay(it) }

    class Data : TrackerData() {

        override fun reset() {
            count.clear()
            creaturesSinceLastInquisitor = 0
        }

        @Expose
        var creaturesSinceLastInquisitor: Int = 0

        @Expose
        var count: MutableMap<MythologicalCreatureType, Int> = mutableMapOf()
    }

    enum class MythologicalCreatureType(val displayName: String, val pattern: Pattern) {
        MINOTAUR("§2Minotaur", minotaurPattern),
        GAIA_CONSTRUCT("§2Gaia Construct", gaiaConstructPattern),
        MINOS_CHAMPION("§2Minos Champion", minosChampionPattern),
        SIAMESE_LYNXES("§2Siamese Lynxes", siameseLynxesPattern),
        MINOS_HUNTER("§2Minos Hunter", minosHunterPattern),
        MINOS_INQUISITOR("§cMinos Inquisitor", minosInquisitorPattern),
    }

    @SubscribeEvent
    fun onChat(event: LorenzChatEvent) {
        for (creatureType in MythologicalCreatureType.entries) {
            if (!creatureType.pattern.matches(event.message)) continue
            BurrowAPI.lastBurrowRelatedChatMessage = SimpleTimeMark.now()
            tracker.modify {
                it.count.addOrPut(creatureType, 1)

                // TODO migrate to abstract feature in the future
                if (creatureType == MythologicalCreatureType.MINOS_INQUISITOR) {
                    event.chatComponent = ChatComponentText(event.message + " §e(${it.creaturesSinceLastInquisitor})")
                    it.creaturesSinceLastInquisitor = 0
                } else it.creaturesSinceLastInquisitor++
            }
            if (config.hideChat) event.blockedReason = "mythological_creature_dug"
        }
    }

    private fun drawDisplay(data: Data): List<Searchable> = buildList {
        addSearchString("§7Mythological Creature Tracker:")
        val total = data.count.sumAllValues()
        for ((creatureType, amount) in data.count.entries.sortedByDescending { it.value }) {
            val percentageSuffix = if (config.showPercentage.get()) {
                val percentage = LorenzUtils.formatPercentage(amount.toDouble() / total)
                " §7$percentage"
            } else ""

            addSearchString(
                " §7- §e${amount.addSeparators()} ${creatureType.displayName}$percentageSuffix",
                searchText = creatureType.displayName,
            )
        }
        addSearchString(" §7- §e${total.addSeparators()} §7Total Mythological Creatures")
        addSearchString(" §7- §e${data.creaturesSinceLastInquisitor.addSeparators()} §7Creatures since last Minos Inquisitor")
    }

    @SubscribeEvent
    fun onConfigLoad(event: ConfigLoadEvent) {
        ConditionalUtils.onToggle(config.showPercentage) {
            tracker.update()
        }
    }

    @SubscribeEvent
    fun onRenderOverlay(event: GuiRenderEvent) {
        if (!LorenzUtils.inSkyBlock) return
        if (!config.enabled) return
        val spadeInHand = InventoryUtils.getItemInHand()?.isDianaSpade ?: false
        if (!DianaAPI.isDoingDiana() && !spadeInHand) return
        if (spadeInHand) {
            tracker.firstUpdate()
        }

        tracker.renderDisplay(config.position)
    }

    fun resetCommand() {
        tracker.resetCommand()
    }

}