package mcjty.rftools.blocks.endergen; import mcjty.lib.container.InventoryHelper; import mcjty.lib.entity.GenericTileEntity; import mcjty.lib.varia.BlockTools; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.ForgeDirection; public class PearlInjectorTileEntity extends GenericTileEntity implements IInventory { private InventoryHelper inventoryHelper = new InventoryHelper(this, PearlInjectorContainer.factory, PearlInjectorContainer.BUFFER_SIZE); // For pulse detection. private boolean prevIn = false; private EndergenicTileEntity findEndergenicTileEntity() { int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); ForgeDirection k = BlockTools.getOrientation(meta); EndergenicTileEntity te = getEndergenicGeneratorAt(k.getOpposite()); if (te != null) { return te; } return getEndergenicGeneratorAt(ForgeDirection.UP); } private EndergenicTileEntity getEndergenicGeneratorAt(ForgeDirection k) { int x = xCoord + k.offsetX; int y = yCoord + k.offsetY; int z = zCoord + k.offsetZ; TileEntity te = worldObj.getTileEntity(x, y, z); if (te instanceof EndergenicTileEntity) { return (EndergenicTileEntity) te; } return null; } @Override protected void checkStateServer() { super.checkStateServer(); int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); boolean newvalue = BlockTools.getRedstoneSignal(meta); boolean pulse = newvalue && !prevIn; prevIn = newvalue; if (pulse) { injectPearl(); } } private boolean takePearl() { for (int i = 0 ; i < inventoryHelper.getCount() ; i++) { ItemStack stack = inventoryHelper.getStackInSlot(i); if (stack != null && Items.ender_pearl.equals(stack.getItem()) && stack.stackSize > 0) { decrStackSize(i, 1); return true; } } return false; } private void injectPearl() { EndergenicTileEntity endergen = findEndergenicTileEntity(); if (endergen != null) { if (!takePearl()) { // No pearls in the inventory. return; } int mode = endergen.getChargingMode(); // If the endergenic is already holding a pearl then this one is lost. if (mode != EndergenicTileEntity.CHARGE_HOLDING) { // It can accept a pearl. endergen.firePearlFromInjector(); } } } @Override public void readFromNBT(NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); prevIn = tagCompound.getBoolean("prevIn"); } @Override public void readRestorableFromNBT(NBTTagCompound tagCompound) { super.readRestorableFromNBT(tagCompound); readBufferFromNBT(tagCompound); } private void readBufferFromNBT(NBTTagCompound tagCompound) { NBTTagList bufferTagList = tagCompound.getTagList("Items", Constants.NBT.TAG_COMPOUND); for (int i = 0 ; i < bufferTagList.tagCount() ; i++) { NBTTagCompound nbtTagCompound = bufferTagList.getCompoundTagAt(i); inventoryHelper.setStackInSlot(i+PearlInjectorContainer.SLOT_BUFFER, ItemStack.loadItemStackFromNBT(nbtTagCompound)); } } @Override public void writeToNBT(NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); tagCompound.setBoolean("prevIn", prevIn); } @Override public void writeRestorableToNBT(NBTTagCompound tagCompound) { super.writeRestorableToNBT(tagCompound); writeBufferToNBT(tagCompound); } private void writeBufferToNBT(NBTTagCompound tagCompound) { NBTTagList bufferTagList = new NBTTagList(); for (int i = 0 ; i < inventoryHelper.getCount() ; i++) { ItemStack stack = inventoryHelper.getStackInSlot(i); NBTTagCompound nbtTagCompound = new NBTTagCompound(); if (stack != null) { stack.writeToNBT(nbtTagCompound); } bufferTagList.appendTag(nbtTagCompound); } tagCompound.setTag("Items", bufferTagList); } @Override public int getSizeInventory() { return inventoryHelper.getCount(); } @Override public ItemStack getStackInSlot(int index) { return inventoryHelper.getStackInSlot(index); } @Override public ItemStack decrStackSize(int index, int amount) { return inventoryHelper.decrStackSize(index, amount); } @Override public ItemStack getStackInSlotOnClosing(int index) { return null; } @Override public void setInventorySlotContents(int index, ItemStack stack) { inventoryHelper.setInventorySlotContents(getInventoryStackLimit(), index, stack); } @Override public String getInventoryName() { return "Pearl Injector Inventory"; } @Override public boolean hasCustomInventoryName() { return false; } @Override public int getInventoryStackLimit() { return 16; } @Override public boolean isUseableByPlayer(EntityPlayer player) { return canPlayerAccess(player); } @Override public void openInventory() { } @Override public void closeInventory() { } @Override public boolean isItemValidForSlot(int index, ItemStack stack) { return Items.ender_pearl.equals(stack.getItem()); } }