package net.minecraft.world.entity.player;

import net.minecraft.core.BlockPosition;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.food.FoodMetaData;
import net.minecraft.world.inventory.Container;
import net.minecraft.world.inventory.InventoryEnderChest;

import com.bergerkiller.bukkit.common.bases.IntVector3;
import net.minecraft.network.syncher.DataWatcherObject;
import com.bergerkiller.bukkit.common.wrappers.DataWatcher;
import com.bergerkiller.bukkit.common.wrappers.DataWatcher.Key;
import com.bergerkiller.generated.com.mojang.authlib.GameProfileHandle;
import com.bergerkiller.generated.net.minecraft.world.inventory.ContainerHandle;

class EntityHuman extends net.minecraft.world.entity.EntityLiving {
    public (Object) PlayerInventory inventoryRaw:inventory;

#if version >= 1.17
    protected (Object) InventoryEnderChest enderChestRaw:enderChestInventory;
#elseif version >= 1.12
    protected (Object) InventoryEnderChest enderChestRaw:enderChest;
#else
    private (Object) InventoryEnderChest enderChestRaw:enderChest;
#endif

#if version >= 1.17
    public (ContainerHandle) Container activeContainer:containerMenu;
#else
    public (ContainerHandle) Container activeContainer;
#endif

    protected (Object) FoodMetaData foodDataRaw:foodData;

    // Bed position is datawatcher value on 1.14
    // Do we actually use this field?
    //#if version >= 1.9
    //    public (IntVector3) BlockPosition bedPosition;
    //#elseif version >= 1.8.3
    //    public (IntVector3) BlockPosition bedPosition:bx;
    //#else
    //    public (IntVector3) BlockPosition bedPosition:bv;
    //#endif

#if version >= 1.17
    public int sleepTicks:sleepCounter;
#else
    public int sleepTicks;
#endif

    public (com.bergerkiller.bukkit.common.wrappers.PlayerAbilities) PlayerAbilities abilities;

#if version >= 1.17
    public int expLevel:experienceLevel;
    public int expTotal:totalExperience;
    public float exp:experienceProgress;
#else
    public int expLevel;
    public int expTotal;
    public float exp;
#endif

#if version >= 1.17
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile;
#elseif version >= 1.16.2
    protected unknown int bG;
    protected unknown final float bH;
    private unknown int g;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bJ;
#elseif version >= 1.16
    protected unknown int bN;
    protected unknown final float bO;
    private unknown int g;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bQ;
#elseif version >= 1.15
    protected unknown int bO;
    protected unknown final float bP;
    private unknown int bS;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bT;
#elseif version >= 1.14.4
    protected unknown int bR;
    protected unknown final float bS;
    private unknown int bV;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bW;
#elseif version >= 1.14
    protected unknown int bR;
    protected unknown final float bS;
    private unknown int bU;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bV;
#elseif version >= 1.13
    protected unknown int bZ;
    protected unknown float ca;
    private unknown int g;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:h;
#elseif version >= 1.12
    protected unknown int bS;
    protected unknown float bT;
    private unknown int f;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:g;
#elseif version >= 1.11
    private unknown int h;
    protected unknown float bO;
    protected unknown float bP;
    private unknown int bR;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bS;
#elseif version >= 1.10.2
    private unknown int h;
    protected unknown float bP;
    protected unknown float bQ;
    private unknown int bS;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bT;
#elseif version >= 1.9.4
    private unknown int h;
    protected unknown float bO;
    protected unknown float bP;
    private unknown int bR;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bS;
#elseif version >= 1.9
    private unknown int h;
    protected unknown float bN;
    protected unknown float bO;
    private unknown int bQ;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bR;
#elseif version >= 1.8.3
    private unknown int f;
    private unknown ItemStack g;
    private unknown int h;
    protected unknown float bE;
    protected unknown float bF;
    private unknown int i;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bH;
#else
    private unknown int f;
    private unknown ItemStack g;
    private unknown int h;
    protected unknown float bC;
    protected unknown float bD;
    private unknown int i;
    private final (GameProfileHandle) com.mojang.authlib.GameProfile gameProfile:bF;
#endif

#if version >= 1.17
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION;

#elseif version >= 1.16.2
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:bi;

#elseif version >= 1.16
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:bp;

#elseif version >= 1.15
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:bq;

#elseif version >= 1.14
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:bt;

#elseif version >= 1.13
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:bx;

#elseif version >= 1.12
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:br;

#elseif version >= 1.11
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:bq;

#elseif version >= 1.10
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:br;

#elseif version >= 1.9.4
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:bq;

#elseif version >= 1.9
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:bp;
#else
    /* === MC 1.8.9: These constants do not exist == */
    protected static optional final (DataWatcher.Key<Byte>) DataWatcherObject<Byte> DATA_PLAYER_MODE_CUSTOMISATION:###;

#endif
    <code>
    public static final Key<Byte> DATA_PLAYER_MODE_CUSTOMISATION = Key.Type.BYTE.createKey(T.DATA_PLAYER_MODE_CUSTOMISATION, -1);
    public static final int DATA_CUSTOMISATION_FLAG_CAPE = (1 << 0);
    public static final int DATA_CUSTOMISATION_FLAG_JACKET = (1 << 1);
    public static final int DATA_CUSTOMISATION_FLAG_LEFT_SLEEVE = (1 << 2);
    public static final int DATA_CUSTOMISATION_FLAG_RIGHT_SLEEVE = (1 << 3);
    public static final int DATA_CUSTOMISATION_FLAG_LEFT_PANTS_LEG = (1 << 4);
    public static final int DATA_CUSTOMISATION_FLAG_RIGHT_PANTS_LEG = (1 << 5);
    public static final int DATA_CUSTOMISATION_FLAG_HAT = (1 << 6);
    public static final byte DATA_CUSTOMISATION_FLAG_ALL = 0x7f;
    </code>

    public void attack((org.bukkit.entity.Entity) Entity entity);
}
