14 : _matchmaking(std::make_shared<
MatchmakingService>(2, 4, nullptr)), _eventBus(nullptr) {
16 LOG_INFO(
"RoomManager created with matchmaking service");
20 std::shared_ptr<EventBus> eventBus)
21 : _matchmaking(matchmaking), _eventBus(eventBus) {
26 LOG_INFO(
"RoomManager created with provided matchmaking service");
31 LOG_ERROR(
"Cannot add player to matchmaking - service not initialized");
36 LOG_INFO(
"Player ", playerId,
" added to matchmaking (queue size: ",
_matchmaking->getQueueSize(),
46 LOG_INFO(
"Player ", playerId,
" removed from matchmaking");
50 size_t maxPlayers,
bool isPrivate,
51 float gameSpeedMultiplier) {
52 std::lock_guard<std::recursive_mutex> lock(
_mutex);
61 std::make_shared<Room>(
id, name, maxPlayers, isPrivate, gameSpeedMultiplier,
_eventBus);
64 LOG_INFO(
"✓ Room created: '", room->getName(),
"' (",
id,
")");
66 }
catch (
const std::exception &e) {
67 LOG_ERROR(
"Failed to create room '", name,
"' (",
id,
"): ", e.what());
73 std::lock_guard<std::recursive_mutex> lock(
_mutex);
84 std::lock_guard<std::recursive_mutex> lock(
_mutex);
97 std::lock_guard<std::recursive_mutex> lock(
_mutex);
99 std::vector<std::shared_ptr<Room>> rooms;
100 rooms.reserve(
_rooms.size());
102 for (
const auto &[
id, room] :
_rooms) {
103 rooms.push_back(room);
110 std::lock_guard<std::recursive_mutex> lock(
_mutex);
112 std::vector<std::shared_ptr<Room>> publicRooms;
114 for (
const auto &[
id, room] :
_rooms) {
115 auto info = room->getInfo();
117 publicRooms.push_back(room);
125 std::lock_guard<std::recursive_mutex> lock(
_mutex);
134 std::lock_guard<std::recursive_mutex> lock(
_mutex);
135 for (
auto &[
id, room] :
_rooms) {
136 room->update(deltaTime);
139 std::vector<std::string> roomsToRemove;
140 for (
const auto &[
id, room] :
_rooms) {
142 roomsToRemove.push_back(
id);
146 for (
const auto &
id : roomsToRemove) {
148 LOG_INFO(
"Cleaned up finished room: ",
id);
151 if (!roomsToRemove.empty()) {
152 LOG_INFO(
"Cleaned up ", roomsToRemove.size(),
" finished room(s)");
160 std::lock_guard lock(
_mutex);
162 for (
const auto &[
id, room] :
_rooms) {
163 if (room->hasPlayer(playerId) || room->hasSpectator(playerId)) {
172 std::lock_guard<std::recursive_mutex> lock(
_mutex);
174 std::vector<std::string> roomsToRemove;
176 for (
const auto &[
id, room] :
_rooms) {
178 roomsToRemove.push_back(
id);
182 for (
const auto &
id : roomsToRemove) {
184 LOG_INFO(
"Cleaned up finished room: ",
id);
187 if (!roomsToRemove.empty()) {
188 LOG_INFO(
"Cleaned up ", roomsToRemove.size(),
" finished room(s)");
195 std::function<void(std::shared_ptr<Room>)> callback;
198 std::lock_guard<std::recursive_mutex> lock(
_mutex);
200 std::string roomId = room->getId();
203 LOG_WARNING(
"Match room ", roomId,
" already exists");
208 LOG_INFO(
"✓ Match room registered: ", roomId,
" (", room->getPlayerCount(),
" players)");
Automatic matchmaking service.
std::shared_ptr< Room > createRoom(const std::string &id, const std::string &name="", size_t maxPlayers=4, bool isPrivate=false, float gameSpeedMultiplier=1.0f) override
Create a new room.
bool update(float deltaTime) override
Update all rooms (called by server loop)
std::shared_ptr< Room > getRoom(const std::string &id) override
Retrieve a room by ID.
RoomCreatedCallback _roomCreatedCallback
std::vector< std::shared_ptr< Room > > getAllRooms() override
Get all active rooms.
void removePlayerFromMatchmaking(uint32_t playerId)
Remove player from matchmaking queue.
void cleanupFinishedRooms()
Clean up finished rooms Removes rooms that are in FINISHED state and have no players.
std::shared_ptr< MatchmakingService > _matchmaking
bool removeRoom(const std::string &id) override
Remove a room by ID.
std::recursive_mutex _mutex
size_t getRoomCount() const override
Get number of active rooms.
std::shared_ptr< EventBus > _eventBus
std::shared_ptr< Room > getRoomByPlayer(uint32_t playerId)
Get room by player ID (find which room a player is in)
std::vector< std::shared_ptr< Room > > getPublicRooms() override
Get all public rooms (not private)
void addPlayerToMatchmaking(uint32_t playerId)
Add player to matchmaking queue.
void _onMatchCreated(std::shared_ptr< Room > room)
Handle match created by matchmaking service.
std::unordered_map< std::string, std::shared_ptr< Room > > _rooms