--- deliantra/server/common/object.C 2007/10/16 00:30:24 1.194
+++ deliantra/server/common/object.C 2008/04/10 15:35:15 1.202
@@ -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.
@@ -35,9 +35,8 @@
#include
-int nrofallocobjects = 0;
-static UUID uuid;
-const uint64 UUID_SKIP = 1<<19;
+UUID UUID::cur;
+static const uint64 UUID_SKIP = 1<<19;
objectvec objects;
activevec actives;
@@ -72,7 +71,7 @@
return;
}
- fprintf (fp, "<1,%llx>\n", (unsigned long long)uuid.seq + UUID_SKIP * 2);
+ fprintf (fp, "<1,%llx>\n", (unsigned long long)UUID::cur.seq + UUID_SKIP * 2);
fclose (fp);
rename (filename2, filename1);
}
@@ -91,7 +90,7 @@
if (errno == ENOENT)
{
LOG (llevInfo, "RESET uid to 1\n");
- uuid.seq = 0;
+ UUID::cur.seq = 0;
write_uuid ();
return;
}
@@ -108,27 +107,27 @@
_exit (1);
}
- uuid.seq = uid;
+ UUID::cur.seq = uid;
write_uuid ();
LOG (llevDebug, "read UID: %" PRId64 "\n", uid);
fclose (fp);
}
UUID
-gen_uuid ()
+UUID::gen ()
{
UUID uid;
- uid.seq = ++uuid.seq;
+ uid.seq = ++cur.seq;
- if (!(uuid.seq & (UUID_SKIP - 1)))
+ if (!(cur.seq & (UUID_SKIP - 1)))
write_uuid ();
return uid;
}
void
-init_uuid ()
+UUID::init ()
{
read_uuid ();
}
@@ -309,8 +308,8 @@
if (ob1->self || ob2->self)
{
- int k1 = ob1->self ? HvTOTALKEYS (SvRV (ob1->self)) : 0;
- int k2 = ob2->self ? HvTOTALKEYS (SvRV (ob2->self)) : 0;
+ int k1 = ob1->self ? HvTOTALKEYS (ob1->self) : 0;
+ int k2 = ob2->self ? HvTOTALKEYS (ob2->self) : 0;
if (k1 != k2)
return 0;
@@ -431,12 +430,6 @@
return op;
}
-void
-free_all_object_data ()
-{
- LOG (llevDebug, "%d allocated objects\n", nrofallocobjects);
-}
-
/*
* Sets the owner and sets the skill and exp pointers to owner's current
* skill and experience objects.
@@ -450,6 +443,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;
}
@@ -599,7 +598,7 @@
object::instantiate ()
{
if (!uuid.seq) // HACK
- uuid = gen_uuid ();
+ uuid = UUID::gen ();
speed_left = -0.1f;
/* copy the body_info to the body_used - this is only really
@@ -768,7 +767,7 @@
void object::link ()
{
assert (!index);//D
- uuid = gen_uuid ();
+ uuid = UUID::gen ();
count = ++object_count;
refcnt_inc ();
@@ -931,6 +930,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 +1954,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 +1967,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 +1983,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 +2014,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 +2040,9 @@
if (OB_TYPE_MOVE_BLOCK (ob, ms.move_block))
continue;
+ if (ob->blocked (m, pos.x, pos.y))
+ continue;
+
altern [index++] = i;
}