You could.. or you could just write a function to renumber an area.
(Works on my mud, you WILL need to change it to work on yours)
void do_renumber(CHAR_DATA *ch, char *argument)
{
extern int port;
char arg[MSL];
char test[1];
long base, difference, vnum, room;
AREA_DATA *pArea;
if (port == 1536 || port == 1538){
ptc(ch, "This command cannot be used on live or build.\n\r");
return;
}
if (IS_WILDERNESS(ch->in_room)){
ptc(ch, "Not in the wilderness.\n\r");
return;
}
test[0]=1;
if (argument[0] == 0 || arg[0] == 0){
ptc(ch, "Syntax: renumber <min vnum>\n\r");
return;
}
if (atol(argument) == 0){
ptc(ch, "Sorry, not supporting 0 as an argument.\n\r");
return;
}
base = atol(argument);
do_links(ch, test);
if (test[0] == 'Y'){
ptc(ch, "Cannot renumber areas with links.\n\r");
return;
}
for (pArea = area_first; pArea; pArea = pArea->next){
if (pArea->min_vnum <= base && pArea->max_vnum >=base){
ptc(ch, "Area '%s' conflicts with base vnum.\n\r",
pArea->file_name);
return;
}
}
difference = base - ch->in_room->area->min_vnum;
room = ch->in_room->vnum + difference;
/* renumber rooms */
for (vnum = ch->in_room->area->min_vnum;
vnum<ch->in_room->area->max_vnum; vnum++){
ROOM_INDEX_DATA *r;
OBJ_INDEX_DATA *o;
MOB_INDEX_DATA *m;
PROG_LIST *mplist;
PROG_CODE *mpcode;
RESET_DATA *reset;
EXIT_DATA *exits;
int i;
r = pRoomArray[vnum];
if (r){
pRoomArray[vnum + difference] = r;
pRoomArray[vnum + difference]->vnum += difference;
/* and do the resets */
for ( reset = get_room_reset(pRoomArray[vnum+difference]); reset;
reset = reset->next ){
reset->arg1 += difference;
reset->arg3 += difference;
}
pRoomArray[vnum] = NULL;
/* go through the exits, change keys! */
for (i=0; i<MAX_DIR; i++){
exits = get_exit(0, r, i);
if (!exits) continue;
if (exits->key>0){
if (exits->key >= ch->in_room->area->min_vnum && exits->key
<= ch->in_room->area->max_vnum)
exits->key+=difference;
}
}
}
/* renumber the object */
o = pObjArray[vnum];
if (o){
pObjArray[vnum + difference] = o;
pObjArray[vnum + difference]->vnum += difference;
pObjArray[vnum] = NULL;
if (o->item_type == ITEM_PORTAL){
if (o->value[3] >= ch->in_room->area->min_vnum && o->value[3] <=
ch->in_room->area->max_vnum)
o->value[3]+=difference;
}
}
/* renumber the mob */
m = pMobArray[vnum];
if (m){
pMobArray[vnum + difference] = m;
pMobArray[vnum + difference]->vnum += difference;
/* mprog list */
for (mplist = pMobArray[vnum+difference]->mprogs; mplist != NULL;
mplist = mplist->next)
mplist->vnum += difference;
/* shop time */
if (pMobArray[vnum+difference]->pShop)
pMobArray[vnum+difference]->pShop->keeper += difference;
pMobArray[vnum] = NULL;
}
/* renumber mob progs */
mpcode = pMprogArray[vnum];
if (mpcode){
pMprogArray[vnum + difference] = mpcode;
pMprogArray[vnum + difference]->vnum += difference;
pMprogArray[vnum] = NULL;
}
}
/*now make area changes */
ch->in_room->area->min_vnum += difference;
ch->in_room->area->max_vnum += difference;
ch->in_room = pRoomArray[room];
ptc(ch, "Done. Base vnum of '%s' is %ld.\n\r", ch->in_room->area->name,
base);
ptc(ch, "Saving the world....\n\r");
process_output(ch->desc, FALSE);
do_asave(ch, "world");
}
/* this function will go through the current areas vnums and report what
* vnums have links to other areas */
void do_links (CHAR_DATA *ch, char *argument)
{
long i;
sh_int exits;
EXIT_DATA *pexit;
OBJ_DATA *obj;
bool passed = TRUE;
if (IS_WILDERNESS(ch->in_room)){
ptc(ch, "Not used in the wilderness\n\r");
return;
}
if (argument[0]==0)
/* command executed
* Not 0 means it was passed from another command, like renumber
*/
passed=FALSE;
for (i=ch->in_room->area->min_vnum; i<=ch->in_room->area->max_vnum; i++){
/* check for the room */
if (pRoomArray[i]){
for(exits=0; exits<MAX_DIR; exits++){
pexit = get_exit(ch, pRoomArray[i], exits);
if (!pexit) continue;
if (pexit->u1.to_room->vnum < ch->in_room->area->min_vnum ||
pexit->u1.to_room->vnum >
ch->in_room->area->max_vnum){
if (!passed)
ptc(ch, "Room %ld links to %ld [%s].\n\r", i,
pexit->u1.to_room->vnum, dir_name[exits]);
else
argument[0]='Y';
}
}
if (!passed){
for (obj = get_room_objs(pRoomArray[i]); obj; obj =
obj->next_content){
if (obj->item_type == ITEM_PORTAL){
if (obj->value[3] < ch->in_room->area->min_vnum ||
obj->value[3] > ch->in_room->area->max_vnum){
ptc(ch, "Room %ld has a portal to %ld.\n\r", i,
obj->value[3]);
}
}
}
}
}
}
}
> -----Original Message-----
> From: Matthew Kerwin [mailto:[EMAIL PROTECTED]
> Sent: Monday, January 07, 2002 11:02 AM
> To: [email protected]
> Subject: New VNums
>
>
> It's late, I'm tired, and I haven't touched my little ROM for
> a few months.
> That said, I was just about to head to bed when I had an
> idea. You know how
> there are (probably) several really groovy little non-stock
> area files
> floating around there, right? And like some of them more than
> likely have
> overlapping VNums, right? Which means the person who uses
> them has to go
> through and change every single number in the file.. would it
> be feasible to
> use relative numbers? Like if I had a little area that had a
> little mob in a
> little room with a little sword, I could assign them all as '0' (or
> whatever), and then whoever downloads my little area could simply set
> somewhere the 'add the vnum to this base' number, to get a
> totally unique id
> for each thingy.
>
> I know that could potentially make saving pfiles annoying if
> you're in the
> habit of continually adding/removing/changing area files, but
> then again
> it's already annoying isn't it?
>
> Matty
> Brainstorming too late on too little Coke
> -----
> I'm not dead.
>
> _________________________________________________________________
> Chat with friends online, try MSN Messenger: http://messenger.msn.com
>
>
> --
> ROM mailing list
> [email protected]
> http://www.rom.org/cgi-bin/mailman/listinfo/rom
>