--- deliantra/server/common/object.C 2008/05/03 12:29:09 1.229 +++ deliantra/server/common/object.C 2008/05/04 11:12:40 1.231 @@ -1589,7 +1589,7 @@ { decrease (nr); - object *op = object_create_clone (this); + object *op = deep_clone (); op->nrof = nr; return op; } @@ -1820,7 +1820,7 @@ } for (object *tmp = m->at (x, y).bot; tmp; tmp = tmp->above) - if (tmp->arch == at) + if (tmp->arch->archname == at->archname) return tmp; return NULL; @@ -1894,8 +1894,8 @@ object * present_arch_in_ob (const archetype *at, const object *op) { - for (object *tmp = op->inv; tmp != NULL; tmp = tmp->below) - if (tmp->arch == at) + for (object *tmp = op->inv; tmp; tmp = tmp->below) + if (tmp->arch->archname == at->archname) return tmp; return NULL; @@ -2314,41 +2314,23 @@ * create clone from object to another */ object * -object_create_clone (object *asrc) +object::deep_clone () { - object *dst = 0; - - if (!asrc) - return 0; + assert (("deep_clone called on non-head object", is_head ())); - object *src = asrc->head_ (); + object *dst = clone (); - object *prev = 0; - for (object *part = src; part; part = part->more) + object *prev = dst; + for (object *part = this->more; part; part = part->more) { object *tmp = part->clone (); - - tmp->x -= src->x; - tmp->y -= src->y; - - if (!part->head) - { - dst = tmp; - tmp->head = 0; - } - else - tmp->head = dst; - - tmp->more = 0; - - if (prev) - prev->more = tmp; - + tmp->head = dst; + prev->more = tmp; prev = tmp; } - for (object *item = src->inv; item; item = item->below) - insert_ob_in_ob (object_create_clone (item), dst); + for (object *item = inv; item; item = item->below) + insert_ob_in_ob (item->deep_clone (), dst); return dst; }