blob: 230e80dd2ed2934c37cb28e4bcbcf2389536a99b (
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
|
package at.hannibal2.skyhanni.features.dungeon
import at.hannibal2.skyhanni.data.ScoreboardData
import at.hannibal2.skyhanni.events.DungeonBossRoomEnterEvent
import at.hannibal2.skyhanni.events.DungeonEnterEvent
import at.hannibal2.skyhanni.events.DungeonStartEvent
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher
import at.hannibal2.skyhanni.utils.StringUtils.removeColor
import net.minecraftforge.event.world.WorldEvent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
import net.minecraftforge.fml.common.gameevent.TickEvent
class DungeonData {
private val floorPattern = " §7⏣ §cThe Catacombs §7\\((?<floor>.*)\\)".toPattern()
companion object {
var dungeonFloor: String? = null
var inBossRoom = false
var started = false
fun inDungeon() = dungeonFloor != null
fun isOneOf(vararg floors: String): Boolean {
for (floor in floors) {
if (dungeonFloor == floor) {
return true
}
}
return false
}
fun handleBossMessage(rawMessage: String) {
if (!inDungeon()) return
val message = rawMessage.removeColor()
val bossName = message.substringAfter("[BOSS] ").substringBefore(":").trim()
if (bossName != "The Watcher" && dungeonFloor != null && checkBossName(dungeonFloor!!, bossName)) {
if (!inBossRoom) {
DungeonBossRoomEnterEvent().postAndCatch()
inBossRoom = true
}
}
}
private fun checkBossName(floor: String, bossName: String): Boolean {
val correctBoss = when (floor) {
"E" -> "The Watcher"
"F1", "M1" -> "Bonzo"
"F2", "M2" -> "Scarf"
"F3", "M3" -> "The Professor"
"F4", "M4" -> "Thorn"
"F5", "M5" -> "Livid"
"F6", "M6" -> "Sadan"
"F7", "M7" -> "Maxor"
else -> null
} ?: return false
// Livid has a prefix in front of the name, so we check ends with to cover all the livids
return bossName.endsWith(correctBoss)
}
}
@SubscribeEvent
fun onTick(event: TickEvent.ClientTickEvent) {
if (event.phase != TickEvent.Phase.START) return
if (dungeonFloor == null) {
for (line in ScoreboardData.sidebarLinesFormatted) {
floorPattern.matchMatcher(line) {
val floor = group("floor")
dungeonFloor = floor
DungeonEnterEvent(floor).postAndCatch()
}
}
}
}
@SubscribeEvent
fun onWorldChange(event: WorldEvent.Load) {
dungeonFloor = null
started = false
inBossRoom = false
}
@SubscribeEvent
fun onChatMessage(event: LorenzChatEvent) {
val floor = dungeonFloor
if (floor != null) {
if (event.message == "§e[NPC] §bMort§f: §rHere, I found this map when I first entered the dungeon.") {
started = true
DungeonStartEvent(floor).postAndCatch()
}
}
}
}
|