32 for (
const auto &[projId, projEntity] : projectiles)
40 if (!projMetadata->isActive)
44 if (!projProjectile || projProjectile->pierce_remaining <= 0)
47 float projX, projY, projRadius;
52 for (
const auto &[enemyId, enemyEntity] : enemies)
55 if (!enemyMetadata || !enemyMetadata->isActive)
58 float enemyX, enemyY, enemyRadius;
69 std::uint32_t ownerId = projMetadata->
ownerId;
75 projProjectile->pierce_remaining--;
83 if (projProjectile->pierce_remaining <= 0)
98 for (
const auto &[projId, projEntity] : projectiles)
105 if (!projMetadata->isActive)
108 float projX, projY, projRadius;
117 for (
const auto &[playerId, playerEntity] : players)
119 float playerX, playerY, playerRadius;
149 for (
const auto &[playerId, playerEntity] : players)
151 float playerX, playerY, playerRadius;
156 for (
const auto &[enemyId, enemyEntity] : enemies)
159 if (!enemyMetadata || !enemyMetadata->isActive)
162 float enemyX, enemyY, enemyRadius;
173 float damage = enemy ? enemy->
damage : 10.0f;
214 if (enemy->health <= 0.0f)
219 if (attackerPlayerId > 0)
227 switch (enemyMetadata->type)
258 utl::Logger::log(
"CollisionSystem: Player " + std::to_string(playerId) +
" has no health component",
263 health->current -= damage;
265 utl::Logger::log(
"CollisionSystem: Player " + std::to_string(playerId) +
" took " + std::to_string(damage) +
266 " damage (health: " + std::to_string(health->current) +
"/" + std::to_string(health->max) +
271 if (health->current <= 0.0f)
273 health->current = 0.0f;
Server-side collision detection and resolution system for R-Type.
This file contains the Logger class.
Class for managing entities and their components.
T * getComponent(Entity e)
bool getCollisionInfo(ecs::Entity entity, float &x, float &y, float &radius) const
Extract collision information from an entity.
void update(ecs::Registry ®istry, float dt) override
void handlePlayerPowerupCollision()
Handle collisions between players and powerups.
bool checkCircleCollision(float x1, float y1, float r1, float x2, float y2, float r2, float *overlapDist=nullptr) const
Check for circular collision between two entities.
size_t m_collisionCount
Counter for collisions detected this frame.
void handlePlayerProjectileEnemyCollision()
Handle collisions between player projectiles and enemies.
void applyDamageToEnemy(std::uint32_t enemyId, float damage, std::uint32_t attackerPlayerId=0)
Apply damage to an enemy entity.
ecs::Registry & m_registry
ECS registry reference.
void applyDamageToPlayer(std::uint32_t playerId, float damage)
Apply damage to a player entity.
void handleEnemyProjectilePlayerCollision()
Handle collisions between enemy projectiles and players.
EntityManager & m_entityManager
Entity manager reference for spawning/destruction.
void handlePlayerEnemyCollision()
Handle collisions between players and enemies (ramming)
void addScore(std::uint32_t sessionId, int points)
Add points to a player's score.
void markPlayerAsDead(std::uint32_t sessionId)
Mark a player as dead without destroying the entity.
const std::unordered_map< std::uint32_t, ecs::Entity > & getEnemies() const
Get all enemy entities.
ecs::Entity getPlayerEntity(std::uint32_t sessionId) const
Get player entity by session ID (const version)
EntityMetadata * getEntityMetadata(std::uint32_t networkId)
Get entity metadata by network ID.
const std::unordered_map< std::uint32_t, ecs::Entity > & getPlayers() const
Get all player entities.
void destroyProjectile(std::uint32_t projectileId)
Destroy a projectile entity.
void destroyEnemy(std::uint32_t enemyId)
Destroy an enemy entity.
const std::unordered_map< std::uint32_t, ecs::Entity > & getProjectiles() const
Get all projectile entities.
ecs::Entity getEnemy(std::uint32_t enemyId)
Get enemy entity by network ID.
static void log(const std::string &message, const LogLevel &logLevel)
constexpr Entity INVALID_ENTITY
@ ENEMY_ADVANCED
Advanced enemy type (complex behavior)
@ PROJECTILE_PLAYER
Player-fired projectile.
@ ENEMY_BASIC
Basic enemy type (simple behavior)
@ PROJECTILE_ENEMY
Enemy-fired projectile.
@ BOSS
Boss enemy (high health, special patterns)