r-type  0.0.0
R-Type main
Loading...
Searching...
No Matches
RTypeServer.hpp
Go to the documentation of this file.
1///
2/// @file RTypeServer.hpp
3/// @brief Main game server plugin for R-Type multiplayer
4/// @details This file contains the RTypeServer class which implements the core game server
5/// logic for R-Type multiplayer. It manages the game state, processes player inputs,
6/// updates game entities, handles collision detection, spawns enemies, and broadcasts
7/// world state to connected clients. The server is the authoritative source for all
8/// gameplay logic to ensure fair and synchronized multiplayer experience.
9/// @namespace gme
10/// @author R-Type Team
11/// @date 2025
12///</parameter>
13
14#pragma once
15
16#include <memory>
17#include <unordered_map>
18
19#include "ECS/Registry.hpp"
21#include "Utils/EventBus.hpp"
22
23// New includes for entity management
29
30namespace gme
31{
32
33 ///
34 /// @enum LevelState
35 /// @brief State enumeration for level progression
36 /// @details Tracks the current state of the game level for proper game flow management
37 ///
38 enum class LevelState : uint8_t
39 {
40 WAITING_FOR_PLAYERS = 0, ///< Waiting for players to join before starting
41 IN_PROGRESS = 1, ///< Game is actively running
42 COMPLETED = 2, ///< Level successfully completed (all waves cleared)
43 LOOSE = 3, ///< Game over (all players dead)
44 };
45
46 ///
47 /// @class RTypeServer
48 /// @brief Main game server plugin for R-Type multiplayer gameplay
49 /// @details This class implements the complete server-side game logic including:
50 /// - Entity management (players, enemies, projectiles, powerups)
51 /// - Collision detection and resolution
52 /// - Enemy AI and behavior
53 /// - Wave-based enemy spawning
54 /// - Player input processing
55 /// - Score tracking
56 /// - Game state synchronization
57 /// - World state broadcasting to clients
58 /// - Game over detection
59 ///
60 /// The server operates at a fixed tick rate and broadcasts world state to all
61 /// connected clients. All gameplay logic is server-authoritative to prevent
62 /// cheating and ensure synchronized gameplay across all clients.
63 ///
64 /// @namespace gme
65 ///
66 class RTypeServer final : public IGameServer
67 {
68
69 public:
70 ///
71 /// @brief Constructor
72 /// @details Initializes the game server, ECS registry, and all game systems
73 ///
75
76 ///
77 /// @brief Destructor
78 ///
79 ~RTypeServer() override = default;
80
81 /// @brief Deleted copy constructor (non-copyable)
82 RTypeServer(const RTypeServer &) = delete;
83 /// @brief Deleted copy assignment operator (non-copyable)
84 RTypeServer &operator=(const RTypeServer &) = delete;
85 /// @brief Deleted move constructor (non-movable)
87 /// @brief Deleted move assignment operator (non-movable)
89
90 ///
91 /// @brief Get plugin name
92 /// @return Plugin name identifier
93 ///
94 [[nodiscard]] const std::string getName() const override { return "RType_Server"; }
95
96 ///
97 /// @brief Get plugin type
98 /// @return Plugin type (GAME_SERVER)
99 ///
100 [[nodiscard]] utl::PluginType getType() const override { return utl::PluginType::GAME_SERVER; }
101
102 ///
103 /// @brief Get current game state
104 /// @return Current server state
105 ///
106 [[nodiscard]] State getState() const override { return m_gameState; }
107
108 ///
109 /// @brief Start the game server
110 /// @details Initializes systems and begins listening for game start events
111 ///
112 void start() override;
113
114 ///
115 /// @brief Stop the game server
116 /// @details Cleans up all entities and resets game state
117 ///
118 void stop() override;
119
120 ///
121 /// @brief Update the game server (called each tick)
122 /// @param deltaTime Time elapsed since last update (in seconds)
123 /// @details Processes events, updates entities, runs game systems, and broadcasts state
124 ///
125 void update(float deltaTime) override;
126
127 private:
128 ///
129 /// @brief Process server start event from network layer
130 /// @param event Event containing server configuration
131 /// @details Initializes game systems when server is ready
132 ///
133 void processServerStartEvent(const utl::Event &event);
134
135 ///
136 /// @brief Process player input event
137 /// @param event Event containing player input data (movement, shooting)
138 /// @details Applies player input to corresponding player entity
139 ///
140 void processPlayerInputEvent(const utl::Event &event);
141
142 ///
143 /// @brief Process game start event from lobby system
144 /// @param event Event containing lobby and player information
145 /// @details Creates player entities and starts wave system
146 ///
147 void processGameStartEvent(const utl::Event &event);
148
149 ///
150 /// @brief Process player disconnect event
151 /// @param event Event containing disconnected player's session ID
152 /// @details Removes player entity and checks for game over
153 ///
154 void processPlayerDisconnectEvent(const utl::Event &event);
155
156 ///
157 /// @brief Update entity lifetimes and physics
158 /// @param deltaTime Time elapsed since last frame
159 /// @details Updates projectile lifetimes and entity movement
160 ///
161 void updateEntities(float deltaTime);
162
163 ///
164 /// @brief Update all game systems (AI, collision, spawning)
165 /// @param deltaTime Time elapsed since last frame
166 /// @details Runs enemy AI, collision detection, and wave spawning systems
167 ///
168 void updateSystems(float deltaTime);
169
170 ///
171 /// @brief Broadcast complete world state to all clients
172 /// @details Sends WORLD_STATE packet containing all entity positions and states
173 ///
174 void broadcastWorldState() const;
175
176 ///
177 /// @brief Handle player shooting logic
178 /// @param sessionId Player's session ID
179 /// @param deltaTime Time elapsed since last frame
180 /// @details Creates projectiles when player shoots, respecting cooldown
181 ///
182 void handlePlayerShooting(std::uint32_t sessionId, float deltaTime);
183
184 ///
185 /// @brief Check for game over conditions
186 /// @details Checks if all players are dead or all waves are complete
187 ///
188 void checkGameOver();
189
190 utl::EventBus &m_eventBus; ///< Event bus for inter-system communication
191 ecs::Registry m_registry; ///< ECS registry containing all game entities
192
193 // Entity and system management
194 std::unique_ptr<EntityManager> m_entityManager; ///< Centralized entity lifecycle manager
195 std::unique_ptr<CollisionSystem> m_collisionSystem; ///< Collision detection and resolution system
196 std::unique_ptr<EnemyAISystem> m_enemyAISystem; ///< Enemy behavior and AI system
197 std::unique_ptr<EnemySpawnSystem> m_enemySpawnSystem; ///< Enemy spawning system (legacy/unused)
198 std::unique_ptr<WaveManager> m_waveManager; ///< Wave-based enemy spawning manager
199
200 State m_gameState = State::PLAYING; ///< Current server state
202
203 // Player input tracking
204 std::unordered_map<std::uint32_t, bool> m_playerShooting; ///< Map of session ID to shooting state
205 std::unordered_map<std::uint32_t, float> m_lastShotTime; ///< Map of session ID to last shot timestamp
206
207 float m_lastBroadcastTime = 0.0f; ///< Time since last world state broadcast
208 const float PROJECTILE_COOLDOWN = 0.3f; ///< Cooldown between player shots (seconds)
209
210 }; // class RTypeServer
211} // namespace gme
Server-side collision detection and resolution system for R-Type.
Server-side enemy AI and behavior system for R-Type.
Server-side enemy spawning system for R-Type game progression.
Centralized entity lifecycle management system for R-Type server.
Thread-safe event bus implementation for inter-component communication.
This file contains the Game interface.
This file contains the Registry class declaration.
Wave-based enemy spawning management system for R-Type server.
Class for managing entities and their components.
Definition Registry.hpp:25
Interface for the games.
Main game server plugin for R-Type multiplayer gameplay.
std::unique_ptr< EntityManager > m_entityManager
Centralized entity lifecycle manager.
void update(float deltaTime) override
Update the game server (called each tick)
ecs::Registry m_registry
ECS registry containing all game entities.
State m_gameState
Current server state.
std::unordered_map< std::uint32_t, bool > m_playerShooting
Map of session ID to shooting state.
~RTypeServer() override=default
Destructor.
std::unique_ptr< WaveManager > m_waveManager
Wave-based enemy spawning manager.
RTypeServer()
Constructor.
float m_lastBroadcastTime
Time since last world state broadcast.
const std::string getName() const override
Get plugin name.
LevelState m_levelState
Current level state.
void updateEntities(float deltaTime)
Update entity lifetimes and physics.
void checkGameOver()
Check for game over conditions.
void broadcastWorldState() const
Broadcast complete world state to all clients.
utl::EventBus & m_eventBus
Event bus for inter-system communication.
RTypeServer & operator=(const RTypeServer &)=delete
Deleted copy assignment operator (non-copyable)
std::unordered_map< std::uint32_t, float > m_lastShotTime
Map of session ID to last shot timestamp.
void processServerStartEvent(const utl::Event &event)
Process server start event from network layer.
std::unique_ptr< EnemyAISystem > m_enemyAISystem
Enemy behavior and AI system.
void stop() override
Stop the game server.
void start() override
Start the game server.
std::unique_ptr< EnemySpawnSystem > m_enemySpawnSystem
Enemy spawning system (legacy/unused)
void processGameStartEvent(const utl::Event &event)
Process game start event from lobby system.
void updateSystems(float deltaTime)
Update all game systems (AI, collision, spawning)
utl::PluginType getType() const override
Get plugin type.
const float PROJECTILE_COOLDOWN
Cooldown between player shots (seconds)
void processPlayerInputEvent(const utl::Event &event)
Process player input event.
void processPlayerDisconnectEvent(const utl::Event &event)
Process player disconnect event.
RTypeServer(const RTypeServer &)=delete
Deleted copy constructor (non-copyable)
RTypeServer & operator=(RTypeServer &&)=delete
Deleted move assignment operator (non-movable)
void handlePlayerShooting(std::uint32_t sessionId, float deltaTime)
Handle player shooting logic.
RTypeServer(RTypeServer &&)=delete
Deleted move constructor (non-movable)
std::unique_ptr< CollisionSystem > m_collisionSystem
Collision detection and resolution system.
State getState() const override
Get current game state.
Thread-safe event bus for decoupled component communication.
Definition EventBus.hpp:31
Event structure for inter-component communication.
Definition Event.hpp:89
LevelState
State enumeration for level progression.
@ WAITING_FOR_PLAYERS
Waiting for players to join before starting.
@ COMPLETED
Level successfully completed (all waves cleared)
@ IN_PROGRESS
Game is actively running.
@ LOOSE
Game over (all players dead)
PluginType
Definition IPlugin.hpp:22