R-Type
Distributed multiplayer game engine in C++
Loading...
Searching...
No Matches
Server Class Reference

R-Type server application. More...

#include <Server.hpp>

Collaboration diagram for Server:
Collaboration graph

Public Member Functions

 Server (uint16_t port, size_t maxClients=32)
 Constructor.
 
 ~Server ()
 Destructor - clean shutdown.
 
bool initialize ()
 Initialize server systems.
 
void run ()
 Run the server (blocking until exit)
 
void stop ()
 Stop the server.
 
std::shared_ptr< server::LobbygetLobby () const
 Get the lobby instance (for commands)
 
void notifyRoomUpdate (std::shared_ptr< server::Room > room)
 Notify all players in a room of state changes (for commands)
 
bool kickPlayer (uint32_t playerId)
 Kick a player from their current room (for commands)
 

Private Member Functions

void handlePacket (HostNetworkEvent &event)
 Handle incoming packet from client.
 
void _handleHandshakeRequest (HostNetworkEvent &event)
 Handle player handshake/connection request.
 
void _handleRegisterRequest (HostNetworkEvent &event)
 Handle player registration request.
 
void _handleLoginRequest (HostNetworkEvent &event)
 Handle player login request.
 
void _handlePlayerInput (HostNetworkEvent &event)
 Handle player input packet.
 
void _handleDisconnect (HostNetworkEvent &event)
 Handle player disconnect.
 
void _handleListRooms (HostNetworkEvent &event)
 Handle list rooms request.
 
void _handleCreateRoom (HostNetworkEvent &event)
 Handle create room request.
 
void _handleJoinRoom (HostNetworkEvent &event)
 Handle join room request.
 
void _handleAutoMatchmaking (HostNetworkEvent &event)
 Handle auto-matchmaking request.
 
void _handleUpdateAutoMatchmakingPref (HostNetworkEvent &event)
 Handle auto-matchmaking preference update (without triggering matchmaking)
 
void _onMatchmakingRoomCreated (std::shared_ptr< server::Room > room)
 Called when matchmaking service creates a room with matched players.
 
void _handleLeaveRoom (HostNetworkEvent &event)
 Handle leave room request.
 
void _handleStartGame (HostNetworkEvent &event)
 Handle start game request (from room host)
 
void _handleChatMessage (HostNetworkEvent &event)
 Handle chat message from client.
 
void _broadcastGameState ()
 Broadcast game state to all connected clients.
 
void _processPendingDestructions ()
 Process entities marked with PendingDestroy component.
 
void _sendGameStartToRoom (std::shared_ptr< server::Room > room)
 Send GameStart message to all players in a room.
 
void _sendGameStartToSpectator (uint32_t spectatorId, std::shared_ptr< server::Room > room)
 Send GameStart message to a spectator joining an in-progress game.
 
void _broadcastRoomState (std::shared_ptr< server::Room > room)
 Broadcast room state (player list) to all players in a room.
 
void _broadcastRoomList (const std::vector< IPeer * > &specificPeers)
 Broadcast room list to specific peers only.
 
void _broadcastRoomListToAll ()
 Broadcast room list to ALL connected players on the server.
 
RType::Messages::S2C::EntityState _serializeEntity (ecs::wrapper::Entity &entity, server::IGameLogic *gameLogic=nullptr)
 Serialize a single entity to network format.
 
void _actionToInput (RType::Messages::Shared::Action action, int &dx, int &dy, bool &shoot)
 Convert Action enum to directional input (dx, dy)
 
std::shared_ptr< server::Session_getSessionFromPeer (IPeer *peer)
 Helper to get session from peer.
 
void _sendPacket (IPeer *peer, NetworkMessages::MessageType type, const std::vector< uint8_t > &payload, bool reliable=true)
 Helper to send a packet to a peer.
 
std::vector< RType::Messages::S2C::EntityState_serializeEntities (std::shared_ptr< ecs::wrapper::ECSWorld > world, server::IGameLogic *gameLogic=nullptr)
 Helper to serialize all entities in a world.
 
void _sendSystemMessage (uint32_t playerId, const std::string &message)
 Send a system message to a specific player.
 
void _sendKickedNotification (uint32_t playerId)
 Send room list to kicked player to return them to lobby.
 

Private Attributes

uint16_t _port
 
size_t _maxClients
 
