--- deliantra/server/common/object.C 2009/11/10 00:01:31 1.302 +++ deliantra/server/common/object.C 2009/11/29 17:26:28 1.308 @@ -79,7 +79,7 @@ } static void -read_uuid (void) +read_uuid () { char filename[MAX_BUF]; @@ -288,7 +288,7 @@ || ob1->animation_id != ob2->animation_id || (ob1->face != ob2->face && !ob1->animation_id) // face and animation are dependent on each other || ob1->client_type != ob2->client_type - || ob1->materialname != ob2->materialname + || ob1->material != ob2->material || ob1->lore != ob2->lore || ob1->subtype != ob2->subtype || ob1->move_type != ob2->move_type @@ -689,9 +689,6 @@ } } - if (speed < 0) - dst->speed_left -= rndm (); - dst->activate (); } @@ -701,7 +698,12 @@ if (!uuid.seq) // HACK uuid = UUID::gen (); - speed_left = -0.1f; + // TODO: unclean state changes, should nt be done in copy_to AND instantiate + if (flag [FLAG_RANDOM_SPEED] && speed) + speed_left = - speed - rndm (); // TODO animation + else + speed_left = -1.; + /* copy the body_info to the body_used - this is only really * need for monsters, but doesn't hurt to do it for everything. * by doing so, when a monster is created, it has good starting @@ -719,6 +721,11 @@ { object *neu = create (); copy_to (neu); + + // TODO: unclean state changes, should not be done in clone AND instantiate + if (neu->flag [FLAG_RANDOM_SPEED] && neu->speed) + neu->speed_left = - neu->speed - rndm (); // TODO animation + neu->map = map; // not copied by copy_to return neu; } @@ -846,7 +853,8 @@ SET_FLAG (this, FLAG_REMOVED); //expmul = 1.0; declared const for the time being - face = blank_face; + face = blank_face; + material = MATERIAL_NULL; } object::~object () @@ -1127,18 +1135,13 @@ below = 0; env = 0; - /* NO_FIX_PLAYER is set when a great many changes are being - * made to players inventory. If set, avoiding the call - * to save cpu time. - */ - if (pl) - if (pl->is_player () && (glow_radius || !QUERY_FLAG (pl, FLAG_NO_FIX_PLAYER))) - { - pl->update_stats (); + if (pl && pl->is_player ()) + { + pl->contr->queue_stats_update (); - if (glow_radius && pl->is_on_map ()) - update_all_los (pl->map, pl->x, pl->y); - } + if (glow_radius && pl->is_on_map ()) + update_all_los (pl->map, pl->x, pl->y); + } } else if (map) { @@ -1553,7 +1556,7 @@ if (tmp->arch->archname == archname) /* same archetype */ tmp->destroy (); - object *tmp = arch_to_object (archetype::find (archname)); + object *tmp = archetype::find (archname)->instance (); tmp->x = op->x; tmp->y = op->y; @@ -1739,9 +1742,9 @@ update_stats (); update_all_los (map, x, y); } - else if (is_player () && !flag [FLAG_NO_FIX_PLAYER]) + else if (is_player ()) // if this is a player's inventory, update stats - update_stats (); + contr->queue_stats_update (); INVOKE_OBJECT (INSERT, this);