@Override
 public void update() {
   if (worldObj.isRemote) {
     return;
   }
   // TODO: Ugh, laaaame. Schedule a block update?
   if (!partsValidated) {
     partsValidated = true;
     Iterator<ClayLump> it = parts.iterator();
     while (it.hasNext()) {
       ClayLump lump = it.next();
       if (!isValidLump(lump)) {
         if (parts.size() == 1) {
           lump.asDefault();
         } else {
           it.remove();
           InvUtil.spawnItemStack(getCoord(), new ItemStack(Items.clay_ball));
         }
       }
     }
   }
   if (getState() == ClayState.WET) {
     if (!worldObj.isRaining()) {
       lastTouched++;
     }
     if (totalHeat > 0) {
       totalHeat--;
       lastTouched++;
     }
   }
   if (getState() != lastState) {
     lastState = getState();
     broadcastMessage(null, SculptState, lastState.ordinal());
   }
 }
 private void readStateChange(ByteBuf input) throws IOException {
   switch (ClayState.values()[input.readInt()]) {
     case WET:
       lastTouched = 0;
       break;
     case DRY:
       lastTouched = dryTime + 10;
       break;
     case BISQUED:
       totalHeat = bisqueHeat + 1;
       break;
     case UNFIRED_GLAZED:
       totalHeat = bisqueHeat + 2;
       glazesApplied = true;
       break;
     case HIGHFIRED:
       totalHeat = highfireHeat + 1;
       break;
   }
   getCoord().redraw();
 }