package com.dta.extracarts.mods.mfr.entities;
import com.dta.extracarts.block.FakeBlockRegistry;
import com.dta.extracarts.client.OpenableGUI;
import com.dta.extracarts.entities.EntityExtraCartChestMinecart;
import com.dta.extracarts.mods.mfr.MFRItems;
import com.dta.extracarts.mods.mfr.client.ContainerDSUCart;
import com.dta.extracarts.mods.mfr.client.GuiDSUCart;
import cpw.mods.fml.common.Optional;
import cpw.mods.fml.common.registry.GameRegistry;
import net.minecraft.block.Block;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.item.EntityMinecart;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
@Optional.Interface(iface = "mods.railcraft.api.carts.IMinecart", modid = "RailcraftAPI|carts")
public class EntityDSUCart extends EntityExtraCartChestMinecart implements OpenableGUI {
private ItemStack storedItem = null;
private int storedQty = 0;
private Block dsu = GameRegistry.findBlock("extracarts", "fakeBlock." +
FakeBlockRegistry.getFakeBlockByName("fakeDSUBlock").getBlockNumber());
public EntityDSUCart(World world) {
super(world);
this.setDropContentsWhenDead(false);
this.setDisplayTileData(FakeBlockRegistry.getFakeBlockByName("fakeDSUBlock").getMetaNumber());
}
@Override
public Block func_145817_o() {
return dsu;
}
@Override
public void killMinecart(DamageSource par1DamageSource) {
super.killMinecartNoDrop(par1DamageSource);
float f = this.rand.nextFloat() * 0.8F + 0.1F;
float f1 = this.rand.nextFloat() * 0.8F + 0.1F;
float f2 = this.rand.nextFloat() * 0.8F + 0.1F;
ItemStack dropCart = new ItemStack(dsu, 1, 3);
NBTTagCompound compound = new NBTTagCompound();
if (storedItem != null) {
compound.setTag("storedStack", storedItem.writeToNBT(new NBTTagCompound()));
compound.setInteger("storedQuantity", storedQty + this.getMinecartContainerItems()[2].stackSize);
} else {
compound.setInteger("storedQuantity", 0);
}
dropCart.setTagCompound(compound);
EntityItem entityitem = new EntityItem(this.worldObj, this.posX + (double)f, this.posY + (double)f1, this.posZ + (double)f2, dropCart);
float f3 = 0.05F;
entityitem.motionX = (double)((float)this.rand.nextGaussian() * f3);
entityitem.motionY = (double)((float)this.rand.nextGaussian() * f3 + 0.2F);
entityitem.motionZ = (double)((float)this.rand.nextGaussian() * f3);
this.worldObj.spawnEntityInWorld(entityitem);
}
@Override
public int getSizeInventory() {
return 3;
}
@Override
public int getMinecartType() {
return 1;
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack) {
if (i > 1) {
return false;
}
ItemStack stack = itemstack.copy();
stack.stackSize = 1;
if (storedItem == null || ItemStack.areItemStacksEqual(storedItem, stack)) {
return true;
}
return false;
}
public int getQuantity() {
return this.storedQty;
}
public void setQuantity(int amt) {
this.storedQty = amt;
}
public void setItem(ItemStack stack) {
stack.stackSize = 1;
this.storedItem = stack;
}
public void onInventoryChanged() {
if (worldObj.isRemote) {
return;
}
if ((this.getMinecartContainerItems()[2] == null) & storedItem != null & storedQty == 0) {
storedItem = null;
}
if (this.getMinecartContainerItems()[0] != null) {
ItemStack stack = this.getMinecartContainerItems()[0].copy();
stack.stackSize = 1;
if (storedQty == 0 && (storedItem == null || ItemStack.areItemStacksEqual(storedItem, stack))) {
storedItem = this.getMinecartContainerItems()[0].copy();
storedItem.stackSize = 1;
storedQty = this.getMinecartContainerItems()[0].stackSize;
this.getMinecartContainerItems()[0] = null;
} else if (ItemStack.areItemStacksEqual(storedItem, stack)) {
storedQty += this.getMinecartContainerItems()[0].stackSize;
this.getMinecartContainerItems()[0] = null;
}
}
if (this.getMinecartContainerItems()[1] != null) {
ItemStack stack = this.getMinecartContainerItems()[1].copy();
stack.stackSize = 1;
if (storedQty == 0 && (storedItem == null || ItemStack.areItemStacksEqual(storedItem, stack))) {
storedItem = this.getMinecartContainerItems()[1].copy();
storedItem.stackSize = 1;
storedQty = this.getMinecartContainerItems()[1].stackSize;
this.getMinecartContainerItems()[1] = null;
} else if (ItemStack.areItemStacksEqual(storedItem, stack)) {
storedQty += this.getMinecartContainerItems()[1].stackSize;
this.getMinecartContainerItems()[1] = null;
}
}
if (this.getMinecartContainerItems()[2] == null && storedItem != null) {
this.getMinecartContainerItems()[2] = storedItem.copy();
this.getMinecartContainerItems()[2].stackSize = Math.min(storedQty, Math.min(storedItem.getMaxStackSize(), this.getInventoryStackLimit()));
storedQty -= this.getMinecartContainerItems()[2].stackSize;
} else if (this.getMinecartContainerItems()[2] != null) {
ItemStack stack = this.getMinecartContainerItems()[2].copy();
stack.stackSize = 1;
if (storedQty > 0 && this.getMinecartContainerItems()[2].stackSize < this.getMinecartContainerItems()[2].getMaxStackSize() && ItemStack.areItemStacksEqual(storedItem, stack)) {
int amt = Math.min(this.getMinecartContainerItems()[2].getMaxStackSize() - this.getMinecartContainerItems()[2].stackSize, storedQty);
this.getMinecartContainerItems()[2].stackSize += amt;
storedQty -= amt;
}
}
}
@Override
public void onUpdate() {
super.onUpdate();
if(worldObj.isRemote) {
return;
}
this.onInventoryChanged();
}
@Override
public void writeToNBT(NBTTagCompound compound) {
int storedAdd = 0;
ItemStack o = this.getMinecartContainerItems()[2];
if (o != null) {
storedAdd = o.stackSize;
this.getMinecartContainerItems()[2] = null;
}
super.writeToNBT(compound);
this.getMinecartContainerItems()[2] = o;
if (storedItem != null) {
compound.setTag("storedStack", storedItem.writeToNBT(new NBTTagCompound()));
compound.setInteger("storedQuantity", storedQty + storedAdd);
}
else {
compound.setInteger("storedQuantity", 0);
}
}
@Override
public void readFromNBT(NBTTagCompound compound){
super.readFromNBT(compound);
storedQty = compound.getInteger("storedQuantity");
storedItem = null;
if (compound.hasKey("storedStack")) {
storedItem = ItemStack.loadItemStackFromNBT((NBTTagCompound)compound.getTag("storedStack"));
}
if (storedItem == null & storedQty > 0) {
storedQty = 0;
}
}
public ItemStack getStoredItem() {
return this.storedItem;
}
@Override
public int getInventoryStackLimit() {
if (this.getMinecartContainerItems()[2] == null) {
return 64;
}
return Math.min(64, (Integer.MAX_VALUE - (storedQty + this.getMinecartContainerItems()[2].stackSize)));
}
@Override
public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new GuiDSUCart(player.inventory, this);
}
@Override
public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new ContainerDSUCart(player.inventory, this);
}
@Optional.Method(modid = "RailcraftAPI|carts")
public boolean doesCartMatchFilter(ItemStack stack, EntityMinecart cart) {
ItemStack CartStack = new ItemStack(MFRItems.MFRCart, 1, 0);
if (cart instanceof EntityDSUCart && stack.getItem() == CartStack.getItem() && stack.getItemDamage() == 0) {
return true;
}
return false;
}
@Override
protected ItemStack moveItemStack(ItemStack stack, IInventory dest) {
if(stack == null) {
return null;
}
if(storedItem == null) {
storedItem = stack;
} else if (stack.getItem() == storedItem.getItem()) {
if (stack.stackSize + storedQty < Integer.MAX_VALUE) {
storedQty += stack.stackSize;
stack = null;
}
}
return stack;
}
}