Skip to main content

RoomAPI

RoomAPI gives you access to the game's server-side rooms. Rooms are returned as object because IVroom is a game type that can't be referenced directly from a mod — just pass them back into RoomAPI methods and everything works.

Room types

The game has five room types:

GetRoomName()GetRoomType()Description
VWaitingRoomWaitingLobby before a run
MaintenanceRoomMaintenanceBetween-run maintenance phase
DeathMatchRoomDeathMatchPvP arena
(game room)GameActive dungeon run
InvalidNot assigned

Getting rooms

GetCurrentRoom()

public static object? GetCurrentRoom()

Returns the first playable room. This is the room the local player is actively in.

var room = RoomAPI.GetCurrentRoom();
if (room == null) return;

MelonLogger.Msg($"In {RoomAPI.GetRoomName(room)}, day {RoomAPI.GetCurrentGameDay(room)}");

GetAllRooms()

public static object[] GetAllRooms()

All rooms currently tracked by VRoomManager.

GetAllPlayableRooms()

public static List<object> GetAllPlayableRooms()

Filtered to rooms where IsPlayable() returns true.

GetRoom()

public static object? GetRoom(long roomID)

Look up a specific room by its ID.

GetAllRoomIDs()

public static List<long> GetAllRoomIDs()

RoomExists()

public static bool RoomExists(long roomID)

Room identity

GetRoomID()

public static long GetRoomID(object? room)

GetRoomMasterID()

public static int GetRoomMasterID(object? room)

GetRoomName()

public static string GetRoomName(object? room)

Returns the runtime class name: VWaitingRoom, MaintenanceRoom, DeathMatchRoom, etc.

GetRoomType()

public static object? GetRoomType(object? room)

Returns the VRoomType enum value as object. Compare with .ToString():

string type = RoomAPI.GetRoomType(room)?.ToString();
if (type == "Waiting")
MelonLogger.Msg("We are in the lobby");

GetRoomProperty()

public static object? GetRoomProperty(object? room)

Returns the IVRoomProperty object. Use ReflectionHelper to read SessionID, vRoomType, or TargetCurrency from it.

Room state

IsRoomPlayable()

public static bool IsRoomPlayable(object? room)

GetCurrentGameDay()

public static int GetCurrentGameDay(object? room)

GetCurrentSessionCycle()

public static int GetCurrentSessionCycle(object? room)

GetCurrentTick()

public static long GetCurrentTick(object? room)

GetMemberCount()

public static int GetMemberCount(object? room)

GetDeadPlayerCount()

public static int GetDeadPlayerCount(object? room)

IsAllPlayerDead()

public static bool IsAllPlayerDead(object? room)

IsAllPlayerWastedOrDead()

public static bool IsAllPlayerWastedOrDead(object? room)

Players and actors

GetRoomPlayers()

public static List<object> GetRoomPlayers(object? room)

Server-side VPlayer objects from _vPlayerDict. Use ReflectionHelper to read fields on them, or pass them to ActorAPI.

GetRoomActors()

public static List<object> GetRoomActors(object? room)

All actors from _vActorDict — players, monsters, loot objects, etc.

GetRoomLevelObjects()

public static IDictionary? GetRoomLevelObjects(object? room)

Currency

GetRoomCurrency()

public static int GetRoomCurrency(object? room)

GetContaRecoveryRate()

public static long GetContaRecoveryRate(object? room)

Network helpers

GetRoomPlayerCount()

public static int GetRoomPlayerCount(object? room)

GetRoomPlayerDictionary()

public static IDictionary? GetRoomPlayerDictionary(object? room)

Full example

public override void OnUpdate()
{
if (!Input.GetKeyDown(KeyCode.F2)) return;

var rooms = RoomAPI.GetAllRooms();
MelonLogger.Msg($"--- {rooms.Length} rooms ---");

foreach (var room in rooms)
{
string name = RoomAPI.GetRoomName(room);
string type = RoomAPI.GetRoomType(room)?.ToString() ?? "?";
long id = RoomAPI.GetRoomID(room);
int members = RoomAPI.GetMemberCount(room);
int day = RoomAPI.GetCurrentGameDay(room);
bool playable = RoomAPI.IsRoomPlayable(room);

MelonLogger.Msg($"[{type}] {name} id={id} members={members} day={day} playable={playable}");
}
}
warning

All methods return safe defaults (null, 0, empty collections) when passed null. Always null-check GetCurrentRoom() before use.

See also