--- deliantra/server/common/map.C 2007/09/04 05:43:20 1.124 +++ deliantra/server/common/map.C 2007/09/09 06:25:45 1.128 @@ -780,17 +780,28 @@ void maptile::clear () { - sfree (regions, size ()); regions = 0; - delete [] regionmap; regionmap = 0; - if (spaces) { for (mapspace *ms = spaces + size (); ms-- > spaces; ) while (object *op = ms->bot) { - op = op->head_ (); - op->destroy_inv (false); - op->destroy (); + // manually remove, as to not trigger anything + if (ms->bot = op->above) + ms->bot->below = 0; + + op->flag [FLAG_REMOVED] = true; + + object *head = op->head_ (); + if (op == head) + { + op->destroy_inv (false); + op->destroy (); + } + else if (head->map != op->map) + { + LOG (llevDebug, "bad luck for object crossing map borders: %s", head->debug_desc ()); + head->destroy (); + } } sfree (spaces, size ()), spaces = 0; @@ -798,6 +809,9 @@ if (buttons) free_objectlinkpt (buttons), buttons = 0; + + sfree (regions, size ()); regions = 0; + delete [] regionmap; regionmap = 0; } void @@ -1598,11 +1612,11 @@ return; for_all_players (pl) - if (pl->ob->map == this) + if (pl->observe->map == this) if (client *ns = pl->ns) { - int dx = x - pl->ob->x; - int dy = y - pl->ob->y; + int dx = x - pl->observe->x; + int dy = y - pl->observe->y; int distance = idistance (dx, dy);