package pers.neige.neigeitems.ref.entity;

import org.inksnow.ankhinvoke.comments.HandleBy;
import pers.neige.neigeitems.ref.block.RefBlock;

@HandleBy(reference = "net/minecraft/world/entity/EntityType$Builder", predicates = "craftbukkit_version:[v1_17_R1,)")
@HandleBy(reference = "net/minecraft/server/v1_13_R1/EntityTypes$a", predicates = "craftbukkit_version:[v1_13_R1,v1_17_R1)")
public class RefEntityTypesBuilder<T extends RefEntity> { //    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityTypes$Builder;a(Lnet/minecraft/world/entity/EntityTypes$b;Lnet/minecraft/world/entity/EnumCreatureType;)Lnet/minecraft/world/entity/EntityTypes$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;of(Lnet/minecraft/world/entity/EntityType$EntityFactory;Lnet/minecraft/world/entity/MobCategory;)Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native static <T extends RefEntity> RefEntityTypesBuilder<T> of(RefEntityTypesFactory<T> factory, RefMobCategory spawnGroup);

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;createNothing(Lnet/minecraft/world/entity/MobCategory;)Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native static <T extends RefEntity> RefEntityTypesBuilder<T> createNothing(RefMobCategory spawnGroup);

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;sized(FF)Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntityTypesBuilder<T> sized(float width, float height);

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;noSummon()Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntityTypesBuilder<T> noSummon();

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;noSave()Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntityTypesBuilder<T> noSave();

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;fireImmune()Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntityTypesBuilder<T> fireImmune();

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;immuneTo([Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntityTypesBuilder<T> immuneTo(RefBlock... blocks);

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;canSpawnFarFromPlayer()Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntityTypesBuilder<T> canSpawnFarFromPlayer();

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;clientTrackingRange(I)Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntityTypesBuilder<T> clientTrackingRange(int maxTrackingRange);

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;updateInterval(I)Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntityTypesBuilder<T> updateInterval(int trackingTickInterval);

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;requiredFeatures([Lnet/minecraft/world/flag/FeatureFlag;)Lnet/minecraft/world/entity/EntityType$Builder;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntityTypesBuilder<T> requiredFeatures(RefFeatureFlag... features);

    @HandleBy(reference = "Lnet/minecraft/world/entity/EntityType$Builder;build(Ljava/lang/String;)Lnet/minecraft/world/entity/EntityType;", predicates = "craftbukkit_version:[v1_17_R1,)")
    public native RefEntityType<T> build(String id);
}
