package joshie.harvest.core.entity;
import com.google.common.base.Optional;
import joshie.harvest.api.HFApi;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.world.World;
import net.minecraftforge.items.ItemHandlerHelper;
import net.minecraftforge.items.ItemStackHandler;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Iterator;
import java.util.List;
import static joshie.harvest.core.tile.TileBasket.BASKET_INVENTORY;
public class EntityBasket extends Entity {
public static final DataParameter<Optional<ItemStack>> ITEM = EntityDataManager.createKey(EntityItem.class, DataSerializers.OPTIONAL_ITEM_STACK);
public final ItemStackHandler handler = new ItemStackHandler(BASKET_INVENTORY);
public EntityBasket(World worldIn) {
super(worldIn);
}
@Override
protected void entityInit() {
this.getDataManager().register(ITEM, Optional.absent());
}
public void setAppearanceAndContents(@Nullable ItemStack stack, ItemStackHandler handler) {
this.getDataManager().set(ITEM, Optional.fromNullable(stack));
this.getDataManager().setDirty(ITEM);
for (int i = 0; i < handler.getSlots(); i++) {
this.handler.setStackInSlot(i, handler.getStackInSlot(i));
}
}
public ItemStack getEntityItem() {
ItemStack itemstack = (ItemStack)((Optional)this.getDataManager().get(ITEM)).orNull();
return itemstack == null ? new ItemStack(Blocks.STONE): itemstack;
}
@Override
protected void readEntityFromNBT(@Nonnull NBTTagCompound compound) {
handler.deserializeNBT(compound.getCompoundTag("inventory"));
}
@Override
protected void writeEntityToNBT(@Nonnull NBTTagCompound compound) {
compound.setTag("inventory", handler.serializeNBT());
}
/* Autoshipping some items **/
private void autoship(List<ItemStack> list) {
Iterator<ItemStack> it = list.iterator();
while (it.hasNext()) {
ItemStack stack = it.next();
if (HFApi.shipping.getSellValue(stack) > 0) {
ItemStack remainder = ItemHandlerHelper.insertItemStacked(handler, stack, false);
if (remainder == null) it.remove();
else {
stack.stackSize = remainder.stackSize; //Update the internal contents
}
}
}
}
public static boolean findBasketAndShip(EntityPlayer player, List<ItemStack> list) {
for (Entity entity : player.getPassengers()) {
if (entity instanceof EntityBasket) {
EntityBasket basket = (EntityBasket) entity;
if (list.size() > 0) {
basket.getDataManager().set(ITEM, Optional.of(list.get(list.size() - 1).copy()));
basket.getDataManager().setDirty(ITEM);
}
basket.autoship(list);
return list.isEmpty();
}
}
return false;
}
public static boolean isWearingBasket(EntityPlayer player) {
for (Entity entity : player.getPassengers()) {
if (entity instanceof EntityBasket) {
return true;
}
}
return false;
}
}