diff options
Diffstat (limited to 'src/main/java/at/hannibal2/skyhanni/data')
-rw-r--r-- | src/main/java/at/hannibal2/skyhanni/data/EntityData.kt | 84 |
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 |