aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/github/moulberry/notenoughupdates/util/HotmInformation.kt
blob: 2d87a5713264f803ad554816823ea4773fee63f8 (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
/*
 * Copyright (C) 2023 NotEnoughUpdates contributors
 *
 * This file is part of NotEnoughUpdates.
 *
 * NotEnoughUpdates is free software: you can redistribute it
 * and/or modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation, either
 * version 3 of the License, or (at your option) any later version.
 *
 * NotEnoughUpdates is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with NotEnoughUpdates. If not, see <https://www.gnu.org/licenses/>.
 */

package io.github.moulberry.notenoughupdates.util

import io.github.moulberry.notenoughupdates.NotEnoughUpdates
import io.github.moulberry.notenoughupdates.autosubscribe.NEUAutoSubscribe
import io.github.moulberry.notenoughupdates.core.util.StringUtils
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.inventory.GuiChest
import net.minecraft.inventory.ContainerChest
import net.minecraftforge.client.event.GuiOpenEvent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import net.minecraftforge.fml.common.gameevent.TickEvent
import java.util.regex.Pattern

@NEUAutoSubscribe
class HotmInformation {
    private var ticksTillReload = 0
    private val pattern = Pattern.compile("§[7b]Level (\\d*)(?:§8/.*)?")

    @SubscribeEvent
    fun onGuiOpen(event: GuiOpenEvent) {
        val gui = event.gui
        if (gui !is GuiChest) return

        if (Utils.getOpenChestName() == "Heart of the Mountain") {
            ticksTillReload = 5
        }
    }

    @SubscribeEvent
    fun onTick(event: TickEvent.ClientTickEvent) {
        if (event.phase != TickEvent.Phase.START) return
        if (ticksTillReload == 0) return
        ticksTillReload--
        if (ticksTillReload == 0) {
            loadDataFromInventory()
        }
    }

    private fun loadDataFromInventory() {
        val profileSpecific = NotEnoughUpdates.INSTANCE.config.profileSpecific ?: return
        val currentScreen = Minecraft.getMinecraft().currentScreen
        if (currentScreen !is GuiChest) {
            return
        }
        val container = currentScreen.inventorySlots as ContainerChest
        for (i in 0 until container.lowerChestInventory.sizeInventory) {
            val stack = container.lowerChestInventory.getStackInSlot(i) ?: continue
            val displayName = ItemUtils.getDisplayName(stack) ?: continue
            val lore = ItemUtils.getLore(stack)
            if (!lore.any { it.contains("Right-click to") }) continue

            val perkName = StringUtils.cleanColour(displayName)
            profileSpecific.hotmTree[perkName] = getLevel(lore[0])
        }
    }

    private fun getLevel(string: String): Int {
        val matcher = pattern.matcher(string)
        val level = if (matcher.matches()) matcher.group(1).toInt() else 1

        val withBlueCheeseGoblinOmelette = string.contains("§b")
        val isNotMaxed = string.contains("§8/")
        return if (withBlueCheeseGoblinOmelette && (isNotMaxed || level > 1)) level - 1 else level
    }

    companion object {
        private val QUICK_FORGE_MULTIPLIERS = intArrayOf(
            985,
            970,
            955,
            940,
            925,
            910,
            895,
            880,
            865,
            850,
            845,
            840,
            835,
            830,
            825,
            820,
            815,
            810,
            805,
            700
        )

        /*
         * 1000 = 100% of the time left
         *  700 = 70% of the time left
         * */
        @JvmStatic
        fun getQuickForgeMultiplier(level: Int): Int {
            if (level <= 0) return 1000
            return if (level > 20) -1 else QUICK_FORGE_MULTIPLIERS[level - 1]
        }
    }
}