#include "game/server/ServerWorld.h" #include "game/server/Server.h" #include "misc/Random.h" #define MOB_SPAWN_PRECISION 100.0f namespace td { namespace server { ServerWorld::ServerWorld(Server* server, ServerGame* game) : game::World(game), m_CurrentMobID(0), m_Server(server) { } void ServerWorld::spawnMobs(game::MobType type, std::uint8_t level, game::PlayerID sender, std::uint8_t count) { for (int i = 0; i < count; i++) { game::TeamColor senderTeam = m_Game->getPlayers().at(sender).getTeamColor(); game::Spawn* enemyMobSpawn; if (senderTeam == game::TeamColor::Red) { enemyMobSpawn = &getTeam(game::TeamColor::Blue).getSpawn(); } else { enemyMobSpawn = &getTeam(game::TeamColor::Red).getSpawn(); } std::int32_t spawnCenterX = enemyMobSpawn->x; std::int32_t spawnCenterY = enemyMobSpawn->y; std::int32_t minSpawnY = spawnCenterY - 2; std::int32_t maxSpawnY = spawnCenterY + 2; std::int32_t minSpawnX = spawnCenterX - 2; std::int32_t maxSpawnX = spawnCenterX + 2; std::uint64_t randomX = utils::getRandomNumber(std::abs(minSpawnX - maxSpawnX) * MOB_SPAWN_PRECISION); float mobX = (float)randomX / MOB_SPAWN_PRECISION + (float)minSpawnX; std::uint64_t randomY = utils::getRandomNumber(std::abs(minSpawnY - maxSpawnY) * MOB_SPAWN_PRECISION); float mobY = (float)randomY / MOB_SPAWN_PRECISION + (float)minSpawnY; spawnMobAt(m_CurrentMobID, type, level, sender, mobX, mobY, enemyMobSpawn->direction); protocol::SpawnMobPacket packet(m_CurrentMobID, type, level, sender, mobX, mobY, enemyMobSpawn->direction); m_Server->broadcastPacket(&packet); m_CurrentMobID++; } } game::TowerPtr ServerWorld::placeTowerAt(game::TowerType type, std::int32_t x, std::int32_t y, game::PlayerID builder){ game::TowerPtr tower = World::placeTowerAt(m_CurrentTowerID, type, x, y, builder); m_CurrentTowerID++; return tower; } } // namespace server } // namespace td