@Override
 protected boolean removedByPlayer(EntityPlayer player, boolean willHarvest) {
   if (player.worldObj.isRemote) {
     return false;
   }
   MovingObjectPosition hit = ItemSculptingTool.doRayTrace(player);
   if (hit == null || hit.subHit == -1 || parts.size() < 1) {
     return super.removedByPlayer(player, willHarvest);
   }
   Coord here = getCoord();
   ClayState state = getState();
   // If it's solid, break it.
   // If we're sneaking & creative, break it
   boolean shouldDestroy = player.isSneaking() || parts.size() == 1;
   if (player.capabilities.isCreativeMode) {
     if (shouldDestroy) {
       return super.removedByPlayer(player, willHarvest);
     } else {
       removeLump(hit.subHit);
       return true;
     }
   }
   shouldDestroy |= state != ClayState.WET;
   if (shouldDestroy) {
     InvUtil.spawnItemStack(here, getItem());
     here.setAir();
   } else {
     removeLump(hit.subHit);
     InvUtil.spawnItemStack(here, new ItemStack(Items.clay_ball));
   }
   return false;
 }
 @Override
 public boolean activate(EntityPlayer player, EnumFacing side) {
   ClayState state = getState();
   if (state == ClayState.WET) {
     touch();
   }
   ItemStack held = player.getCurrentEquippedItem();
   if (held == null) {
     return false;
   }
   Item heldId = held.getItem();
   boolean creative = player.capabilities.isCreativeMode;
   if (heldId == Items.blaze_powder && state != ClayState.HIGHFIRED) {
     PlayerUtil.cheatDecr(player, held);
     // TODO: Untested. Blaze powder should just finish the thing. Should also play a noise + emit
     // particles.
     if (totalHeat < bisqueHeat) {
       totalHeat = bisqueHeat;
     } else if (totalHeat < highfireHeat) {
       totalHeat = highfireHeat;
     }
     return true;
   }
   if (heldId == Items.water_bucket && state == ClayState.DRY) {
     lastTouched = 0;
     if (creative) {
       return true;
     }
     int ci = player.inventory.currentItem;
     player.inventory.mainInventory[ci] = new ItemStack(Items.bucket);
     return true;
   }
   if (heldId == woolItem) {
     lastTouched = dryTime + 1;
     return true;
   }
   if (held.getItem() != Items.clay_ball || held.stackSize == 0) {
     return false;
   }
   if (!creative && state != ClayState.WET) {
     new Notice(this, "Not wet").send(player);
     return false;
   }
   if (!creative) {
     held.stackSize--;
   }
   if (player.worldObj.isRemote) {
     // Let the server tell us the results
     return true;
   }
   if (parts.size() >= MAX_PARTS) {
     new Notice(this, "Too complex").send(player);
     held.stackSize++;
     return false;
   }
   ClayLump toAdd = addLump();
   MovingObjectPosition hit = ItemSculptingTool.doRayTrace(player);
   if (hit == null || hit.subHit == -1) {
     return true;
   }
   ClayLump against = parts.get(hit.subHit);
   ClayLump extrusion = extrudeLump(against, hit.sideHit);
   if (isValidLump(extrusion)) {
     changeLump(parts.size() - 1, extrusion);
   } else {
     // TODO: Sometimes it fails when it shouldn't.
   }
   return true;
 }