blob: 0bc742198699f0debde5c9cef0f7bd34c9f4fb0a (
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
|
package at.hannibal2.skyhanni.data
import at.hannibal2.skyhanni.events.*
import at.hannibal2.skyhanni.utils.EntityUtils
import at.hannibal2.skyhanni.utils.LorenzUtils.baseMaxHealth
import net.minecraft.client.Minecraft
import net.minecraft.client.entity.EntityOtherPlayerMP
import net.minecraft.client.entity.EntityPlayerSP
import net.minecraft.entity.EntityLivingBase
import net.minecraft.entity.boss.EntityWither
import net.minecraft.entity.item.EntityArmorStand
import net.minecraft.entity.item.EntityItem
import net.minecraft.entity.item.EntityItemFrame
import net.minecraft.entity.item.EntityXPOrb
import net.minecraft.network.play.server.S1CPacketEntityMetadata
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
class EntityData {
private val maxHealthMap = mutableMapOf<EntityLivingBase, Int>()
@SubscribeEvent
fun onTick(event: LorenzTickEvent) {
val entities = EntityUtils.getEntitiesOrNull<EntityLivingBase>() ?: return
for (entity in entities) {
val maxHealth = entity.baseMaxHealth
val oldMaxHealth = maxHealthMap.getOrDefault(entity, -1)
if (oldMaxHealth != maxHealth) {
maxHealthMap[entity] = maxHealth
EntityMaxHealthUpdateEvent(entity, maxHealth).postAndCatch()
}
}
}
@SubscribeEvent
fun onWorldChange(event: LorenzWorldChangeEvent) {
maxHealthMap.clear()
}
@SubscribeEvent
fun onHealthUpdatePacket(event: PacketEvent.ReceiveEvent) {
val packet = event.packet
if (packet !is S1CPacketEntityMetadata) return
val watchableObjects = packet.func_149376_c() ?: return
val entityId = packet.entityId
val theWorld = Minecraft.getMinecraft().theWorld ?: return
val entity = theWorld.getEntityByID(entityId) ?: return
if (entity is EntityArmorStand) return
if (entity is EntityXPOrb) return
if (entity is EntityItem) return
if (entity is EntityItemFrame) return
if (entity is EntityOtherPlayerMP) return
if (entity is EntityPlayerSP) return
for (watchableObject in watchableObjects) {
val dataValueId = watchableObject.dataValueId
val any = watchableObject.`object`
if (dataValueId != 6) continue
val health = (any as Float).toInt()
if (entity is EntityWither) {
if (health == 300) {
if (entityId < 0) return
}
}
if (entity is EntityLivingBase) {
EntityHealthUpdateEvent(entity, health).postAndCatch()
}
}
}
}
|