ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/common/object.C
(Generate patch)

Comparing deliantra/server/common/object.C (file contents):
Revision 1.59 by root, Wed Dec 6 13:59:00 2006 UTC vs.
Revision 1.65 by root, Wed Dec 13 00:42:03 2006 UTC

104 _exit (1); 104 _exit (1);
105 } 105 }
106 106
107 uuid.seq = uid; 107 uuid.seq = uid;
108 write_uuid (); 108 write_uuid ();
109 LOG (llevDebug, "read UID: %lld\n", uid); 109 LOG (llevDebug, "read UID: %" PRId64 "\n", uid);
110 fclose (fp); 110 fclose (fp);
111} 111}
112 112
113UUID 113UUID
114gen_uuid () 114gen_uuid ()
526 526
527 if (settings.casting_time) 527 if (settings.casting_time)
528 casting_time = -1; 528 casting_time = -1;
529} 529}
530 530
531void object::clone (object *destination)
532{
533 *(object_copy *)destination = *this;
534 *(object_pod *)destination = *this;
535
536 if (self || cb)
537 INVOKE_OBJECT (CLONE, this, ARG_OBJECT (destination));
538}
539
540/* 531/*
541 * copy object first frees everything allocated by the second object, 532 * copy_to first frees everything allocated by the dst object,
542 * and then copies the contends of the first object into the second 533 * and then copies the contents of itself into the second
543 * object, allocating what needs to be allocated. Basically, any 534 * object, allocating what needs to be allocated. Basically, any
544 * data that is malloc'd needs to be re-malloc/copied. Otherwise, 535 * data that is malloc'd needs to be re-malloc/copied. Otherwise,
545 * if the first object is freed, the pointers in the new object 536 * if the first object is freed, the pointers in the new object
546 * will point at garbage. 537 * will point at garbage.
547 */ 538 */
548void 539void
549copy_object (object *op2, object *op) 540object::copy_to (object *dst)
550{ 541{
551 bool is_freed = QUERY_FLAG (op, FLAG_FREED); 542 bool is_freed = QUERY_FLAG (dst, FLAG_FREED);
552 bool is_removed = QUERY_FLAG (op, FLAG_REMOVED); 543 bool is_removed = QUERY_FLAG (dst, FLAG_REMOVED);
553 544
554 op2->clone (op); 545 *(object_copy *)dst = *this;
546 *(object_pod *)dst = *this;
547
548 if (self || cb)
549 INVOKE_OBJECT (CLONE, this, ARG_OBJECT (dst));
555 550
556 if (is_freed) 551 if (is_freed)
557 SET_FLAG (op, FLAG_FREED); 552 SET_FLAG (dst, FLAG_FREED);
558 553
559 if (is_removed) 554 if (is_removed)
560 SET_FLAG (op, FLAG_REMOVED); 555 SET_FLAG (dst, FLAG_REMOVED);
561 556
562 if (op2->speed < 0) 557 if (speed < 0)
563 op->speed_left = op2->speed_left - RANDOM () % 200 / 100.0; 558 dst->speed_left = speed_left - RANDOM () % 200 / 100.0;
564 559
565 /* Copy over key_values, if any. */ 560 /* Copy over key_values, if any. */
566 if (op2->key_values) 561 if (key_values)
567 { 562 {
568 key_value *tail = 0; 563 key_value *tail = 0;
569 key_value *i; 564 key_value *i;
570 565
571 op->key_values = 0; 566 dst->key_values = 0;
572 567
573 for (i = op2->key_values; i; i = i->next) 568 for (i = key_values; i; i = i->next)
574 { 569 {
575 key_value *new_link = new key_value; 570 key_value *new_link = new key_value;
576 571
577 new_link->next = 0; 572 new_link->next = 0;
578 new_link->key = i->key; 573 new_link->key = i->key;
579 new_link->value = i->value; 574 new_link->value = i->value;
580 575
581 /* Try and be clever here, too. */ 576 /* Try and be clever here, too. */
582 if (!op->key_values) 577 if (!dst->key_values)
583 { 578 {
584 op->key_values = new_link; 579 dst->key_values = new_link;
585 tail = new_link; 580 tail = new_link;
586 } 581 }
587 else 582 else
588 { 583 {
589 tail->next = new_link; 584 tail->next = new_link;
590 tail = new_link; 585 tail = new_link;
591 } 586 }
592 } 587 }
593 } 588 }
594 589
595 update_ob_speed (op); 590 update_ob_speed (dst);
591}
592
593object *
594object::clone ()
595{
596 object *neu = create ();
597 copy_to (neu);
598 return neu;
596} 599}
597 600
598/* 601/*
599 * If an object with the IS_TURNABLE() flag needs to be turned due 602 * If an object with the IS_TURNABLE() flag needs to be turned due
600 * to the closest player being on the other side, this function can 603 * to the closest player being on the other side, this function can
909 912
910 if (QUERY_FLAG (this, FLAG_FRIENDLY)) 913 if (QUERY_FLAG (this, FLAG_FRIENDLY))
911 remove_friendly_object (this); 914 remove_friendly_object (this);
912 915
913 if (!QUERY_FLAG (this, FLAG_REMOVED)) 916 if (!QUERY_FLAG (this, FLAG_REMOVED))
914 remove_ob (this); 917 remove ();
915 918
916 SET_FLAG (this, FLAG_FREED); 919 SET_FLAG (this, FLAG_FREED);
917 920
918 if (more) 921 if (more)
919 { 922 {
944 947
945 while (op) 948 while (op)
946 { 949 {
947 object *tmp = op->below; 950 object *tmp = op->below;
948 951
949 remove_ob (op); 952 op->remove ();
950 953
951 if (QUERY_FLAG (op, FLAG_STARTEQUIP) 954 if (QUERY_FLAG (op, FLAG_STARTEQUIP)
952 || QUERY_FLAG (op, FLAG_NO_DROP) || op->type == RUNE || op->type == TRAP || QUERY_FLAG (op, FLAG_IS_A_TEMPLATE)) 955 || QUERY_FLAG (op, FLAG_NO_DROP) || op->type == RUNE || op->type == TRAP || QUERY_FLAG (op, FLAG_IS_A_TEMPLATE))
953 free_object (op); 956 op->destroy ();
954 else 957 else
955 { 958 {
956 op->x = x; 959 op->x = x;
957 op->y = y; 960 op->y = y;
958 insert_ob_in_map (op, map, 0, 0); /* Insert in same map as the envir */ 961 insert_ob_in_map (op, map, 0, 0); /* Insert in same map as the envir */
1015 op->carrying -= weight; 1018 op->carrying -= weight;
1016 op = op->env; 1019 op = op->env;
1017 } 1020 }
1018} 1021}
1019 1022
1020/* remove_ob(op): 1023/* op->remove ():
1021 * This function removes the object op from the linked list of objects 1024 * This function removes the object op from the linked list of objects
1022 * which it is currently tied to. When this function is done, the 1025 * which it is currently tied to. When this function is done, the
1023 * object will have no environment. If the object previously had an 1026 * object will have no environment. If the object previously had an
1024 * environment, the x and y coordinates will be updated to 1027 * environment, the x and y coordinates will be updated to
1025 * the previous environment. 1028 * the previous environment.
1203 { 1206 {
1204 top->nrof += op->nrof; 1207 top->nrof += op->nrof;
1205 1208
1206/* CLEAR_FLAG(top,FLAG_STARTEQUIP);*/ 1209/* CLEAR_FLAG(top,FLAG_STARTEQUIP);*/
1207 op->weight = 0; /* Don't want any adjustements now */ 1210 op->weight = 0; /* Don't want any adjustements now */
1208 remove_ob (op); 1211 op->destroy ();
1209 free_object (op);
1210 return top; 1212 return top;
1211 } 1213 }
1212 } 1214 }
1213 1215
1214 return 0; 1216 return 0;
1344 if (op->nrof && !(flag & INS_NO_MERGE)) 1346 if (op->nrof && !(flag & INS_NO_MERGE))
1345 for (tmp = GET_MAP_OB (op->map, x, y); tmp != NULL; tmp = tmp->above) 1347 for (tmp = GET_MAP_OB (op->map, x, y); tmp != NULL; tmp = tmp->above)
1346 if (CAN_MERGE (op, tmp)) 1348 if (CAN_MERGE (op, tmp))
1347 { 1349 {
1348 op->nrof += tmp->nrof; 1350 op->nrof += tmp->nrof;
1349 remove_ob (tmp); 1351 tmp->destroy ();
1350 free_object (tmp);
1351 } 1352 }
1352 1353
1353 CLEAR_FLAG (op, FLAG_APPLIED); /* hack for fixing F_APPLIED in items of dead people */ 1354 CLEAR_FLAG (op, FLAG_APPLIED); /* hack for fixing F_APPLIED in items of dead people */
1354 CLEAR_FLAG (op, FLAG_INV_LOCKED); 1355 CLEAR_FLAG (op, FLAG_INV_LOCKED);
1355 1356
1541 tmp1; 1542 tmp1;
1542 1543
1543 /* first search for itself and remove any old instances */ 1544 /* first search for itself and remove any old instances */
1544 1545
1545 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above) 1546 for (tmp = GET_MAP_OB (op->map, op->x, op->y); tmp != NULL; tmp = tmp->above)
1546 {
1547 if (!strcmp (tmp->arch->name, arch_string)) /* same archetype */ 1547 if (!strcmp (tmp->arch->name, arch_string)) /* same archetype */
1548 { 1548 tmp->destroy ();
1549 remove_ob (tmp);
1550 free_object (tmp);
1551 }
1552 }
1553 1549
1554 tmp1 = arch_to_object (archetype::find (arch_string)); 1550 tmp1 = arch_to_object (archetype::find (arch_string));
1555 1551
1556 tmp1->x = op->x; 1552 tmp1->x = op->x;
1557 tmp1->y = op->y; 1553 tmp1->y = op->y;
1567 */ 1563 */
1568 1564
1569object * 1565object *
1570get_split_ob (object *orig_ob, uint32 nr) 1566get_split_ob (object *orig_ob, uint32 nr)
1571{ 1567{
1572 object * 1568 object *newob;
1573 newob;
1574 int
1575 is_removed = (QUERY_FLAG (orig_ob, FLAG_REMOVED) != 0); 1569 int is_removed = (QUERY_FLAG (orig_ob, FLAG_REMOVED) != 0);
1576 1570
1577 if (orig_ob->nrof < nr) 1571 if (orig_ob->nrof < nr)
1578 { 1572 {
1579 sprintf (errmsg, "There are only %d %ss.", orig_ob->nrof ? orig_ob->nrof : 1, &orig_ob->name); 1573 sprintf (errmsg, "There are only %d %ss.", orig_ob->nrof ? orig_ob->nrof : 1, &orig_ob->name);
1580 return NULL; 1574 return NULL;
1581 } 1575 }
1582 1576
1583 newob = object_create_clone (orig_ob); 1577 newob = object_create_clone (orig_ob);
1584 1578
1585 if ((orig_ob->nrof -= nr) < 1) 1579 if ((orig_ob->nrof -= nr) < 1)
1586 { 1580 orig_ob->destroy (1);
1587 if (!is_removed)
1588 remove_ob (orig_ob);
1589 free_object2 (orig_ob, 1);
1590 }
1591 else if (!is_removed) 1581 else if (!is_removed)
1592 { 1582 {
1593 if (orig_ob->env != NULL) 1583 if (orig_ob->env != NULL)
1594 sub_weight (orig_ob->env, orig_ob->weight * nr); 1584 sub_weight (orig_ob->env, orig_ob->weight * nr);
1595 if (orig_ob->env == NULL && orig_ob->map->in_memory != MAP_IN_MEMORY) 1585 if (orig_ob->env == NULL && orig_ob->map->in_memory != MAP_IN_MEMORY)
1659 esrv_send_item (tmp, op); 1649 esrv_send_item (tmp, op);
1660 } 1650 }
1661 } 1651 }
1662 else 1652 else
1663 { 1653 {
1664 remove_ob (op); 1654 op->remove ();
1665 op->nrof = 0; 1655 op->nrof = 0;
1666 if (tmp) 1656 if (tmp)
1667 { 1657 {
1668 esrv_del_item (tmp->contr, op->count); 1658 esrv_del_item (tmp->contr, op->count);
1669 } 1659 }
1675 1665
1676 if (i < op->nrof) 1666 if (i < op->nrof)
1677 op->nrof -= i; 1667 op->nrof -= i;
1678 else 1668 else
1679 { 1669 {
1680 remove_ob (op); 1670 op->remove ();
1681 op->nrof = 0; 1671 op->nrof = 0;
1682 } 1672 }
1683 1673
1684 /* Since we just removed op, op->above is null */ 1674 /* Since we just removed op, op->above is null */
1685 for (tmp = above; tmp != NULL; tmp = tmp->above) 1675 for (tmp = above; tmp != NULL; tmp = tmp->above)
1694 1684
1695 if (op->nrof) 1685 if (op->nrof)
1696 return op; 1686 return op;
1697 else 1687 else
1698 { 1688 {
1699 free_object (op); 1689 op->destroy ();
1700 return NULL; 1690 return NULL;
1701 } 1691 }
1702} 1692}
1703 1693
1704/* 1694/*
2524 * create clone from object to another 2514 * create clone from object to another
2525 */ 2515 */
2526object * 2516object *
2527object_create_clone (object *asrc) 2517object_create_clone (object *asrc)
2528{ 2518{
2529 object *
2530 dst = NULL, *tmp, *src, *part, *prev, *item; 2519 object *dst = 0, *tmp, *src, *part, *prev, *item;
2531 2520
2532 if (!asrc) 2521 if (!asrc)
2533 return NULL; 2522 return 0;
2523
2534 src = asrc; 2524 src = asrc;
2535 if (src->head) 2525 if (src->head)
2536 src = src->head; 2526 src = src->head;
2537 2527
2538 prev = NULL; 2528 prev = 0;
2539 for (part = src; part; part = part->more) 2529 for (part = src; part; part = part->more)
2540 { 2530 {
2541 tmp = get_object (); 2531 tmp = part->clone ();
2542 copy_object (part, tmp);
2543 tmp->x -= src->x; 2532 tmp->x -= src->x;
2544 tmp->y -= src->y; 2533 tmp->y -= src->y;
2534
2545 if (!part->head) 2535 if (!part->head)
2546 { 2536 {
2547 dst = tmp; 2537 dst = tmp;
2548 tmp->head = NULL; 2538 tmp->head = 0;
2549 } 2539 }
2550 else 2540 else
2551 { 2541 {
2552 tmp->head = dst; 2542 tmp->head = dst;
2553 } 2543 }
2544
2554 tmp->more = NULL; 2545 tmp->more = 0;
2546
2555 if (prev) 2547 if (prev)
2556 prev->more = tmp; 2548 prev->more = tmp;
2549
2557 prev = tmp; 2550 prev = tmp;
2558 } 2551 }
2559 2552
2560 for (item = src->inv; item; item = item->below) 2553 for (item = src->inv; item; item = item->below)
2561 insert_ob_in_ob (object_create_clone (item), dst); 2554 insert_ob_in_ob (object_create_clone (item), dst);
2587 } 2580 }
2588 2581
2589 fprintf (tempfile, obstr); 2582 fprintf (tempfile, obstr);
2590 fclose (tempfile); 2583 fclose (tempfile);
2591 2584
2592 op = get_object (); 2585 op = object::create ();
2593 2586
2594 object_thawer thawer (filename); 2587 object_thawer thawer (filename);
2595 2588
2596 if (thawer) 2589 if (thawer)
2597 load_object (thawer, op, 0); 2590 load_object (thawer, op, 0);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines