First add the code to your objsave.c
Then add the lines at the end of file to the respective files.
Compile and run.
Please note that this code WILL NOT save items that are in containers which
  in turn is in another container.

Enjoy,
Jeremy Hess
Comments or problems with this file or alias.c file,
  hess2240@uwwvax.uww.edu



/****
 act.obj.c
****/

...

void perform_put(struct char_data * ch, struct obj_data * obj,
		      struct obj_data * cont)
{
++  extern int read_obj;
 
  if (GET_OBJ_WEIGHT(cont) + GET_OBJ_WEIGHT(obj) > GET_OBJ_VAL(cont, 0))
    act("$p won't fit in $P.", FALSE, ch, obj, cont, TO_CHAR);
  else {
    obj_from_char(obj);
    obj_to_obj(obj, cont);
++    if(!read_obj){ 
      act("You put $p in $P.", FALSE, ch, obj, cont, TO_CHAR);
      act("$n puts $p in $P.", TRUE, ch, obj, cont, TO_ROOM);
++    } 
  }
}

...

void perform_wear(struct char_data * ch, struct obj_data * obj, int where)
{
++  extern int read_obj;

  int wear_bitvectors[] = {
    ITEM_WEAR_TAKE, ITEM_WEAR_FINGER, ITEM_WEAR_FINGER, ITEM_WEAR_NECK,
    ITEM_WEAR_NECK, ITEM_WEAR_BODY, ITEM_WEAR_HEAD, ITEM_WEAR_LEGS,
    ITEM_WEAR_FEET, ITEM_WEAR_HANDS, ITEM_WEAR_ARMS, ITEM_WEAR_SHIELD,
    ITEM_WEAR_ABOUT, ITEM_WEAR_WAIST, ITEM_WEAR_WRIST, ITEM_WEAR_WRIST,
  ITEM_WEAR_WIELD, ITEM_WEAR_TAKE};
...
  
++  if(!read_obj) 
++    wear_message(ch, obj, where);
  
  obj_from_char(obj);
  equip_char(ch, obj, where);
}

/****
 act.other.c
****/

...

ACMD(do_quit)
{
  void die(struct char_data * ch);
  void Crash_rentsave(struct char_data * ch, int cost);
++  void save_obj_pos(struct char_data *ch);
  extern int free_rent;
  struct descriptor_data *d, *next_d;
 
...
 
    for(d = descriptor_list; d; d = next_d) {
      next_d = d->next;
      if (d == ch->desc)
        continue;
      if (d->character && (GET_IDNUM(d->character) == GET_IDNUM(ch)))
        close_socket(d);
    }

++    save_obj_pos(ch);

    if (free_rent)
      Crash_rentsave(ch, 0);
    extract_char(ch);		/* Char is saved in extract char */
  }
}


ACMD(do_save)
{

++  void save_obj_pos(struct char_data *ch);
 
  if (IS_NPC(ch) || !ch->desc)
    return;

  if (cmd) {
    sprintf(buf, "Saving %s.\r\n", GET_NAME(ch));
    send_to_char(buf, ch);
  }
  
++  save_obj_pos(ch);
  save_char(ch, NOWHERE);
  Crash_crashsave(ch);
  if (ROOM_FLAGGED(ch->in_room, ROOM_HOUSE_CRASH))
    House_crashsave(world[ch->in_room].number);
}

/****
 interpreter.c
****/

...

void nanny(struct descriptor_data * d, char *arg)
{

...  

  extern const char *race_menu; 
  extern int max_bad_pws;
  sh_int load_room;

  int load_char(char *name, struct char_file_u * char_element);
  int parse_class(char arg);
++  void read_obj_pos(struct char_data *ch);

  skip_spaces(&arg);

  switch (STATE(d)) {

...

    case '1':

      /* this code is to prevent people from multiply logging in */
      for (k = descriptor_list; k; k = next) {
	next = k->next;
	if (!k->connected && k->character &&
	    !str_cmp(GET_NAME(k->character), GET_NAME(d->character))) {
	  SEND_TO_Q("Your character has been deleted.\r\n", d);
	  STATE(d) = CON_CLOSE;
	  return;
	}
      }

...
 
      look_at_room(d->character, 0);
      if (has_mail(GET_IDNUM(d->character)))
	send_to_char("You have mail waiting.\r\n", d->character);
      if (load_result == 2) {	/* rented items lost */
	send_to_char("\r\n\007You could not afford your rent!\r\n"
	     "Your possesions have been donated to the Salvation Army!\r\n",
		     d->character);
      }
   
++      read_obj_pos(d->character);     
      d->prompt_mode = 1;
      break;

    case '2':
      SEND_TO_Q("Enter the text you'd like others to see when they look at you.\r\n", d);

...

/****
 objsave.c
****/    

...

extern int min_rent_cost;
++ int read_obj = FALSE;

/* Extern functions */
ACMD(do_tell);
SPECIAL(receptionist);
SPECIAL(cryogenicist);

...
 
/****
 utils.h
****/

...

/* get_filename() */
#define CRASH_FILE	0
#define ETEXT_FILE	1
#define OBJPOS_FILE	3

/* breadth-first searching */
#define BFS_ERROR		-1
#define BFS_ALREADY_THERE	-2
#define BFS_NO_PATH		-3

...

/****
 utils.c
****/

...

int get_filename(char *orig_name, char *filename, int mode)
{
  char *prefix, *middle, *suffix, *ptr, name[64];

  switch (mode) {
  case CRASH_FILE:
    prefix = "plrobjs";
    suffix = "objs";
    break;
  case ETEXT_FILE:
    prefix = "plrtext";
    suffix = "text";
    break;
++  case OBJPOS_FILE:
++    prefix = "plrobjs";
++    suffix = "objpos";
++    break; 
  default:
    return 0;
    break;
  }

...

  return 1;
}
