Hi. I've had the problem of containers turning up with negative weight all
over my mud. I've ptested enough to find out that when a player dies,
their containers go to their corpse and have the exact weight the object's
prototype has instead of the weight + what's inside of it. For instance,
let's say they are carrying (or holding, it happens on both) a box that has
an empty weight of 10. Now, we put 200 scrolls in it giving it a weight of
210 (scrolls are 1 each). The character dies, their eq is transfered to
their corpse, but the box with 200 scrolls in it now has a weight of 10.
Thus, we remove all the scrolls and the box weighs -190. I don't think the
code that handles object transfer has been altered, but here it is just in
case, any help would be GREATLY appreciated.
void make_corpse(struct char_data * ch)
{
struct obj_data *corpse, *o;
struct obj_data *money;
int i;
int mobhit = 0;
extern int max_npc_corpse_time, max_pc_corpse_time;
struct obj_data *create_money(int amount);
corpse = create_obj();
mobhit = GET_LEVEL(ch);
corpse->maxhitobj = mobhit;
corpse->item_number = NOTHING;
corpse->in_room = NOWHERE;
corpse->name = str_dup("corpse");
sprintf(buf2, "The corpse of %s is lying here.", GET_NAME(ch));
corpse->description = str_dup(buf2);
sprintf(buf2, "the corpse of %s", GET_NAME(ch));
corpse->short_description = str_dup(buf2);
GET_OBJ_TYPE(corpse) = ITEM_CONTAINER;
GET_OBJ_WEAR(corpse) = ITEM_WEAR_TAKE;
GET_OBJ_EXTRA(corpse) = ITEM_NODONATE;
GET_OBJ_EXTRA(corpse) = ITEM_NOAUCT;
GET_OBJ_VAL(corpse, 0) = 0; /* You can't store stuff in a corpse */
GET_OBJ_VAL(corpse, 3) = 1; /* corpse identifier */
GET_OBJ_WEIGHT(corpse) = GET_WEIGHT(ch) + IS_CARRYING_W(ch);
GET_OBJ_RENT(corpse) = 100000;
if (IS_NPC(ch))
GET_OBJ_TIMER(corpse) = max_npc_corpse_time;
else
GET_OBJ_TIMER(corpse) = max_pc_corpse_time;
if (IS_NPC(ch))
GET_OBJ_OWNER(corpse) = -1;
else if (PLR_FLAGGED(ch, PLR_OUTLAW))
GET_OBJ_OWNER(corpse) = 0;
else
GET_OBJ_OWNER(corpse) = GET_IDNUM(ch);
/* transfer character's inventory to the corpse */
corpse->contains = ch->carrying;
for (o = corpse->contains; o != NULL; o = o->next_content)
o->in_obj = corpse;
object_list_new_owner(corpse, NULL);
/* transfer character's equipment to the corpse */
for (i = 0; i < NUM_WEARS; i++)
if (GET_EQ(ch, i))
obj_to_obj(unequip_char(ch, i), corpse);
/* transfer gold */
if (GET_GOLD(ch) > 0) {
/* following 'if' clause added to fix gold duplication loophole */
if (IS_NPC(ch) || (!IS_NPC(ch) && ch->desc)) {
money = create_money(GET_GOLD(ch));
obj_to_obj(money, corpse);
}
GET_GOLD(ch) = 0;
}
ch->carrying = NULL;
IS_CARRYING_N(ch) = 0;
IS_CARRYING_W(ch) = 0;
obj_to_room(corpse, ch->in_room);
if (!IS_NPC(ch) && !ROOM_FLAGGED(ch->in_room, ROOM_ARENA) &&
!PLR_FLAGGED(ch,$
REMOVE_BIT(PLR_FLAGS(ch), PLR_KILLER | PLR_THIEF | PLR_OUTLAW);
}
-------
"Remember, you are unique and special . . . . just like everyone else!"
-Bumpersticker
"Friends help you move. Real friends help you move bodies."
-Bumpersticker
"You believe in God, she believes in Allah, they believe in Jesus . . . .
can I just believe in He-Man?"
-Chuck Reed
-------
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST