package blusunrize.immersiveengineering.common.blocks.metal; import blusunrize.immersiveengineering.api.Lib; import blusunrize.immersiveengineering.common.IEContent; import blusunrize.immersiveengineering.common.blocks.IEBlockInterfaces.*; import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase; import blusunrize.immersiveengineering.common.items.ItemInternalStorage; import blusunrize.immersiveengineering.common.util.Utils; import blusunrize.immersiveengineering.common.util.inventory.IIEInventory; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumFacing.Axis; import net.minecraft.util.EnumHand; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.oredict.OreDictionary; import javax.annotation.Nullable; public class TileEntityToolbox extends TileEntityIEBase implements IDirectionalTile, IBlockBounds, IIEInventory, IGuiTile, ITileDrop, IPlayerInteraction { ItemStack[] inventory = new ItemStack[27]; public String name; private EnumFacing facing = EnumFacing.NORTH; @Override public void readCustomNBT(NBTTagCompound nbt, boolean descPacket) { facing = EnumFacing.getFront(nbt.getInteger("facing")); if(nbt.hasKey("name")) this.name = nbt.getString("name"); if(!descPacket) inventory = Utils.readInventory(nbt.getTagList("inventory", 10), 27); } @Override public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket) { nbt.setInteger("facing", facing.ordinal()); if(this.name!=null) nbt.setString("name", this.name); if(!descPacket) nbt.setTag("inventory", Utils.writeInventory(inventory)); } @Override public boolean interact(EnumFacing side, EntityPlayer player, EnumHand hand, ItemStack heldItem, float hitX, float hitY, float hitZ) { if(player.isSneaking()) { if(!getWorld().isRemote) { EntityItem entityitem = new EntityItem(getWorld(), getPos().getX()+.5,getPos().getY()+.5,getPos().getZ()+.5, getTileDrop(player, getWorld().getBlockState(getPos()))); entityitem.setDefaultPickupDelay(); getWorld().setBlockToAir(getPos()); getWorld().spawnEntityInWorld(entityitem); } return true; } return false; } @Override @Nullable public ITextComponent getDisplayName() { return name!=null?new TextComponentString(name) : new TextComponentTranslation("item.immersiveengineering.toolbox.name"); } @Override public boolean canOpenGui() { return true; } @Override public int getGuiID() { return Lib.GUIID_ToolboxBlock; } @Override public TileEntity getGuiMaster() { return this; } @Override public ItemStack[] getInventory() { return inventory; } @Override public boolean isStackValid(int slot, ItemStack stack) { if(stack!=null) { if(OreDictionary.itemMatches(new ItemStack(IEContent.blockWoodenDevice0, 1, 0), stack, true)) return false; if(OreDictionary.itemMatches(new ItemStack(IEContent.blockWoodenDevice0, 1, 5), stack, true)) return false; } return true; } @Override public int getSlotLimit(int slot) { return 64; } @Override public void doGraphicalUpdates(int slot) { this.markDirty(); } @Override public ItemStack getTileDrop(EntityPlayer player, IBlockState state) { ItemStack stack = new ItemStack(IEContent.itemToolbox); ((ItemInternalStorage)IEContent.itemToolbox).setContainedItems(stack, inventory); if(this.name!=null) stack.setStackDisplayName(this.name); return stack; } @Override public void readOnPlacement(EntityLivingBase placer, ItemStack stack) { if(stack.getItem() instanceof ItemInternalStorage) { this.inventory = ((ItemInternalStorage)stack.getItem()).getContainedItems(stack); if(stack.hasDisplayName()) this.name = stack.getDisplayName(); } } @Override public boolean preventInventoryDrop() { return true; } @Override public EnumFacing getFacing() { return facing; } @Override public void setFacing(EnumFacing facing) { this.facing = facing; } @Override public int getFacingLimitation() { return 2; } @Override public boolean mirrorFacingOnPlacement(EntityLivingBase placer) { return false; } @Override public boolean canHammerRotate(EnumFacing side, float hitX, float hitY, float hitZ, EntityLivingBase entity) { return false; } @Override public boolean canRotate(EnumFacing axis) { return true; } private static final float[] boundsZ = {.125f,0,.25f,.875f,.625f,.75f}; private static final float[] boundsX = {.25f,0,.125f,.75f,.625f,.875f}; @Override public float[] getBlockBounds() { return facing.getAxis()==Axis.Z?boundsZ:boundsX; } }