From c4f99fb2de3fee67b71c49f6ec8d319afbadeb12 Mon Sep 17 00:00:00 2001 From: kinther Date: Fri, 3 Oct 2025 13:21:47 -0700 Subject: [PATCH] Patch rsave to save rooms in zone correctly --- lib/world/obj/1.obj | 2 +- lib/world/rsv/1.rsv | 19 +++++++++++++++++++ src/act.wizard.c | 43 ++++++++++++++++++++++++++++--------------- src/roomsave.c | 7 ++++--- 4 files changed, 52 insertions(+), 19 deletions(-) diff --git a/lib/world/obj/1.obj b/lib/world/obj/1.obj index a41527a..1c54cf0 100644 --- a/lib/world/obj/1.obj +++ b/lib/world/obj/1.obj @@ -382,6 +382,6 @@ rope. Pieces of hide have been tied down, providing a soft yet supportive place for someone to rest upon. ~ 6 0 0 0 0 0 0 0 0 0 0 0 0 -2 0 0 0 +1 0 0 0 10 100 0 0 0 $~ diff --git a/lib/world/rsv/1.rsv b/lib/world/rsv/1.rsv index b315990..c91020e 100644 --- a/lib/world/rsv/1.rsv +++ b/lib/world/rsv/1.rsv @@ -89,3 +89,22 @@ V 5 0 V 6 0 V 7 0 . +#R 200 1759522672 +O 143 0 10 100 0 +X 0 0 +X 1 0 +X 2 0 +X 3 0 +W 0 0 +W 1 0 +W 2 0 +W 3 0 +V 0 1 +V 1 0 +V 2 0 +V 3 0 +V 4 0 +V 5 0 +V 6 0 +V 7 0 +. diff --git a/src/act.wizard.c b/src/act.wizard.c index b774d16..f1b0c12 100644 --- a/src/act.wizard.c +++ b/src/act.wizard.c @@ -5840,39 +5840,52 @@ ACMD(do_msave) ACMD(do_rsave) { - room_rnum rnum = IN_ROOM(ch); + room_rnum rnum; + zone_rnum znum; + int ok; if (IS_NPC(ch)) { send_to_char(ch, "Mobiles can’t use this.\r\n"); return; } - if (rnum == NOWHERE || rnum < 0 || rnum >= top_of_world) { + + /* IN_ROOM(ch) is already a room_rnum (index into world[]). Do NOT pass it to real_room(). */ + rnum = IN_ROOM(ch); + + if (rnum == NOWHERE || rnum < 0 || rnum > top_of_world) { send_to_char(ch, "You are not in a valid room.\r\n"); return; } - zone_rnum znum = world[rnum].zone; + znum = world[rnum].zone; if (znum < 0 || znum > top_of_zone_table) { send_to_char(ch, "This room is not attached to a valid zone.\r\n"); return; } - /* Builder permission: reuse your standard zone edit check */ + /* Optional: permission check */ if (!can_edit_zone(ch, znum)) { send_to_char(ch, "You don’t have permission to modify zone %d.\r\n", zone_table[znum].number); return; } - /* Save immediately, regardless of ROOM_SAVE flag */ - if (RoomSave_now(rnum)) { - send_to_char(ch, "rsave: room %d saved to roomsave file for zone %d.\r\n", - GET_ROOM_VNUM(rnum), zone_table[znum].number); - mudlog(CMP, GET_LEVEL(ch), TRUE, "RSAVE OK: %s saved room %d (zone %d).", - GET_NAME(ch), GET_ROOM_VNUM(rnum), zone_table[znum].number); - } else { - send_to_char(ch, "rsave: failed to save room %d.\r\n", GET_ROOM_VNUM(rnum)); - mudlog(BRF, GET_LEVEL(ch), TRUE, "RSAVE FAIL: %s room %d (zone %d).", - GET_NAME(ch), GET_ROOM_VNUM(rnum), zone_table[znum].number); + /* Save just this room into the correct zone’s .rsv file */ + ok = RoomSave_now(rnum); + + if (!ok) { + send_to_char(ch, "rsave: failed.\r\n"); + mudlog(BRF, GET_LEVEL(ch), TRUE, + "RSAVE FAIL: %s room %d (rnum=%d) zone %d (znum=%d)", + GET_NAME(ch), GET_ROOM_VNUM(rnum), rnum, + zone_table[znum].number, znum); + return; } -} \ No newline at end of file + + send_to_char(ch, "rsave: room %d saved to roomsave file for zone %d.\r\n", + GET_ROOM_VNUM(rnum), zone_table[znum].number); + + mudlog(CMP, GET_LEVEL(ch), TRUE, + "RSAVE OK: %s room %d (rnum=%d) -> world/rsv/%d.rsv", + GET_NAME(ch), GET_ROOM_VNUM(rnum), rnum, zone_table[znum].number); +} diff --git a/src/roomsave.c b/src/roomsave.c index 4a67338..d8eb993 100644 --- a/src/roomsave.c +++ b/src/roomsave.c @@ -213,9 +213,10 @@ static void ensure_dir_exists(const char *path) { /* zone vnum for a given room rnum (e.g., 134 -> zone 1) */ static int roomsave_zone_for_rnum(room_rnum rnum) { - if (rnum == NOWHERE) return -1; - if (world[rnum].zone < 0 || world[rnum].zone > top_of_zone_table) return -1; - return zone_table[ world[rnum].zone ].number; /* zone virtual number (e.g., 1) */ + if (rnum == NOWHERE || rnum < 0 || rnum > top_of_world) return 0; + zone_rnum znum = world[rnum].zone; + if (znum < 0 || znum > top_of_zone_table) return 0; + return zone_table[znum].number; /* e.g., 1 for rooms 100–199, 2 for 200–299, etc. */ } /* lib/world/rsv/.rsv */