package net.minecraft.world;

import net.minecraft.world.item.ItemStack;
import net.minecraft.world.entity.player.EntityHuman;

import com.bergerkiller.generated.net.minecraft.world.item.ItemStackHandle;

interface IInventory {
    public abstract (ItemStackHandle) ItemStack getItem(int index);
    public abstract void setItem(int paramInt, (ItemStackHandle) ItemStack paramItemStack);

#if version >= 1.18
    public abstract (org.bukkit.inventory.ItemStack) ItemStack splitStack:removeItem(int i, int j);
    public abstract (org.bukkit.inventory.ItemStack) ItemStack splitWithoutUpdate:removeItemNoUpdate(int i);
    public abstract int getSize:getContainerSize();
    public abstract void update:setChanged();
    public abstract boolean canOpen:stillValid((org.bukkit.entity.HumanEntity) EntityHuman paramEntityHuman);
    public abstract boolean canStoreItem:canPlaceItem(int index, (org.bukkit.inventory.ItemStack) ItemStack itemstack);
#else
    public abstract (org.bukkit.inventory.ItemStack) ItemStack splitStack(int i, int j);
    public abstract (org.bukkit.inventory.ItemStack) ItemStack splitWithoutUpdate(int i);
    public abstract int getSize();
    public abstract void update();
    public abstract boolean canOpen:a((org.bukkit.entity.HumanEntity) EntityHuman paramEntityHuman);
    public abstract boolean canStoreItem:b(int index, (org.bukkit.inventory.ItemStack) ItemStack itemstack);
#endif

#if version >= 1.14
    // Removed
    public optional abstract int getProperty:###(int key);
    public optional abstract void setProperty:###(int key, int value);
    public optional abstract int someFunction:###();
#else
    public optional abstract int getProperty(int key);
  #if version >= 1.9
    public optional abstract void setProperty(int key, int value);
  #else
    public optional abstract void setProperty:b(int key, int value);
  #endif
  #if version >= 1.11
    public optional abstract int someFunction:h();
  #else
    public optional abstract int someFunction:g();
  #endif
#endif

#if version >= 1.11
    public abstract (List<ItemStackHandle>) List<ItemStack> getContents();
#else
    public abstract (List<ItemStackHandle>) ItemStack[] getContents();
#endif

#if version >= 1.18
    public abstract void clear:clearContent();
#elseif version >= 1.11
    public abstract void clear();
#else
    public abstract void clear:l();
#endif

#if version >= 1.15.2
    // isNotEmpty() was removed, and now just isEmpty() is used instead
    public optional abstract boolean isNotEmptyOpt:###();
#elseif version >= 1.14
    public optional abstract boolean isNotEmptyOpt:isNotEmpty();
#elseif version >= 1.13
    public optional abstract boolean isNotEmptyOpt:P_();
#elseif version >= 1.12
    public optional abstract boolean isNotEmptyOpt:x_();
#elseif version >= 1.11
    public optional abstract boolean isNotEmptyOpt:w_();
#else
    public optional abstract boolean isNotEmptyOpt:###();
#endif
}