R-Type
Distributed multiplayer game engine in C++
Loading...
Searching...
No Matches
Server.hpp
Go to the documentation of this file.
1/*
2** EPITECH PROJECT, 2025
3** Created by mael on 08/12/2025.
4** File description:
5** Server.hpp
6*/
7
8#pragma once
9
10#include <cstdint>
11#include <memory>
17
18// Forward declarations
19namespace server {
20 class ServerLoop;
21 class EventBus;
22 class CommandHandler;
23 struct CommandContext;
24} // namespace server
25
26namespace ecs::wrapper {
27 class Entity;
28}
29
31 enum class Action;
32}
33
35 class EntityState;
36}
37
38namespace NetworkMessages {
39 enum class MessageType : uint16_t;
40}
41
74class Server {
75 public:
81 explicit Server(uint16_t port, size_t maxClients = 32);
82
86 ~Server();
87
92 bool initialize();
93
97 void run();
98
102 void stop();
103
104 private:
109 void handlePacket(HostNetworkEvent &event);
110
116
122
128
134
140
146
152
158
164
170
175 void _onMatchmakingRoomCreated(std::shared_ptr<server::Room> room);
176
182
188
194
198 void _broadcastGameState();
199
207
212 void _sendGameStartToRoom(std::shared_ptr<server::Room> room);
213
219 void _sendGameStartToSpectator(uint32_t spectatorId, std::shared_ptr<server::Room> room);
220
225 void _broadcastRoomState(std::shared_ptr<server::Room> room);
226
231 void _broadcastRoomList(const std::vector<IPeer *> &specificPeers);
232
241
253 server::IGameLogic *gameLogic = nullptr);
254
262 void _actionToInput(RType::Messages::Shared::Action action, int &dx, int &dy, bool &shoot);
263
267 std::shared_ptr<server::Session> _getSessionFromPeer(IPeer *peer);
268
272 void _sendPacket(IPeer *peer, NetworkMessages::MessageType type, const std::vector<uint8_t> &payload,
273 bool reliable = true);
274
278 std::vector<RType::Messages::S2C::EntityState> _serializeEntities(
279 std::shared_ptr<ecs::wrapper::ECSWorld> world, server::IGameLogic *gameLogic = nullptr);
280
286 void _sendSystemMessage(uint32_t playerId, const std::string &message);
287
292 void _sendKickedNotification(uint32_t playerId);
293
294 public:
299 std::shared_ptr<server::Lobby> getLobby() const { return _lobby; }
300
305 void notifyRoomUpdate(std::shared_ptr<server::Room> room);
306
312 bool kickPlayer(uint32_t playerId);
313
314 private:
315 uint16_t _port;
317
318 std::unique_ptr<ServerNetworkManager> _networkManager;
319 std::shared_ptr<server::EventBus> _eventBus;
320
321 // Architecture components
322 std::shared_ptr<server::SessionManager> _sessionManager;
323 std::shared_ptr<server::RoomManager> _roomManager;
324 std::shared_ptr<server::Lobby> _lobby;
325 std::unique_ptr<server::CommandHandler> _commandHandler;
326
327 // NOTE: No global _gameLoop anymore - each Room has its own
328
329 // Track session ID to peer mapping for network communication
330 std::unordered_map<std::string, IPeer *> _sessionPeers;
331 // Reverse lookup: peer -> session ID for fast disconnect handling
332 std::unordered_map<IPeer *, std::string> _peerToSession;
333 // Lookup: Player ID -> Session ID for broadcasting
334 std::unordered_map<uint32_t, std::string> _playerIdToSessionId;
335 // Lookup: Player ID -> Username for preference persistence
336 std::unordered_map<uint32_t, std::string> _playerIdToUsername;
337
338 bool _initialized = false;
339 bool _running = false;
340
341 // Frame timing for accurate deltaTime calculation
343};
Type-safe event publication/subscription system.
Definition EventBus.hpp:44
Interface representing a remote peer in the network.
Definition IPeer.hpp:40
State of a single entity.
R-Type server application.
Definition Server.hpp:74
std::shared_ptr< server::EventBus > _eventBus
Definition Server.hpp:319
void _sendGameStartToRoom(std::shared_ptr< server::Room > room)
Send GameStart message to all players in a room.
Definition Server.cpp:1462
std::shared_ptr< server::RoomManager > _roomManager
Definition Server.hpp:323
void _handleLoginRequest(HostNetworkEvent &event)
Handle player login request.
Definition Server.cpp:456
void stop()
Stop the server.
Definition Server.cpp:1282
std::unordered_map< uint32_t, std::string > _playerIdToUsername
Definition Server.hpp:336
void _handleAutoMatchmaking(HostNetworkEvent &event)
Handle auto-matchmaking request.
Definition Server.cpp:726
void _handlePlayerInput(HostNetworkEvent &event)
Handle player input packet.
Definition Server.cpp:516
bool _initialized
Definition Server.hpp:338
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.
Definition Server.cpp:1864
server::FrameTimer _frameTimer
Definition Server.hpp:342
void _broadcastRoomListToAll()
Broadcast room list to ALL connected players on the server.
Definition Server.cpp:1924
~Server()
Destructor - clean shutdown.
Definition Server.cpp:52
void _handleStartGame(HostNetworkEvent &event)
Handle start game request (from room host)
Definition Server.cpp:931
void _broadcastRoomState(std::shared_ptr< server::Room > room)
Broadcast room state (player list) to all players in a room.
Definition Server.cpp:1653
void handlePacket(HostNetworkEvent &event)
Handle incoming packet from client.
Definition Server.cpp:148
void _actionToInput(RType::Messages::Shared::Action action, int &dx, int &dy, bool &shoot)
Convert Action enum to directional input (dx, dy)
Definition Server.cpp:1823
void _handleChatMessage(HostNetworkEvent &event)
Handle chat message from client.
Definition Server.cpp:1008
void _handleLeaveRoom(HostNetworkEvent &event)
Handle leave room request.
Definition Server.cpp:964
std::shared_ptr< server::SessionManager > _sessionManager
Definition Server.hpp:322
std::shared_ptr< server::Lobby > getLobby() const
Get the lobby instance (for commands)
Definition Server.hpp:299
void _sendPacket(IPeer *peer, NetworkMessages::MessageType type, const std::vector< uint8_t > &payload, bool reliable=true)
Helper to send a packet to a peer.
Definition Server.cpp:1852
void notifyRoomUpdate(std::shared_ptr< server::Room > room)
Notify all players in a room of state changes (for commands)
Definition Server.cpp:1187
void _handleJoinRoom(HostNetworkEvent &event)
Handle join room request.
Definition Server.cpp:650
void _handleDisconnect(HostNetworkEvent &event)
Handle player disconnect.
Definition Server.cpp:222
std::unordered_map< std::string, IPeer * > _sessionPeers
Definition Server.hpp:330
bool kickPlayer(uint32_t playerId)
Kick a player from their current room (for commands)
Definition Server.cpp:1200
RType::Messages::S2C::EntityState _serializeEntity(ecs::wrapper::Entity &entity, server::IGameLogic *gameLogic=nullptr)
Serialize a single entity to network format.
Definition Server.cpp:1749
void _broadcastRoomList(const std::vector< IPeer * > &specificPeers)
Broadcast room list to specific peers only.
Definition Server.cpp:1881
std::shared_ptr< server::Session > _getSessionFromPeer(IPeer *peer)
Helper to get session from peer.
Definition Server.cpp:1844
void _handleHandshakeRequest(HostNetworkEvent &event)
Handle player handshake/connection request.
Definition Server.cpp:266
size_t _maxClients
Definition Server.hpp:316
void _onMatchmakingRoomCreated(std::shared_ptr< server::Room > room)
Called when matchmaking service creates a room with matched players.
Definition Server.cpp:855
void _sendKickedNotification(uint32_t playerId)
Send room list to kicked player to return them to lobby.
Definition Server.cpp:1157
std::unordered_map< IPeer *, std::string > _peerToSession
Definition Server.hpp:332
void _processPendingDestructions()
Process entities marked with PendingDestroy component.
Definition Server.cpp:1368
bool _running
Definition Server.hpp:339
void _broadcastGameState()
Broadcast game state to all connected clients.
Definition Server.cpp:1302
void run()
Run the server (blocking until exit)
Definition Server.cpp:1235
void _sendSystemMessage(uint32_t playerId, const std::string &message)
Send a system message to a specific player.
Definition Server.cpp:1115
std::unordered_map< uint32_t, std::string > _playerIdToSessionId
Definition Server.hpp:334
std::unique_ptr< server::CommandHandler > _commandHandler
Definition Server.hpp:325
void _sendGameStartToSpectator(uint32_t spectatorId, std::shared_ptr< server::Room > room)
Send GameStart message to a spectator joining an in-progress game.
Definition Server.cpp:1583
void _handleCreateRoom(HostNetworkEvent &event)
Handle create room request.
Definition Server.cpp:587
std::shared_ptr< server::Lobby > _lobby
Definition Server.hpp:324
bool initialize()
Initialize server systems.
Definition Server.cpp:58
uint16_t _port
Definition Server.hpp:315
std::unique_ptr< ServerNetworkManager > _networkManager
Definition Server.hpp:318
void _handleUpdateAutoMatchmakingPref(HostNetworkEvent &event)
Handle auto-matchmaking preference update (without triggering matchmaking)
Definition Server.cpp:894
void _handleRegisterRequest(HostNetworkEvent &event)
Handle player registration request.
Definition Server.cpp:422
void _handleListRooms(HostNetworkEvent &event)
Handle list rooms request.
Definition Server.cpp:578
High-level entity wrapper providing fluent interface.
Definition ECSWorld.hpp:33
Utility class to measure frame durations.
Interface for server-side game logic orchestration.
Network protocol with unified message format.
Definition Server.hpp:38
MessageType
All message types in the R-Type protocol.
Server-to-Client messages.
Definition Server.hpp:34
Action
Player action enum - matches Cap'n Proto enum.
Represents a network event (connection, disconnection, or received data).
Definition IHost.hpp:32