--- deliantra/server/common/object.C 2009/06/27 08:35:03 1.284 +++ deliantra/server/common/object.C 2009/10/11 05:31:54 1.289 @@ -330,7 +330,7 @@ return env; // else a player could have our env open - object *envest = env->outer_env (); + object *envest = env->outer_env_or_self (); // the player itself is always on a map, so we will find him here // even if our inv is in a player. @@ -433,6 +433,12 @@ return freezer.as_string (); } +char * +object::as_string () +{ + return dump_object (this); +} + /* * get_nearest_part(multi-object, object 2) returns the part of the * multi-object 1 which is closest to the second object. @@ -557,7 +563,8 @@ new_draw_info_format (NDI_UNIQUE, 0, this, "You try to balance all your items at once, " "but the %s is just too much for your body. " - "[You need to unapply some items first.]", &ob->name); + "[You need to unapply some items first - use the 'body' command to see " + "how many items you cna wera on a specific body part.]", &ob->name); return false; } @@ -833,11 +840,13 @@ if (active) return; - if (has_active_speed () && flag [FLAG_FREED]) LOG (llevError | logBacktrace, "BUG: tried to activate freed object %s\n", debug_desc ());//D - if (has_active_speed () && flag [FLAG_DEBUG]) LOG (llevError | logBacktrace, "BUG: tried to activate DEBUG object %s\n", debug_desc ());//D temp - if (has_active_speed ()) - actives.insert (this); + { + if (flag [FLAG_FREED]) + LOG (llevError | logBacktrace, "BUG: tried to activate freed object %s\n", debug_desc ());//D + + actives.insert (this); + } } void @@ -1479,7 +1488,7 @@ */ /* if this is not the head or flag has been passed, don't check walk on status */ - if (!(flag & INS_NO_WALK_ON) && op->head_ () == op) + if (!(flag & INS_NO_WALK_ON) && op->is_head ()) { if (check_move_on (op, originator)) return 0; @@ -1704,18 +1713,20 @@ int check_move_on (object *op, object *originator) { + if (QUERY_FLAG (op, FLAG_NO_APPLY)) + return 0; + object *tmp; maptile *m = op->map; int x = op->x, y = op->y; - MoveType move_on, move_slow, move_block; + mapspace &ms = m->at (x, y); - if (QUERY_FLAG (op, FLAG_NO_APPLY)) - return 0; + ms.update (); - move_on = GET_MAP_MOVE_ON (op->map, op->x, op->y); - move_slow = GET_MAP_MOVE_SLOW (op->map, op->x, op->y); - move_block = GET_MAP_MOVE_BLOCK (op->map, op->x, op->y); + MoveType move_on = ms.move_on; + MoveType move_slow = ms.move_slow; + MoveType move_block = ms.move_block; /* if nothing on this space will slow op down or be applied, * no need to do checking below. have to make sure move_type @@ -1736,19 +1747,10 @@ /* The objects have to be checked from top to bottom. * Hence, we first go to the top: */ - - for (tmp = op->ms ().bot; tmp && tmp->above; tmp = tmp->above) + for (object *next, *tmp = ms.top; tmp; tmp = next) { - /* Trim the search when we find the first other spell effect - * this helps performance so that if a space has 50 spell objects, - * we don't need to check all of them. - */ - if ((tmp->move_type & MOVE_FLY_LOW) && QUERY_FLAG (tmp, FLAG_NO_PICK)) - break; - } + next = tmp->below; - for (; tmp; tmp = tmp->below) - { if (tmp == op) continue; /* Can't apply yourself */ @@ -1763,13 +1765,11 @@ if ((!op->move_type && tmp->move_slow & MOVE_WALK) || ((op->move_type & tmp->move_slow) && (op->move_type & ~tmp->move_slow & ~tmp->move_block) == 0)) { - - float - diff = tmp->move_slow_penalty * fabs (op->speed); + float diff = tmp->move_slow_penalty * fabs (op->speed); if (op->is_player ()) - if ((QUERY_FLAG (tmp, FLAG_IS_HILLY) && find_skill_by_number (op, SK_CLIMBING)) || - (QUERY_FLAG (tmp, FLAG_IS_WOODED) && find_skill_by_number (op, SK_WOODSMAN))) + if ((tmp->flag [FLAG_IS_HILLY ] && find_skill_by_number (op, SK_CLIMBING)) || + (tmp->flag [FLAG_IS_WOODED] && find_skill_by_number (op, SK_WOODSMAN))) diff /= 4.0; op->speed_left -= diff;