package net.minecraft.world.entity.ai.attributes;

import net.minecraft.nbt.NBTTagList;

import com.bergerkiller.bukkit.common.nbt.CommonTagList;

import com.bergerkiller.generated.net.minecraft.world.entity.ai.attributes.AttributeMapBaseHandle;
import com.bergerkiller.generated.net.minecraft.world.entity.ai.attributes.AttributeModifiableHandle;

class AttributeModifiable {
#if forge_nms_obfuscated
    public abstract void setValue:a(double value);
    public abstract double getValue:e();
#elseif version >= 1.18
    public abstract void setValue:setBaseValue(double value);
    public abstract double getValue:getBaseValue();
#else
    public abstract void setValue(double value);
    public abstract double getValue();
#endif
}

class AttributeMapBase {
#if version >= 1.18
    public (Set<AttributeModifiableHandle>) Set<AttributeModifiable> getAttributes:getDirtyAttributes();
    public (Collection<AttributeModifiableHandle>) Collection<AttributeModifiable> getSynchronizedAttributes:getSyncableAttributes();
#elseif version >= 1.16
    public (Set<AttributeModifiableHandle>) Set<AttributeModifiable> getAttributes();
    public (Collection<AttributeModifiableHandle>) Collection<AttributeModifiable> getSynchronizedAttributes:b();
#else
    public (Set<AttributeModifiableHandle>) Set<AttributeModifiable> getAttributes() {
        return ((AttributeMapServer) instance).getAttributes();
    }

    public (Collection<AttributeModifiableHandle>) Collection<AttributeModifiable> getSynchronizedAttributes() {
        return ((AttributeMapServer) instance).c();
    }
#endif

#if version >= 1.18
    public void loadFromNBT:load((CommonTagList) NBTTagList nbttaglist);
    public (CommonTagList) NBTTagList saveToNBT:save();
#elseif version >= 1.16
    public void loadFromNBT:a((CommonTagList) NBTTagList nbttaglist);
    public (CommonTagList) NBTTagList saveToNBT:c();
#else
    public void loadFromNBT((CommonTagList) NBTTagList nbttaglist) {
        GenericAttributes.a(instance, nbttaglist);
    }
    public (CommonTagList) NBTTagList saveToNBT() {
        return GenericAttributes.a(instance);
    }
#endif
}

class GenericAttributes {
    #bootstrap com.bergerkiller.bukkit.common.internal.CommonBootstrap.initServer();

#if version >= 1.16
    public static final (Object) AttributeBase FOLLOW_RANGE;
    public static final (Object) AttributeBase MOVEMENT_SPEED;
#elseif version >= 1.8.4
    public static final (Object) IAttribute FOLLOW_RANGE;
    public static final (Object) IAttribute MOVEMENT_SPEED;
#else
    public static final (Object) IAttribute FOLLOW_RANGE:b;
    public static final (Object) IAttribute MOVEMENT_SPEED:d;
#endif
}
