--- deliantra/server/common/loader.C 2006/09/07 09:37:12 1.8 +++ deliantra/server/common/loader.C 2006/09/08 17:14:07 1.11 @@ -501,9 +501,10 @@ else \ CLEAR_FLAG (op, flag) \ -int parse_object (object * op, object_thawer & thawer, int map_flags) +int parse_object (object *op, object_thawer &thawer, int map_flags) { bool ismore = 0; + object *op_inv = op->inv; for (;;) { @@ -560,18 +561,28 @@ { // was: insert_ob_in_ob (tmp, op); // but manually adding it can improve map loading times a lot + // also, appending instead of prepending keeps the + // save ordering the same between repeated load/saves. CLEAR_FLAG (tmp, FLAG_OBJ_ORIGINAL); CLEAR_FLAG (tmp, FLAG_REMOVED); - tmp->env = op; - if (!op->inv) - op->inv = tmp; - else + if (!op_inv) { - tmp->below = op->inv; - tmp->below->above = tmp; op->inv = tmp; + tmp->above = 0; + } + else + { + while (op_inv->below) + op_inv = op_inv->below; + + op_inv->below = tmp; + tmp->above = op_inv; } + + tmp->below = 0; + tmp->env = op; + op_inv = tmp; } else { @@ -642,10 +653,7 @@ break; case KW_face: - if (const char *str = thawer.get_str ()) - op->face = &new_faces[FindFace (str, 0)]; - else - op->face = 0; + op->face = &new_faces[FindFace (thawer.get_str (), 0)]; break; case KW_x: thawer.get (op->x); break;