Re: Problems with copying objects

From: Christopher Avans (parka@CDC.NET)
Date: 06/14/98


On Sun, 14 Jun 1998, John Evans wrote:

> Greetings,
>         I am trying to copy one obj vnum to another with a 'simple'
> command-line process like: ocopy <orig vnum> <target vnum>
> If the target does not exist, then it is created. I have the creation of
> an object work perfefctly. It's the copying of the original to the target
> that messes things up. I used oedit_save_internally() as a basis for my
> command's copy code, but things just are quite right. If you do something
 Hello this may help you.
  I have a while back added a oclone command. Same result diffrent name.
Basically it started with one making obj with olc toggling some flag and
saving it then using command later I made it so it would handle cloning to
a new vnum. There in your code when you check for existing vnum simply use
oedit.c's functions call oedit_setup_new etc then run thru with checks
if value copy value etc there is a roomclone patch on the circlemud ftp
site under contrib code roomclone.txt that i wrote it does not handle set
up new but shows a very quick way to copy



> like:
> ocopy 100 101
> ocopy 100 101
> (yes, do the same command twice)
>
> Then obj 100 and 101 get very messed up. The numeric data remains intact,
> but the string data is really trashed out. Mostly random characters for
> alias, s-desc, l-desc and d-desc. It seems to me that memory is not being
> (de)allocated properly and I can't manage to track down where. Here is the
> code along with some /* NOTES */ that are included here to clarify my
> non-stock code.
>
> ----------
> ACMD(do_ocopy)
> {
>   /* NOTE: obj_num has been typedef'd to long in structs.h */
>   obj_num vorig, rorig, vdest, rdest;
>   struct extra_descr_data *this, *next_one;
>   struct obj_data *obj, *swap;
>
>   /* NOTE: is_order is a parameter passed as ACMD and is TRUE if someone
>      charms the acting character and orders him to take action */
>   if (is_order && ch->master) {
>     send_to_char("You cannot order others to use immortal powers.\r\n",
>                  ch->master);
>     return;
>   }
>
>   two_arguments(argument, buf, buf2);
>
>   if (!*buf2) {
>     send_to_char("Usage: ocopy <original vnum> <target vnum>\r\n", ch);
>     return;
>   }
>   if (!(isdigit(*buf) && isdigit(*buf2))) {
>     send_to_char("Both arguments must be numbers.\r\n", ch);
>     return;
>   }
>
>   vorig = atol(buf);
>   rorig = real_object(vorig);
>   if (rorig == -1) {
>     send_to_charf(ch, "Object #%ld does not exist!\r\n", vorig);
>     return;
>   }
>
>   vdest = atol(buf2);
>   rdest = real_object(vdest);
>   if (vdest == vorig) {
>     send_to_char("The original and target objects are the same!\r\n", ch);
>     return;
>   }
>
>   /* NOTE: Creators can edit up to four zones. This returns TRUE if the
>      target vnum is in one of the four zones they have access to. */
>   if (!can_alter_vnum(ch, vdest)) {
>     send_to_charf(ch, "You do not have permission alter object #%ld.\r\n",
>                   vdest);
>     return;
>   }
>
>   /* NOTE: This creates the new object and all works well with it. */
>   if (rdest == -1) {  /* Obj doesn't exist. Have to make it. */
>     send_to_charf(ch, "\\c08Creating object #%d.\\c00\r\n", vdest);
>     create_new_obj(vdest);
>     rdest = real_object(vdest);
>     rorig = real_object(vorig);
>   }
>
>   /* NOTE: This is pretty much straight from oedit.c */
>   /* Overwrite existing objects with new prototype */
>   CREATE(swap, struct obj_data, 1);
>   for (obj = object_list; obj; obj = obj->next) {
>     if (obj->item_number == rdest) {
>       *swap = *obj;
>       *obj = *(obj_proto + rorig);
>       obj->in_room = swap->in_room;
>       obj->item_number = rdest;
>       obj->carried_by = swap->carried_by;
>       obj->worn_by = swap->worn_by;
>       obj->worn_on = swap->worn_on;
>       obj->in_obj = swap->in_obj;
>       obj->contains = swap->contains;
>       obj->next_content = swap->next_content;
>       obj->next = swap->next;
>     }
>   }
>   free(swap);
>
>   /* NOTE: The following lines actually copy the object, but I feel
>            that something is missing from how the code is acting, but not
>            sure what. The code is VERY similar to oedit_save_internally,
>            and I compared it to bpl12 w/ Oasis 1.6b and found that the
>            code was the same as what I am currently using. */
>   if (obj_proto[rdest].name)
>     free(obj_proto[rdest].name);
>   if (obj_proto[rdest].description)
>     free(obj_proto[rdest].description);
>   if (obj_proto[rdest].short_description)
>     free(obj_proto[rdest].short_description);
>   if (obj_proto[rdest].detail_description)
>     free(obj_proto[rdest].detail_description);
>   if (obj_proto[rdest].ex_description)
>     for (this = obj_proto[rdest].ex_description; this; this = next_one) {
>       next_one = this->next;
>       if (this->keyword)
>         free(this->keyword);
>       if (this->description)
>         free(this->description);
>       free(this);
>     }
>
>   /* NOTE: I'm really suspiscious of the next line, but not sure what to
>            do with it. */
>   obj_proto[rdest] = *(obj_proto + rorig);
>   obj_proto[rdest].item_number = rdest;
>
>   olc_add_to_save_list((vdest/100), OLC_SAVE_OBJ);
>   send_to_charf(ch, "You copy object #%ld to #%ld.\r\n", vorig, vdest);
> }
> ----------
>
> Any clues as to what is going wrong would be appreciated.
>
> John Evans <evansj@datawest.net>
> http://www.hi-line.net/~evansj/              telnet://spear.gator.net:1066
>
> Any sufficiently advanced technology is indistinguishable from magic.
> --Arthur C. Clarke
>
>
>      +------------------------------------------------------------+
>      | Ensure that you have read the CircleMUD Mailing List FAQ:  |
>      | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
>      +------------------------------------------------------------+
>


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/15/00 PST