+ CheckChunkGeneration();
+}
+
+void World::CheckChunkGeneration() {
+ if (player.ChunkCoords() != player_chunk) {
+ player_chunk = player.ChunkCoords();
+
+ constexpr int max_dist = 8;
+ // unload far away chunks
+ for (auto iter(loaded.begin()), end(loaded.end()); iter != end;) {
+ if (std::abs(player_chunk.x - iter->Position().x) > max_dist
+ || std::abs(player_chunk.y - iter->Position().y) > max_dist
+ || std::abs(player_chunk.z - iter->Position().z) > max_dist) {
+ auto saved = iter;
+ ++iter;
+ to_free.splice(to_free.end(), loaded, saved);
+ } else {
+ ++iter;
+ }
+ }
+ // abort far away queued chunks
+ for (auto iter(to_generate.begin()), end(to_generate.end()); iter != end;) {
+ if (std::abs(player_chunk.x - iter->Position().x) > max_dist
+ || std::abs(player_chunk.y - iter->Position().y) > max_dist
+ || std::abs(player_chunk.z - iter->Position().z) > max_dist) {
+ iter = to_generate.erase(iter);
+ } else {
+ ++iter;
+ }
+ }
+ // add missing new chunks
+ const Chunk::Pos offset(max_dist, max_dist, max_dist);
+ Generate(player_chunk - offset, player_chunk + offset);
+ }
+