--- deliantra/server/common/map.C 2007/09/12 11:10:09 1.129 +++ deliantra/server/common/map.C 2008/04/15 14:21:04 1.134 @@ -1,11 +1,11 @@ /* - * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. + * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team + * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * Copyright (©) 2001-2003,2007 Mark Wedel & Crossfire Development Team * Copyright (©) 1992,2007 Frank Tore Johansen * - * Crossfire TRT is free software: you can redistribute it and/or modify + * Deliantra is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - * The authors can be reached via e-mail to + * The authors can be reached via e-mail to */ #include @@ -309,7 +309,7 @@ { for (;;) { - coroapi::cede_to_tick_every (100); // cede once in a while + coroapi::cede_to_tick (); // cede once in a while switch (f.kw) { @@ -319,7 +319,32 @@ if (op->inv) sum_weight (op); - insert_ob_in_map (op, this, op, INS_NO_MERGE | INS_NO_WALK_ON | INS_ON_TOP | INS_MAP_LOAD); + if (IN_RANGE_EXC (op->x, 0, width) && IN_RANGE_EXC (op->y, 0, height)) + { + // we insert manually because + // a) its way faster + // b) we remove manually, too, and there are good reasons for that + // c) its correct + mapspace &ms = at (op->x, op->y); + + op->flag [FLAG_REMOVED] = false; + + op->above = 0; + op->below = ms.top; + + if (ms.top) + ms.top->above = op; + else + ms.bot = op; + + ms.top = op; + ms.flags_ = 0; + } + else + { + f.parse_warn (format ("object %s out of range", op->debug_desc ())); + op->destroy (); + } } continue; @@ -1198,7 +1223,7 @@ if (!tile_path[dir]) return 0; - if (tile_map[dir] && (!load || tile_map[dir]->in_memory == MAP_IN_MEMORY)) + if (tile_map[dir] && (!load || tile_map[dir]->in_memory == MAP_ACTIVE)) return 1; if ((tile_map[dir] = find_async (tile_path[dir], this, load))) @@ -1597,11 +1622,11 @@ return; for_all_players (pl) - if (pl->observe->map == this) + if (pl->ob->map == this) if (client *ns = pl->ns) { - int dx = x - pl->observe->x; - int dy = y - pl->observe->y; + int dx = x - pl->ob->x; + int dy = y - pl->ob->y; int distance = idistance (dx, dy);