--- deliantra/server/common/object.C 2008/05/06 21:04:37 1.237 +++ deliantra/server/common/object.C 2008/07/20 16:56:34 1.251 @@ -208,7 +208,7 @@ if (QUERY_FLAG (ob2, FLAG_IDENTIFIED)) SET_FLAG (ob2, FLAG_BEEN_APPLIED); - if (ob1->arch->name != ob2->arch->name + if (ob1->arch->archname != ob2->arch->archname || ob1->name != ob2->name || ob1->title != ob2->title || ob1->msg != ob2->msg @@ -219,6 +219,7 @@ || ob1->skill != ob2->skill || ob1->value != ob2->value || ob1->animation_id != ob2->animation_id + || (ob1->face != ob2->face && !ob1->animation_id) // face and animation are dependent on each other || ob1->client_type != ob2->client_type || ob1->materialname != ob2->materialname || ob1->lore != ob2->lore @@ -346,7 +347,8 @@ // maybe there is a player standing on the same mapspace // this will catch the case where "this" is a player if (object *pl = ms ().player ()) - if (!pl->container || this == pl->container) + if ((!pl->container && pl->contr->ns && !pl->contr->ns->update_look) + || this == pl->container) return pl; } } @@ -480,13 +482,13 @@ find_object_name (const char *str) { shstr_cmp str_ (str); - object *op; - for_all_objects (op) - if (op->name == str_) - break; + if (str_) + for_all_objects (op) + if (op->name == str_) + return op; - return op; + return 0; } /* @@ -906,14 +908,11 @@ if (!drop_to_ground || !map || map->in_memory != MAP_ACTIVE - || map->nodrop + || map->no_drop || ms ().move_block == MOVE_ALL) { while (inv) - { - inv->destroy_inv (false); - inv->destroy (); - } + inv->destroy (true); } else { /* Put objects in inventory onto this space */ @@ -945,11 +944,12 @@ { freed_map () { - path = ""; - name = "/internal/freed_objects_map"; - width = 3; - height = 3; - nodrop = 1; + path = ""; + name = "/internal/freed_objects_map"; + width = 3; + height = 3; + no_drop = 1; + no_reset = 1; alloc (); in_memory = MAP_ACTIVE; @@ -1237,6 +1237,8 @@ object * insert_ob_in_map_at (object *op, maptile *m, object *originator, int flag, int x, int y) { + op->remove (); + for (object *tmp = op->head_ (); tmp; tmp = tmp->more) { tmp->x = x + tmp->arch->x; @@ -1269,7 +1271,23 @@ object * insert_ob_in_map (object *op, maptile *m, object *originator, int flag) { - op->remove (); + if (op->is_on_map ()) + { + LOG (llevError, "insert_ob_in_map called for object already on map"); + abort (); + } + + if (op->env) + { + LOG (llevError, "insert_ob_in_map called for object in an inventory (proceeding)"); + op->remove (); + } + + if (op->face && !face_info (op->face))//D TODO: remove soon + {//D + LOG (llevError | logBacktrace, "op->face out of bounds: %s", op->debug_desc ());//D + op->face = 1;//D + }//D /* Ideally, the caller figures this out. However, it complicates a lot * of areas of callers (eg, anything that uses find_free_spot would now @@ -1311,12 +1329,16 @@ if (flag & INS_BELOW_ORIGINATOR) { - if (originator->map != op->map || originator->x != op->x || originator->y != op->y || !originator->is_on_map ()) + if (originator->map != op->map || originator->x != op->x || originator->y != op->y) { LOG (llevError, "insert_ob_in_map called with INS_BELOW_ORIGINATOR when originator not on same space!\n"); abort (); } + if (!originator->is_on_map ()) + LOG (llevDebug | logBacktrace, "insert_ob_in_map(%s) called with INS_BELOW_ORIGINATOR when originator '%s' not on map", + op->debug_desc (), originator->debug_desc ()); + op->above = originator; op->below = originator->below; originator->below = op; @@ -1392,27 +1414,24 @@ if (flag & INS_ABOVE_FLOOR_ONLY) top = floor; - /* Top is the object that our object (op) is going to get inserted above. - */ - - /* no top found, insert on top */ + // insert object above top, or bottom-most if top = 0 if (!top) { - op->above = 0; - op->below = ms.top; - ms.top = op; + op->below = 0; + op->above = ms.bot; + ms.bot = op; - *(op->below ? &op->below->above : &ms.bot) = op; + *(op->above ? &op->above->below : &ms.top) = op; } else - { /* get inserted into the stack above top */ + { op->above = top->above; top->above = op; op->below = top; *(op->above ? &op->above->below : &ms.top) = op; } - } /* else not INS_BELOW_ORIGINATOR */ + } if (op->type == PLAYER) { @@ -1518,11 +1537,10 @@ nr = min (nr, nrof); - nrof -= nr; - - if (nrof) + if (nrof > nr) { - adjust_weight (env, -weight * nr); // carrying == 0 + nrof -= nr; + adjust_weight (env, -weight * max (1, nr)); // carrying == 0 if (object *pl = visible_to ()) esrv_update_item (UPD_NROF, pl, this); @@ -1531,7 +1549,7 @@ } else { - destroy (1); + destroy (); return false; } } @@ -2417,12 +2435,13 @@ char info2[256 * 4]; char *p = info; - p += snprintf (p, 512, "{cnt:%d,uuid:%s,name:\"%s\"%s%s,flags:[%s],type:%d}", + p += snprintf (p, 512, "{cnt:%d,uuid:%s,name:\"%s\"%s%s%s,flags:[%s],type:%d}", count, uuid.c_str (), &name, - title ? "\",title:\"" : "", + title ? ",title:\"" : "", title ? (const char *)title : "", + title ? "\"" : "", flag_desc (flagdesc, 512), type); if (!flag[FLAG_REMOVED] && env)