--- deliantra/server/common/object.C 2007/10/17 19:08:12 1.195
+++ deliantra/server/common/object.C 2008/01/22 16:22:45 1.201
@@ -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,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
*/
/* Eneq(@csd.uu.se): Added weight-modifiers in environment of objects.
@@ -450,6 +450,12 @@
while (owner->owner)
owner = owner->owner;
+ if (flag [FLAG_FREED])
+ {
+ LOG (llevError | logBacktrace, "tried to set owner of %s to %s\n", debug_desc (), owner->debug_desc ());
+ return;
+ }
+
this->owner = owner;
}
@@ -931,6 +937,7 @@
freed_map->name = "/internal/freed_objects_map";
freed_map->width = 3;
freed_map->height = 3;
+ freed_map->nodrop = 1;
freed_map->alloc ();
freed_map->in_memory = MAP_IN_MEMORY;
@@ -1954,12 +1961,11 @@
void
flag_inv (object *op, int flag)
{
- if (op->inv)
- for (object *tmp = op->inv; tmp != NULL; tmp = tmp->below)
- {
- SET_FLAG (tmp, flag);
- flag_inv (tmp, flag);
- }
+ for (object *tmp = op->inv; tmp; tmp = tmp->below)
+ {
+ SET_FLAG (tmp, flag);
+ flag_inv (tmp, flag);
+ }
}
/*
@@ -1968,12 +1974,11 @@
void
unflag_inv (object *op, int flag)
{
- if (op->inv)
- for (object *tmp = op->inv; tmp != NULL; tmp = tmp->below)
- {
- CLEAR_FLAG (tmp, flag);
- unflag_inv (tmp, flag);
- }
+ for (object *tmp = op->inv; tmp; tmp = tmp->below)
+ {
+ CLEAR_FLAG (tmp, flag);
+ unflag_inv (tmp, flag);
+ }
}
/*
@@ -1985,10 +1990,7 @@
* start and stop are where to start relative to the free_arr array (1,9
* does all 4 immediate directions). This returns the index into the
* array of the free spot, -1 if no spot available (dir 0 = x,y)
- * Note - this only checks to see if there is space for the head of the
- * object - if it is a multispace object, this should be called for all
- * pieces.
- * Note2: This function does correctly handle tiled maps, but does not
+ * Note: This function does correctly handle tiled maps, but does not
* inform the caller. However, insert_ob_in_map will update as
* necessary, so the caller shouldn't need to do any special work.
* Note - updated to take an object instead of archetype - this is necessary
@@ -2019,7 +2021,7 @@
* ob doesn't have any move type (when used to place exits)
* so the AND operation in OB_TYPE_MOVE_BLOCK doesn't work.
*/
- if (ob->move_type == 0 && ms.move_block != MOVE_ALL)
+ if (ob && ob->move_type == 0 && ms.move_block != MOVE_ALL)
{
altern [index++] = i;
continue;
@@ -2045,6 +2047,9 @@
if (OB_TYPE_MOVE_BLOCK (ob, ms.move_block))
continue;
+ if (ob->blocked (m, pos.x, pos.y))
+ continue;
+
altern [index++] = i;
}