blob: 7e436eb3678cd1d0d83f66b5bb1d51a4c446a739 (
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
|
package at.hannibal2.skyhanni.features.dungeon
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.config.ConfigUpdaterMigrator
import at.hannibal2.skyhanni.events.CheckRenderEntityEvent
import at.hannibal2.skyhanni.events.DamageIndicatorFinalBossEvent
import at.hannibal2.skyhanni.events.EntityHealthUpdateEvent
import at.hannibal2.skyhanni.events.LorenzChatEvent
import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent
import at.hannibal2.skyhanni.events.PlaySoundEvent
import at.hannibal2.skyhanni.events.ReceiveParticleEvent
import at.hannibal2.skyhanni.utils.ChatUtils
import at.hannibal2.skyhanni.utils.LorenzUtils
import at.hannibal2.skyhanni.utils.StringUtils.matchMatcher
import at.hannibal2.skyhanni.utils.repopatterns.RepoPattern
import net.minecraft.client.Minecraft
import net.minecraft.client.entity.EntityOtherPlayerMP
import net.minecraft.entity.item.EntityArmorStand
import net.minecraft.entity.monster.EntityGuardian
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
class DungeonCleanEnd {
private val config get() = SkyHanniMod.feature.dungeon.cleanEnd
private val catacombsPattern by RepoPattern.pattern(
"dungeon.end.chests.spawned",
"(?:§f)?( *)§r§c(The|Master Mode) Catacombs §r§8- §r§eFloor (.*)"
)
private var bossDone = false
private var chestsSpawned = false
private var lastBossId: Int = -1
@SubscribeEvent
fun onChat(event: LorenzChatEvent) {
if (!LorenzUtils.inDungeons) return
if (!config.enabled) return
val message = event.message
catacombsPattern.matchMatcher(message) {
chestsSpawned = true
}
}
private fun shouldBlock(): Boolean {
if (!LorenzUtils.inDungeons) return false
if (!config.enabled) return false
if (!bossDone) return false
return true
}
@SubscribeEvent
fun onWorldChange(event: LorenzWorldChangeEvent) {
bossDone = false
chestsSpawned = false
lastBossId = -1
}
@SubscribeEvent
fun onBossDead(event: DamageIndicatorFinalBossEvent) {
if (!LorenzUtils.inDungeons) return
if (bossDone) return
if (lastBossId == -1) {
lastBossId = event.id
}
}
@SubscribeEvent
fun onEntityHealthUpdate(event: EntityHealthUpdateEvent) {
if (!LorenzUtils.inDungeons) return
if (!config.enabled) return
if (bossDone) return
if (lastBossId == -1) return
if (event.entity.entityId != lastBossId) return
if (event.health <= 0.5) {
val dungeonFloor = DungeonAPI.dungeonFloor
ChatUtils.chat("§eFloor $dungeonFloor done!", false)
bossDone = true
}
}
@SubscribeEvent
fun onCheckRender(event: CheckRenderEntityEvent<*>) {
if (!shouldBlock()) return
val entity = event.entity
if (entity == Minecraft.getMinecraft().thePlayer) return
if (config.F3IgnoreGuardians
&& DungeonAPI.isOneOf("F3", "M3")
&& entity is EntityGuardian
&& entity.entityId != lastBossId
&& Minecraft.getMinecraft().thePlayer.isSneaking
) {
return
}
if (chestsSpawned && ((entity is EntityArmorStand && !entity.hasCustomName()) || entity is EntityOtherPlayerMP)) {
return
}
event.isCanceled = true
}
@SubscribeEvent
fun onPlayParticle(event: ReceiveParticleEvent) {
if (shouldBlock()) {
event.isCanceled = true
}
}
@SubscribeEvent
fun onPlaySound(event: PlaySoundEvent) {
if (shouldBlock() && !chestsSpawned && event.soundName.startsWith("note.")) {
event.isCanceled = true
}
}
@SubscribeEvent
fun onConfigFix(event: ConfigUpdaterMigrator.ConfigFixEvent) {
event.move(3, "dungeon.cleanEndToggle", "dungeon.cleanEnd.enabled")
event.move(3, "dungeon.cleanEndF3IgnoreGuardians", "dungeon.cleanEnd.F3IgnoreGuardians")
}
}
|