std::unique_ptr< ServerNetworkManager_networkManager
 
std::shared_ptr< server::EventBus_eventBus
 
std::shared_ptr< server::SessionManager_sessionManager
 
std::shared_ptr< server::RoomManager_roomManager
 
std::shared_ptr< server::Lobby_lobby
 
std::unique_ptr< server::CommandHandler_commandHandler
 
std::unordered_map< std::string, IPeer * > _sessionPeers
 
std::unordered_map< IPeer *, std::string > _peerToSession
 
std::unordered_map< uint32_t, std::string > _playerIdToSessionId
 
std::unordered_map< uint32_t, std::string > _playerIdToUsername
 
bool _initialized = false
 
bool _running = false
 
server::FrameTimer _frameTimer
 

Detailed Description

R-Type server application.

Encapsulates the entire server with proper architecture:

  • Session management (player authentication and tracking)
  • Room management (game lobbies and instances)
  • Network communication (ServerNetworkManager)
  • Game logic per room (ECS + ServerLoop)
  • World synchronization

Architecture: Server ├── SessionManager (track connected players) ├── RoomManager (manage game instances) │ └── Room (contains players + game loop) │ └── ServerLoop (60 Hz) │ └── World (wraps ECS Registry) │ └── GameLogic (8 systems) └── EventBus (global events)

THREAD 1: Network (ServerNetworkManager) THREAD 2: Game loop per room (ECS + broadcast)

Usage:

Server server(4242);
if (server.initialize()) {
server.run();
}
R-Type server application.
Definition Server.hpp:74

Definition at line 74 of file Server.hpp.

Constructor & Destructor Documentation

◆ Server()

Server::Server ( uint16_t  port,
size_t  maxClients = 32 
)
explicit

Constructor.

Parameters
portPort to listen on
maxClientsMaximum number of clients

Definition at line 50 of file Server.cpp.

◆ ~Server()

Server::~Server ( )

Destructor - clean shutdown.

Definition at line 52 of file Server.cpp.

References deinitializeNetworking(), LOG_INFO, and stop().

Here is the call graph for this function:

Member Function Documentation

◆ _actionToInput()

void Server::_actionToInput ( RType::Messages::Shared::Action  action,
int &  dx,
int &  dy,
bool &  shoot 
)
private

Convert Action enum to directional input (dx, dy)

Parameters
actionThe action to convert
dxOutput: X direction (-1, 0, 1)
dyOutput: Y direction (-1, 0, 1)
shootOutput: true if shooting

Definition at line 1823 of file Server.cpp.

Referenced by _handlePlayerInput().

◆ _broadcastGameState()

◆ _broadcastRoomList()

void Server::_broadcastRoomList ( const std::vector< IPeer * > &  specificPeers)
private

◆ _broadcastRoomListToAll()

void Server::_broadcastRoomListToAll ( )
private

◆ _broadcastRoomState()

◆ _getSessionFromPeer()

std::shared_ptr< server::Session > Server::_getSessionFromPeer ( IPeer peer)
private

◆ _handleAutoMatchmaking()

void Server::_handleAutoMatchmaking ( HostNetworkEvent event)
private

◆ _handleChatMessage()

◆ _handleCreateRoom()

◆ _handleDisconnect()

void Server::_handleDisconnect ( HostNetworkEvent event)
private

Handle player disconnect.

Parameters
eventNetwork event with peer info

Definition at line 222 of file Server.cpp.

References _broadcastRoomListToAll(), _broadcastRoomState(), _eventBus, _getSessionFromPeer(), _peerToSession, _playerIdToSessionId, _roomManager, _sessionManager, _sessionPeers, LOG_INFO, and HostNetworkEvent::peer.

Referenced by handlePacket().

Here is the call graph for this function:

◆ _handleHandshakeRequest()

◆ _handleJoinRoom()

◆ _handleLeaveRoom()

void Server::_handleLeaveRoom ( HostNetworkEvent event)
private

Handle leave room request.

Parameters
eventNetwork event with packet data

Definition at line 964 of file Server.cpp.

References _broadcastRoomListToAll(), _broadcastRoomState(), _getSessionFromPeer(), _roomManager, _sendPacket(), LOG_INFO, LOG_WARNING, HostNetworkEvent::peer, NetworkMessages::S2C_LEFT_ROOM, and RType::Messages::S2C::LeftRoom::serialize().

