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() @SubscribeEvent fun onTick(event: LorenzTickEvent) { val entities = EntityUtils.getEntitiesOrNull() ?: 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() } } } }