@Override
 public void writeToNBT(NBTTagCompound tag) {
   super.writeToNBT(tag);
   NBTTagCompound tag1 = new NBTTagCompound();
   inventory.writeToNBT(tag1);
   tag.setTag("inventory", tag1);
 }
 @Override
 public ItemStack getStackInSlotOnClosing(int var1) {
   return inventory.getStackInSlotOnClosing(var1);
 }
 @Override
 public ItemStack decrStackSize(int var1, int var2) {
   return inventory.decrStackSize(var1, var2);
 }
 @Override
 public int getSizeInventory() {
   return inventory.getSizeInventory();
 }
 @Override
 public boolean isItemValidForSlot(int var1, ItemStack var2) {
   return resourceInventory.isItemValidForSlot(var1, var2);
 }
 @Override
 public void readFromNBT(NBTTagCompound tag) {
   super.readFromNBT(tag);
   inventory.readFromNBT(tag.getCompoundTag("inventory"));
 }
 @Override
 public void openInventory() {
   resourceInventory.openInventory();
 }
 @Override
 public int getSizeInventory() {
   return resourceInventory.getSizeInventory();
 }
 @Override
 public int getInventoryStackLimit() {
   return resourceInventory.getInventoryStackLimit();
 }
 @Override
 public boolean isUseableByPlayer(EntityPlayer var1) {
   return resourceInventory.isUseableByPlayer(var1);
 }
 @Override
 public boolean hasCustomInventoryName() {
   return resourceInventory.hasCustomInventoryName();
 }
 @Override
 public String getInventoryName() {
   return resourceInventory.getInventoryName();
 }
 @Override
 public ItemStack getStackInSlot(int var1) {
   return resourceInventory.getStackInSlot(var1);
 }
 @Override
 public void setInventorySlotContents(int var1, ItemStack var2) {
   inventory.setInventorySlotContents(var1, var2);
 }
 @Override
 public void closeInventory() {
   resourceInventory.closeInventory();
 }
 @Override
 public String getInventoryName() {
   return inventory.getInventoryName();
 }
 public String getCrafterName() {
   return ItemResearchBook.getResearcherName(bookInventory.getStackInSlot(0));
 }