void Server::spawnPlayer(Player *player) { std::vector<SpawnpointMarker*> validPositions; SpawnpointMarker *bestSpawn; for(SpawnPool::iterator ii = spawns.begin(); ii != spawns.end(); ++ii) { bool isSpawnOK = true; for (Entpool::iterator jj = entities.begin(); jj != entities.end(); ++jj) { if(jj->second->getEntId() == (*ii)->getEntId()) continue; Vector2D displacement = (jj->second->getPosition().positionVector() - (*ii)->getPosition().positionVector()); if (displacement.getMagnitude() < 40.0f) { isSpawnOK = false; break; } } if((*ii)->team != team_free && (*ii)->team != player->getTeam()) isSpawnOK = false; if (isSpawnOK) validPositions.push_back(*ii); } if(spawns.size() == 0) { player->setPosition(Position(0,0)); } else if(validPositions.size() == 0) // All spawn points are filled, so pick { // one at random. - This causes ships to spawn on top of each other [eric] bestSpawn = spawns[ rand()%spawns.size() ]; player->setPosition(bestSpawn->getPosition()); } else { bestSpawn = validPositions[ rand()%validPositions.size() ]; player->setPosition(bestSpawn->getPosition()); } }
double Vector2D::getAngleBetween(const Vector2D &other) const { double rad = this->dotProduct(other) / (this->getMagnitude() * other.getMagnitude()); return radiansToDegrees(acos(rad)); }