Referenced by handlePacket().

Here is the call graph for this function:

◆ _handleListRooms()

void Server::_handleListRooms ( HostNetworkEvent event)
private

Handle list rooms request.

Parameters
eventNetwork event with packet data

Definition at line 578 of file Server.cpp.

References _broadcastRoomList(), and LOG_INFO.

Referenced by handlePacket().

Here is the call graph for this function:

◆ _handleLoginRequest()

◆ _handlePlayerInput()

void Server::_handlePlayerInput ( HostNetworkEvent event)
private

Handle player input packet.

Parameters
eventNetwork event with packet data

Definition at line 516 of file Server.cpp.

References _actionToInput(), _getSessionFromPeer(), _roomManager, NetworkMessages::getPayload(), RType::Messages::C2S::PlayerInput::inputs, LOG_WARNING, HostNetworkEvent::packet, and HostNetworkEvent::peer.

Referenced by handlePacket().

Here is the call graph for this function:

◆ _handleRegisterRequest()

◆ _handleStartGame()

void Server::_handleStartGame ( HostNetworkEvent event)
private

Handle start game request (from room host)

Parameters
eventNetwork event with packet data

Definition at line 931 of file Server.cpp.

References _getSessionFromPeer(), _roomManager, LOG_INFO, LOG_WARNING, HostNetworkEvent::peer, and server::WAITING.

Referenced by handlePacket().

Here is the call graph for this function:

◆ _handleUpdateAutoMatchmakingPref()

void Server::_handleUpdateAutoMatchmakingPref ( HostNetworkEvent event)
private

Handle auto-matchmaking preference update (without triggering matchmaking)

Parameters
eventNetwork event containing AutoMatchmaking message

Definition at line 894 of file Server.cpp.

References _getSessionFromPeer(), _playerIdToUsername, _sessionManager, RType::Messages::C2S::AutoMatchmaking::enabled, NetworkMessages::getPayload(), LOG_ERROR, LOG_INFO, LOG_WARNING, HostNetworkEvent::packet, and HostNetworkEvent::peer.

Referenced by handlePacket().

Here is the call graph for this function:

◆ _onMatchmakingRoomCreated()

void Server::_onMatchmakingRoomCreated ( std::shared_ptr< server::Room room)
private

Called when matchmaking service creates a room with matched players.

Parameters
roomNewly created room with players

Definition at line 855 of file Server.cpp.

References _broadcastRoomListToAll(), _broadcastRoomState(), _playerIdToSessionId, _sendPacket(), _sessionPeers, LOG_INFO, LOG_WARNING, NetworkMessages::S2C_JOINED_ROOM, and RType::Messages::S2C::JoinedRoom::serialize().

Referenced by initialize().

Here is the call graph for this function:

◆ _processPendingDestructions()

void Server::_processPendingDestructions ( )
private

Process entities marked with PendingDestroy component.

Sends EntityDestroyed messages to clients and removes entities from the registry. This ensures clients properly cleanup entities instead of interpolating to old positions.

Definition at line 1368 of file Server.cpp.

References _playerIdToSessionId, _roomManager, _sessionPeers, NetworkMessages::createMessage(), createPacket(), ecs::Expired, server::ServerLoop::getECSWorld(), ecs::PendingDestroy::getReason(), ecs::Killed, LOG_DEBUG, LOG_INFO, ecs::Manual, ecs::OutOfBounds, RELIABLE, NetworkMessages::S2C_ENTITY_DESTROYED, and RType::Messages::S2C::EntityDestroyed::serialize().

Referenced by run().

Here is the call graph for this function:

◆ _sendGameStartToRoom()

◆ _sendGameStartToSpectator()

◆ _sendKickedNotification()

void Server::_sendKickedNotification ( uint32_t  playerId)
private

Send room list to kicked player to return them to lobby.

Parameters
playerIdPlayer ID that was kicked

Definition at line 1157 of file Server.cpp.

References _playerIdToSessionId, _sendPacket(), _sessionPeers, LOG_DEBUG, LOG_INFO, LOG_WARNING, NetworkMessages::S2C_LEFT_ROOM, and RType::Messages::S2C::LeftRoom::serialize().

Referenced by kickPlayer().

Here is the call graph for this function:

◆ _sendPacket()

◆ _sendSystemMessage()

