#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++; } } } // namespace server } // namespace td