aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/at/hannibal2/skyhanni/data
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/data')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/data/EntityData.kt84
1 files changed, 62 insertions, 22 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/data/EntityData.kt b/src/main/java/at/hannibal2/skyhanni/data/EntityData.kt
index f306bcdf8..c57119818 100644
--- a/src/main/java/at/hannibal2/skyhanni/data/EntityData.kt
+++ b/src/main/java/at/hannibal2/skyhanni/data/EntityData.kt
@@ -1,46 +1,86 @@
package at.hannibal2.skyhanni.data
import at.hannibal2.skyhanni.events.EntityHealthUpdateEvent
+import at.hannibal2.skyhanni.events.EntityMaxHealthUpdateEvent
import at.hannibal2.skyhanni.events.PacketEvent
-import at.hannibal2.skyhanni.utils.LorenzUtils
+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.event.world.WorldEvent
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import net.minecraftforge.fml.common.gameevent.TickEvent
class EntityData {
+ private val maxHealthMap = mutableMapOf<EntityLivingBase, Int>()
+
+ @SubscribeEvent
+ fun onTick(event: TickEvent.ClientTickEvent) {
+ if (event.phase != TickEvent.Phase.START) return
+
+ val minecraft = Minecraft.getMinecraft() ?: return
+ val theWorld = minecraft.theWorld ?: return
+ for (entity in theWorld.loadedEntityList) {
+ if (entity !is EntityLivingBase) continue
+
+ val maxHealth = entity.baseMaxHealth
+ val oldMaxHealth = maxHealthMap.getOrDefault(entity, -1)
+ if (oldMaxHealth != maxHealth) {
+ maxHealthMap[entity] = maxHealth
+ EntityMaxHealthUpdateEvent(entity, maxHealth).postAndCatch()
+ }
+ }
+ }
+
+ @SubscribeEvent
+ fun onWorldChange(event: WorldEvent.Load) {
+ maxHealthMap.clear()
+ }
+
@SubscribeEvent
fun onHealthUpdatePacket(event: PacketEvent.ReceiveEvent) {
val packet = event.packet
- if (packet !is S1CPacketEntityMetadata) return
- if (packet == null) {
- LorenzUtils.debug("packet is null in EntityData!")
- return
- }
+ 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) {
- if (watchableObject.dataValueId != 6) continue
- val theWorld = Minecraft.getMinecraft().theWorld
- if (theWorld == null) {
- LorenzUtils.debug("theWorld is null in EntityData!")
- continue
- }
- val entityId = packet.entityId
- if (entityId == null) {
- LorenzUtils.debug("entityId is null in EntityData!")
- continue
- }
+ val dataValueId = watchableObject.dataValueId
+ val any = watchableObject.`object`
+ if (dataValueId != 6) continue
- val entity = theWorld.getEntityByID(entityId) ?: continue
- if (entity !is EntityLivingBase) continue
+ val health = (any as Float).toInt()
- val health = watchableObject.`object` as Float
- EntityHealthUpdateEvent(entity, health).postAndCatch()
- return
+ if (entity is EntityWither) {
+ if (health == 300) {
+ if (entityId < 0) return
+ }
+ }
+
+ if (entity is EntityLivingBase) {
+ EntityHealthUpdateEvent(entity, health).postAndCatch()
+ }
}
}
} \ No newline at end of file