package at.hannibal2.skyhanni.events

import net.minecraft.client.renderer.entity.RendererLivingEntity
import net.minecraft.entity.EntityLivingBase
import net.minecraftforge.fml.common.eventhandler.Cancelable

@Cancelable
open class SkyHanniRenderEntityEvent<T : EntityLivingBase>(
    val entity: T,
    val renderer: RendererLivingEntity<out T>,
    val x: Double,
    val y: Double,
    val z: Double
) : LorenzEvent() {
    class Pre<T : EntityLivingBase>(
        entity: T,
        renderer: RendererLivingEntity<out T>,
        x: Double,
        y: Double,
        z: Double
    ) : SkyHanniRenderEntityEvent<T>(entity, renderer, x, y, z)

    class Post<T : EntityLivingBase>(
        entity: T,
        renderer: RendererLivingEntity<out T>,
        x: Double,
        y: Double,
        z: Double
    ) : SkyHanniRenderEntityEvent<T>(entity, renderer, x, y, z)

    open class Specials<T : EntityLivingBase>(
        entity: T,
        renderer: RendererLivingEntity<out T>,
        x: Double,
        y: Double,
        z: Double
    ) : SkyHanniRenderEntityEvent<T>(entity, renderer, x, y, z) {
        class Pre<T : EntityLivingBase>(
            entity: T,
            renderer: RendererLivingEntity<out T>,
            x: Double,
            y: Double,
            z: Double
        ) : Specials<T>(entity, renderer, x, y, z)

        class Post<T : EntityLivingBase>(
            entity: T,
            renderer: RendererLivingEntity<out T>,
            x: Double,
            y: Double,
            z: Double
        ) : Specials<T>(entity, renderer, x, y, z)
    }
}