void SpawnAtBase::Event (bz_EventData *eventData) { switch (eventData->eventType) { case bz_eGetPlayerSpawnPosEvent: // This event is called each time the server needs a new spawn postion { bz_GetPlayerSpawnPosEventData_V1* spawnData = (bz_GetPlayerSpawnPosEventData_V1*)eventData; if (bz_getPlayerSpawnAtBase(spawnData->playerID) && !TeamZones[spawnData->team].empty()) { spawnData->handled = true; float spawnLocation[3]; BaseSpawnZone zone = *select_randomly(TeamZones[spawnData->team].begin(), TeamZones[spawnData->team].end()); bz_getRandomPoint((bz_CustomZoneObject*)&zone, spawnLocation); spawnData->pos[0] = spawnLocation[0]; spawnData->pos[1] = spawnLocation[1]; spawnData->pos[2] = spawnLocation[2]; } } break; default: break; } }
node_id_t dssim_t::get_rand_server() { // Conceptually a broadcast message, or a name service std::vector<node_id_t> servers; for(auto& node_pair : nodes) { if(node_pair.second->server()) servers.push_back(node_pair.second->get_nid()); } auto it = select_randomly(std::begin(servers), std::end(servers), rand_gen); if(it == servers.end()) return (node_id_t)0; return *it; }
Iter select_randomly(Iter start, Iter end) { static std::random_device rd; static std::mt19937 gen(rd()); return select_randomly(start, end, gen); }