void Server::_sendSystemMessage ( uint32_t  playerId,
const std::string &  message 
)
private

Send a system message to a specific player.

Parameters
playerIdPlayer ID to send to
messageMessage text

Definition at line 1115 of file Server.cpp.

References _playerIdToSessionId, _sendPacket(), _sessionPeers, LOG_DEBUG, NetworkMessages::S2C_CHAT_MESSAGE, and RType::Messages::S2C::S2CChatMessage::serialize().

Referenced by _handleChatMessage(), and kickPlayer().

Here is the call graph for this function:

◆ _serializeEntities()

std::vector< RType::Messages::S2C::EntityState > Server::_serializeEntities ( std::shared_ptr< ecs::wrapper::ECSWorld world,
server::IGameLogic gameLogic = nullptr 
)
private

Helper to serialize all entities in a world.

Definition at line 1864 of file Server.cpp.

References _serializeEntity(), and LOG_ERROR.

Referenced by _sendGameStartToRoom(), and _sendGameStartToSpectator().

Here is the call graph for this function:

◆ _serializeEntity()

◆ getLobby()

std::shared_ptr< server::Lobby > Server::getLobby ( ) const
inline

Get the lobby instance (for commands)

Returns
Shared pointer to Lobby

Definition at line 299 of file Server.hpp.

References _lobby.

Referenced by server::ListCommand::execute().

◆ handlePacket()

◆ initialize()

bool Server::initialize ( )

◆ kickPlayer()

bool Server::kickPlayer ( uint32_t  playerId)

Kick a player from their current room (for commands)

Parameters
playerIdPlayer ID to kick
Returns
true if player was kicked successfully

Definition at line 1200 of file Server.cpp.

References _broadcastRoomListToAll(), _broadcastRoomState(), _eventBus, _roomManager, _sendKickedNotification(), _sendSystemMessage(), LOG_INFO, and LOG_WARNING.

Referenced by server::KickCommand::execute().

Here is the call graph for this function:

◆ notifyRoomUpdate()

void Server::notifyRoomUpdate ( std::shared_ptr< server::Room room)

Notify all players in a room of state changes (for commands)

Parameters
roomRoom to broadcast state for

Definition at line 1187 of file Server.cpp.

References _broadcastRoomListToAll(), _broadcastRoomState(), LOG_DEBUG, and LOG_WARNING.

Here is the call graph for this function:

◆ run()

◆ stop()

void Server::stop ( )

Stop the server.

Definition at line 1282 of file Server.cpp.

References _eventBus, _networkManager, _roomManager, _running, and LOG_INFO.

Referenced by ~Server().

Member Data Documentation

◆ _commandHandler

std::unique_ptr<server::CommandHandler> Server::_commandHandler
private

Definition at line 325 of file Server.hpp.

Referenced by _handleChatMessage(), and initialize().

◆ _eventBus

std::shared_ptr<server::EventBus> Server::_eventBus
private

Definition at line 319 of file Server.hpp.

Referenced by _handleDisconnect(), initialize(), kickPlayer(), run(), and stop().

◆ _frameTimer

server::FrameTimer Server::_frameTimer
private

Definition at line 342 of file Server.hpp.

Referenced by run().

◆ _initialized

bool Server::_initialized = false
private

Definition at line 338 of file Server.hpp.

Referenced by initialize(), and run().

◆ _lobby

std::shared_ptr<server::Lobby> Server::_lobby
private

◆ _maxClients

size_t Server::_maxClients
private

Definition at line 316 of file Server.hpp.

Referenced by initialize(), and run().

◆ _networkManager

std::unique_ptr<ServerNetworkManager> Server::_networkManager
private

Definition at line 318 of file Server.hpp.

Referenced by initialize(), run(), and stop().

◆ _peerToSession

std::unordered_map<IPeer *, std::string> Server::_peerToSession
private

◆ _playerIdToSessionId

◆ _playerIdToUsername

std::unordered_map<uint32_t, std::string> Server::_playerIdToUsername
private

◆ _port

uint16_t Server::_port
private

Definition at line 315 of file Server.hpp.

Referenced by initialize(), and run().

◆ _roomManager

◆ _running

bool Server::_running = false
private

Definition at line 339 of file Server.hpp.

Referenced by run(), and stop().

◆ _sessionManager

◆ _sessionPeers


The documentation for this class was generated from the following files: