Patch rsave to save rooms in zone correctly

This commit is contained in:
kinther 2025-10-03 13:21:47 -07:00
parent b23927580a
commit c4f99fb2de
4 changed files with 52 additions and 19 deletions

View file

@ -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
$~

View file

@ -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
.

View file

@ -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 cant 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 dont 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 zones .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;
}
}
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);
}

View file

@ -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 100199, 2 for 200299, etc. */
}
/* lib/world/rsv/<zone>.rsv */