--- deliantra/server/socket/request.C 2010/10/16 22:51:52 1.177 +++ deliantra/server/socket/request.C 2011/05/05 18:59:43 1.182 @@ -1,7 +1,7 @@ /* * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007,2008,2009,2010 Marc Alexander Lehmann / Robin Redeker / the Deliantra team + * Copyright (©) 2005,2006,2007,2008,2009,2010,2011 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2001 Mark Wedel * Copyright (©) 1992 Frank Tore Johansen * @@ -164,10 +164,13 @@ { int flags = 0; - if (ob->map->tile_path[0]) flags |= 1; - if (ob->map->tile_path[1]) flags |= 2; - if (ob->map->tile_path[2]) flags |= 4; - if (ob->map->tile_path[3]) flags |= 8; + if (ob->map->tile_path[0]) flags |= 0x01; + if (ob->map->tile_path[1]) flags |= 0x02; + if (ob->map->tile_path[2]) flags |= 0x04; + if (ob->map->tile_path[3]) flags |= 0x08; + // these two are debatable + if (ob->map->tile_path[4]) flags |= 0x10; + if (ob->map->tile_path[5]) flags |= 0x20; socket.send_packet_printf ("mapinfo - spatial %d %d %d %d %d %s", flags, socket.mapx / 2 - ob->x, socket.mapy / 2 - ob->y, @@ -343,7 +346,8 @@ { int dir = *buf++ - '1'; - if (dir >= 0 && dir <= 3) + // maybe we should only allow the four flat directions + if (dir >= 0 && dir < array_length (map->tile_path)) { if (!map->tile_path [dir]) map = 0; @@ -377,10 +381,13 @@ { int flags = 0; - if (map->tile_path[0]) flags |= 1; - if (map->tile_path[1]) flags |= 2; - if (map->tile_path[2]) flags |= 4; - if (map->tile_path[3]) flags |= 8; + if (map->tile_path[0]) flags |= 0x01; + if (map->tile_path[1]) flags |= 0x02; + if (map->tile_path[2]) flags |= 0x04; + if (map->tile_path[3]) flags |= 0x08; + // these two are debatable + if (map->tile_path[4]) flags |= 0x10; + if (map->tile_path[5]) flags |= 0x20; send_packet_printf ("mapinfo %s spatial %d %d %d %d %d %s", token, flags, mapx, mapy, map->width, map->height, &map->path); } @@ -877,19 +884,32 @@ //-GPL -// prefetch maps in an area of PREFETCH x PREFETCH around the player -#define PREFETCH 40 - -// prefetch a generous area around the player +// prefetch some flat area around the player static void -prefetch_surrounding_maps (object *op) +prefetch_surrounding_area (object *op, maptile *map, int range) { - for (maprect *rect = op->map->split_to_tiles (mapwalk_buf, - op->x - PREFETCH , op->y - PREFETCH , - op->x + PREFETCH + 1, op->y + PREFETCH + 1); + for (maprect *rect = map->split_to_tiles (mapwalk_buf, + op->x - range , op->y - range , + op->x + range + 1, op->y + range + 1); rect->m; ++rect) - rect->m->touch (); + { + rect->m->touch (); + rect->m->activate (); + } +} + +// prefetch a generous area around the player, also up and down +void +object::prefetch_surrounding_maps () +{ + prefetch_surrounding_area (this, map, 40); + + if (maptile *m = map->tile_available (TILE_DOWN)) + prefetch_surrounding_area (this, m, 20); + + if (maptile *m = map->tile_available (TILE_UP)) + prefetch_surrounding_area (this, m, 20); } //+GPL @@ -908,13 +928,13 @@ * can get swapped out. If so, don't try to send them a map. All will * be OK once they really log in. */ - if (!ob->map || ob->map->in_memory != MAP_ACTIVE) + if (!ob->map || ob->map->state != MAP_ACTIVE) return; int startlen, oldlen; check_map_change (pl); - prefetch_surrounding_maps (pl->ob); + pl->ob->prefetch_surrounding_maps (); /* do LOS after calls to update_position */ /* unfortunately, we need to udpate los when observing, currently */