--- deliantra/server/common/map.C 2008/05/04 14:12:37 1.138 +++ deliantra/server/common/map.C 2008/05/18 19:53:07 1.143 @@ -643,6 +643,7 @@ case KW_per_player: thawer.get (per_player); break; case KW_per_party: thawer.get (per_party); break; case KW_no_reset: thawer.get (no_reset); break; + case KW_no_drop: thawer.get (no_drop); break; case KW_region: default_region = region::find (thawer.get_str ()); break; case KW_shopitems: shopitems = parse_shop_string (thawer.get_str ()); break; @@ -726,6 +727,7 @@ MAP_OUT (reset_timeout); MAP_OUT (fixed_resettime); MAP_OUT (no_reset); + MAP_OUT (no_drop); MAP_OUT (difficulty); if (default_region) MAP_OUT2 (region, default_region->name); @@ -983,10 +985,17 @@ { total_exp += op->stats.exp; - if (archetype *at = type_to_archetype (GENERATE_TYPE (op))) - total_exp += at->stats.exp * 8; + if (archetype *at = op->other_arch) + { + total_exp += at->stats.exp * 8; + monster_cnt++; + } - monster_cnt++; + for (object *inv = op->inv; inv; inv = inv->below) + { + total_exp += op->stats.exp * 8; + monster_cnt++; + } } } @@ -1035,6 +1044,7 @@ /* All clients need to get re-updated for the change */ update_all_map_los (this); + return 1; } @@ -1047,7 +1057,7 @@ void mapspace::update_ () { - object *tmp, *last = 0; + object *last = 0; uint8 flags = P_UPTODATE, light = 0, anywhere = 0; MoveType move_block = 0, move_slow = 0, move_on = 0, move_off = 0, move_allow = 0; @@ -1059,15 +1069,14 @@ object *&middle = faces_obj[1] = 0; object *&floor = faces_obj[2] = 0; - for (tmp = bot; tmp; last = tmp, tmp = tmp->above) + for (object *tmp = bot; tmp; last = tmp, tmp = tmp->above) { /* This could be made additive I guess (two lights better than * one). But if so, it shouldn't be a simple additive - 2 * light bulbs do not illuminate twice as far as once since * it is a dissapation factor that is cubed. */ - if (tmp->glow_radius > light) - light = tmp->glow_radius; + light = max (light, tmp->glow_radius); /* This call is needed in order to update objects the player * is standing in that have animations (ie, grass, fire, etc). @@ -1096,6 +1105,7 @@ middle = tmp; anywhere = 1; } + /* Find the highest visible face around. If equal * visibilities, we still want the one nearer to the * top @@ -1154,7 +1164,7 @@ * 3) neither middle or top is set - need to set both. */ - for (tmp = last; tmp; tmp = tmp->below) + for (object *tmp = last; tmp; tmp = tmp->below) { /* Once we get to a floor, stop, since we already have a floor object */ if (QUERY_FLAG (tmp, FLAG_IS_FLOOR)) @@ -1567,9 +1577,6 @@ object * maptile::insert (object *op, int x, int y, object *originator, int flags) { - if (!op->flag [FLAG_REMOVED]) - op->remove (); - return insert_ob_in_map_at (op, this, originator, flags, x, y); }