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
|
package at.hannibal2.skyhanni.features.mobs
import at.hannibal2.skyhanni.SkyHanniMod
import at.hannibal2.skyhanni.events.EntityMaxHealthUpdateEvent
import at.hannibal2.skyhanni.events.LorenzWorldChangeEvent
import at.hannibal2.skyhanni.events.withAlpha
import at.hannibal2.skyhanni.mixins.hooks.RenderLivingEntityHelper
import at.hannibal2.skyhanni.utils.*
import at.hannibal2.skyhanni.utils.EntityUtils.hasMaxHealth
import at.hannibal2.skyhanni.utils.RenderUtils.drawDynamicText
import net.minecraft.entity.EntityLiving
import net.minecraft.entity.monster.EntityBlaze
import net.minecraft.entity.monster.EntityEnderman
import net.minecraft.entity.monster.EntityZombie
import net.minecraft.entity.passive.EntityWolf
import net.minecraftforge.client.event.RenderWorldLastEvent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
class AreaMiniBossFeatures {
private var lastTime = 0L
private var miniBossType: AreaMiniBossType? = null
private var respawnCooldown = 11_000L
@SubscribeEvent
fun onEntityHealthUpdate(event: EntityMaxHealthUpdateEvent) {
if (!LorenzUtils.inSkyBlock) return
val entity = event.entity
val maxHealth = event.maxHealth
for (bossType in AreaMiniBossType.values()) {
if (!bossType.clazz.isInstance(entity)) continue
if (!entity.hasMaxHealth(bossType.health, false, maxHealth)) continue
miniBossType = bossType
val time = System.currentTimeMillis()
val diff = time - lastTime
if (diff in 5_000..20_000) {
respawnCooldown = diff
}
lastTime = time
if (SkyHanniMod.feature.mobs.areaBossHighlight) {
val color = bossType.color.toColor().withAlpha(bossType.colorOpacity)
RenderLivingEntityHelper.setEntityColor(entity, color)
{ SkyHanniMod.feature.mobs.areaBossHighlight }
RenderLivingEntityHelper.setNoHurtTime(entity) { SkyHanniMod.feature.mobs.areaBossHighlight }
}
// TODO add sound
}
}
@SubscribeEvent
fun onRenderWorld(event: RenderWorldLastEvent) {
if (!LorenzUtils.inSkyBlock) return
if (!SkyHanniMod.feature.mobs.areaBossRespawnTimer) return
miniBossType?.apply {
val time = getTime()
val playerLocation = LocationUtils.playerLocation()
spawnLocations.filter { it.distance(playerLocation) < 15 }
.forEach { event.drawDynamicText(it, time, 1.2, ignoreBlocks = false) }
}
}
private fun AreaMiniBossType.getTime(): String {
val duration = System.currentTimeMillis() - lastTime
val estimatedTime = respawnCooldown - duration % respawnCooldown
val format = TimeUtils.formatDuration(estimatedTime, showMilliSeconds = true)
return color.getChatColor() + format
}
@SubscribeEvent
fun onWorldChange(event: LorenzWorldChangeEvent) {
miniBossType = null
}
enum class AreaMiniBossType(
val clazz: Class<out EntityLiving>,
val health: Int,
val color: LorenzColor,
val colorOpacity: Int,
vararg val spawnLocations: LorenzVec
) {
GOLDEN_GHOUL(
EntityZombie::class.java, 45_000, LorenzColor.YELLOW, 127,
LorenzVec(-99.7, 39.0, -86.4),
LorenzVec(-128.5, 42.0, -138.5),
),
OLD_WOLF(
EntityWolf::class.java, 15_000, LorenzColor.GOLD, 60,
LorenzVec(-248.0, 123.0, 54.0),
LorenzVec(-256.7, 105.0, 75.7),
LorenzVec(-268.5, 90.0, 97.7),
LorenzVec(-258.1, 94.0, 75.5),
LorenzVec(-225.7, 92.0, 127.5),
),
VOIDLING_EXTREMIST(
EntityEnderman::class.java, 8_000_000, LorenzColor.LIGHT_PURPLE, 127,
LorenzVec(-591.1, 10.0, -304.0),
LorenzVec(-544.8, 21.0, -301.1),
LorenzVec(-593.5, 26.0, -328.7),
LorenzVec(-565.0, 41.0, -307.1),
LorenzVec(-573.2, 51.0, -353.4),
),
MILLENIA_AGED_BLAZE(
EntityBlaze::class.java, 30_000_000, LorenzColor.DARK_RED, 60,
LorenzVec(-292.5, 97.0, -999.7),
LorenzVec(-232.3, 77.0, -951.1),
LorenzVec(-304.1, 73.0, -952.9),
LorenzVec(-281.6, 82.0, -1010.7),
LorenzVec(-342.8, 86.0, -1035.2),
),
;
}
}
|