terrain_alignment_system.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. #include "terrain_alignment_system.h"
  2. #include "../core/component.h"
  3. #include "../core/entity.h"
  4. #include "../core/world.h"
  5. #include "../map/terrain_service.h"
  6. #include "../units/troop_config.h"
  7. namespace Game::Systems {
  8. void TerrainAlignmentSystem::update(Engine::Core::World *world,
  9. float deltaTime) {
  10. auto &terrainService = Game::Map::TerrainService::instance();
  11. if (!terrainService.isInitialized()) {
  12. return;
  13. }
  14. auto entities = world->getEntitiesWith<Engine::Core::TransformComponent>();
  15. for (auto *entity : entities) {
  16. alignEntityToTerrain(entity);
  17. }
  18. }
  19. void TerrainAlignmentSystem::alignEntityToTerrain(
  20. Engine::Core::Entity *entity) {
  21. auto *transform = entity->getComponent<Engine::Core::TransformComponent>();
  22. if (!transform) {
  23. return;
  24. }
  25. auto &terrainService = Game::Map::TerrainService::instance();
  26. float terrainHeight = terrainService.getTerrainHeight(transform->position.x,
  27. transform->position.z);
  28. float entityBaseOffset = 0.0f;
  29. if (auto *unit = entity->getComponent<Engine::Core::UnitComponent>()) {
  30. entityBaseOffset =
  31. Game::Units::TroopConfig::instance().getSelectionRingGroundOffset(
  32. unit->spawnType);
  33. }
  34. transform->position.y = terrainHeight + entityBaseOffset * transform->scale.y;
  35. }
  36. } // namespace Game::Systems