--- deliantra/server/common/object.C 2007/08/15 04:59:46 1.180 +++ deliantra/server/common/object.C 2007/08/30 05:18:37 1.186 @@ -376,7 +376,6 @@ * multi-object 1 which is closest to the second object. * If it's not a multi-object, it is returned. */ - object * get_nearest_part (object *op, const object *pl) { @@ -431,22 +430,15 @@ /* * Sets the owner and sets the skill and exp pointers to owner's current * skill and experience objects. + * ACTUALLY NO! investigate! TODO */ void object::set_owner (object *owner) { - if (!owner) - return; - - /* next line added to allow objects which own objects */ - /* Add a check for ownercounts in here, as I got into an endless loop - * with the fireball owning a poison cloud which then owned the - * fireball. I believe that was caused by one of the objects getting - * freed and then another object replacing it. Since the ownercounts - * didn't match, this check is valid and I believe that cause is valid. - */ - while (owner->owner) - owner = owner->owner; + // allow objects which own objects + if (owner) + while (owner->owner) + owner = owner->owner; this->owner = owner; } @@ -588,7 +580,7 @@ *dst = *this; if (speed < 0) - dst->speed_left = speed_left - rndm (); + dst->speed_left -= rndm (); dst->set_speed (dst->speed); } @@ -925,6 +917,7 @@ { freed_map = new maptile; + freed_map->path = ""; freed_map->name = "/internal/freed_objects_map"; freed_map->width = 3; freed_map->height = 3; @@ -1665,8 +1658,6 @@ object * object::insert (object *op) { - object *tmp, *otmp; - if (!QUERY_FLAG (op, FLAG_REMOVED)) op->remove (); @@ -1678,9 +1669,10 @@ CLEAR_FLAG (op, FLAG_OBJ_ORIGINAL); CLEAR_FLAG (op, FLAG_REMOVED); + if (op->nrof) { - for (tmp = inv; tmp != NULL; tmp = tmp->below) + for (object *tmp = inv; tmp; tmp = tmp->below) if (object::can_merge (tmp, op)) { /* return the original object and remove inserted object @@ -1709,19 +1701,19 @@ else add_weight (this, (op->weight + op->carrying)); - otmp = this->in_player (); - if (otmp && otmp->contr) - if (!QUERY_FLAG (otmp, FLAG_NO_FIX_PLAYER)) + if (object *otmp = this->in_player ()) + if (otmp->contr && !QUERY_FLAG (otmp, FLAG_NO_FIX_PLAYER)) otmp->update_stats (); - op->map = 0; - op->env = this; + op->owner = 0; // its his/hers now. period. + op->map = 0; + op->env = this; op->above = 0; op->below = 0; - op->x = 0, op->y = 0; + op->x = op->y = 0; /* reset the light list and los of the players on the map */ - if ((op->glow_radius != 0) && map) + if (op->glow_radius && map) { #ifdef DEBUG_LIGHTS LOG (llevDebug, " insert_ob_in_ob(): got %s to insert in map/op\n", op->name); @@ -2602,7 +2594,7 @@ title ? (const char *)title : "", flag_desc (flagdesc, 512), type); - if (env) + if (!this->flag[FLAG_REMOVED] && env) p += snprintf (p, 256, "(in %s)", env->debug_desc (info2)); if (map)