blob: 60ed3ed66503ca8cc6215567ee0b60b04d900ea3 (
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
|
package at.hannibal2.skyhanni.features.gui
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.data.ProfileStorageData
import at.hannibal2.skyhanni.events.GuiRenderEvent
import at.hannibal2.skyhanni.events.InventoryUpdatedEvent
import at.hannibal2.skyhanni.events.SecondPassedEvent
import at.hannibal2.skyhanni.skyhannimodule.SkyHanniModule
import at.hannibal2.skyhanni.utils.ItemUtils.getLore
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.RegexUtils.matchMatcher
import at.hannibal2.skyhanni.utils.RegexUtils.matches
import at.hannibal2.skyhanni.utils.RenderUtils.renderString
import at.hannibal2.skyhanni.utils.SimpleTimeMark
import at.hannibal2.skyhanni.utils.SimpleTimeMark.Companion.asTimeMark
import at.hannibal2.skyhanni.utils.TimeUtils
import at.hannibal2.skyhanni.utils.TimeUtils.format
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
@SkyHanniModule
object BeaconPower {
private val storage get() = ProfileStorageData.profileSpecific?.beaconPower
private val config get() = SkyHanniMod.feature.gui
private val group = RepoPattern.group("gui.beaconpower")
// TODO add regex tests
private val deactivatedPattern by group.pattern(
"deactivated",
"§7Beacon Deactivated §8- §cNo Power Remaining"
)
private val timeRemainingPattern by group.pattern(
"time",
"§7Power Remaining: §e(?<time>.+)"
)
private val boostedStatPattern by group.pattern(
"stat",
"§7Current Stat: (?<stat>.+)"
)
private val noBoostedStatPattern by group.pattern(
"nostat",
"TODO"
)
private var expiryTime: SimpleTimeMark
get() = storage?.beaconPowerExpiryTime?.asTimeMark() ?: SimpleTimeMark.farPast()
set(value) {
storage?.beaconPowerExpiryTime = value.toMillis()
}
private var stat: String?
get() = storage?.boostedStat
set(value) {
storage?.boostedStat = value
}
private var display: String? = null
private val BEACON_POWER_SLOT = 22
private val STATS_SLOT = 23
@SubscribeEvent
fun onInventoryUpdate(event: InventoryUpdatedEvent) {
if (!LorenzUtils.inSkyBlock) return
if (event.inventoryName != "Beacon") return
val items = event.inventoryItems
items[BEACON_POWER_SLOT]?.let { item ->
item.getLore().forEach {
if (deactivatedPattern.matches(it)) {
expiryTime = SimpleTimeMark.farPast()
return@let
}
timeRemainingPattern.matchMatcher(it) {
val duration = TimeUtils.getDuration(group("time"))
expiryTime = SimpleTimeMark.now() + duration
return@let
}
}
}
items[STATS_SLOT]?.let { item ->
item.getLore().forEach {
if (noBoostedStatPattern.matches(it)) {
stat = null
return@let
}
boostedStatPattern.matchMatcher(it) {
stat = group("stat")
return@let
}
}
}
}
@SubscribeEvent
fun onRenderOverlay(event: GuiRenderEvent.GuiOverlayRenderEvent) {
if (!isEnabled()) return
val string = display ?: return
config.beaconPowerPosition.renderString(string, posLabel = "Beacon Power")
}
@SubscribeEvent
fun onSecond(event: SecondPassedEvent) {
if (!isEnabled()) return
display = drawDisplay()
}
private fun drawDisplay(): String = buildString {
append("§eBeacon: ")
if (expiryTime.isInPast()) {
append("§cNot active")
} else {
append("§b${expiryTime.timeUntil().format(maxUnits = 2)}")
if (config.beaconPowerStat) append(" §7(${stat ?: "§cNo stat"}§7)")
}
}
private fun isEnabled() = LorenzUtils.inSkyBlock && config.beaconPower
}
|