--- 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; }