This is now my objsave_save_obj_record, thanks to whoever did most of the work I just deleted all the checks so every item saves all of it's data. The reason I deleted the checks is so the items won't change if it doesn't have a tag and there is a new item in proto. IDK what I am doing here heh. 
Code:
int objsave_save_obj_record(struct obj_data *obj, FILE *fp, int locate)
{
  int counter2;
  struct extra_descr_data *ex_desc;
  char buf1[MAX_STRING_LENGTH +1];
  struct obj_data *temp = NULL;
  if (GET_OBJ_VNUM(obj) != NOTHING)
    temp=read_object(GET_OBJ_VNUM(obj), VIRTUAL);
  else {
    temp = create_obj();
    temp->item_number = NOWHERE;
  }
  if (obj->action_description) {
    strcpy(buf1, obj->action_description);
    strip_cr(buf1);
  } else
    *buf1 = 0;
  fprintf(fp, "#%d\n", NOTHING);// GET_OBJ_VNUM(obj));
  if (locate)
    fprintf(fp, "Loc : %d\n", locate);
  fprintf(fp,
          "Vals: %d %d %d %d\n",
          GET_OBJ_VAL(obj, 0),
          GET_OBJ_VAL(obj, 1),
          GET_OBJ_VAL(obj, 2),
          GET_OBJ_VAL(obj, 3)
          );
  fprintf(fp, "Flag: %d %d %d %d\n", GET_OBJ_EXTRA(obj)[0], GET_OBJ_EXTRA(obj)[1], GET_OBJ_EXTRA(obj)[2], GET_OBJ_EXTRA(obj)[3]);
  fprintf(fp, "Name: %s\n", obj->name ? obj->name : "Undefined");
  fprintf(fp, "Shrt: %s\n", obj->short_description ? obj->short_description : "Undefined");
  /* These two could be a pain on the read... we'll see... */
  fprintf(fp, "Desc: %s\n", obj->description ? obj->description : "Undefined");
  /* Only even try to process this if an action desc exists */
  if (obj->action_description)
    fprintf(fp, "ADes:\n%s~\n", buf1);
  fprintf(fp, "Type: %d\n", GET_OBJ_TYPE(obj));
  fprintf(fp, "Wght: %d\n", GET_OBJ_WEIGHT(obj));
  fprintf(fp, "Cost: %d\n", GET_OBJ_COST(obj));
  fprintf(fp, "Rent: %d\n", GET_OBJ_RENT(obj));
  fprintf(fp, "Perm: %d %d %d %d\n", GET_OBJ_AFFECT(obj)[0], GET_OBJ_AFFECT(obj)[1], GET_OBJ_AFFECT(obj)[2], GET_OBJ_AFFECT(obj)[3]);
  fprintf(fp, "Wear: %d %d %d %d\n", GET_OBJ_WEAR(obj)[0], GET_OBJ_WEAR(obj)[1], GET_OBJ_WEAR(obj)[2], GET_OBJ_WEAR(obj)[3]);
  /* Do we have affects? */
  for (counter2 = 0; counter2 < MAX_OBJ_AFFECT; counter2++)
    fprintf(fp, "Aff : %d %d %d\n",
            counter2,
            obj->affected[counter2].location,
            obj->affected[counter2].modifier
            );
  /* Do we have extra descriptions? */
  if (obj->ex_description) {
    /* To be reimplemented.  Need to handle this case in loading as
      well */
    for (ex_desc = obj->ex_description; ex_desc; ex_desc = ex_desc->next) {
      /*. Sanity check to prevent nasty protection faults . */
      if (!*ex_desc->keyword || !*ex_desc->description) {
        continue;
      }
      strcpy(buf1, ex_desc->description);
      strip_cr(buf1);
      fprintf(fp, "EDes:\n"
              "%s~\n"
              "%s~\n",
              ex_desc->keyword,
              buf1
              );
    }
  }
  fprintf(fp, "\n");
  extract_obj(temp);
  return 1;
}