diff options
author | Tiger Wang <ziwei.tiger@hotmail.co.uk> | 2016-08-20 14:34:29 +0200 |
---|---|---|
committer | Tiger Wang <ziwei.tiger@hotmail.co.uk> | 2016-08-20 14:34:29 +0200 |
commit | 7175b9e435a54cff33914d21384625a445cc5cf0 (patch) | |
tree | 7feb44f1e8e4ed7ea4d5bf0ba1d173abd3417f34 /src/SpawnPrepare.h | |
parent | Added cWorld:SetSpawn() API and Lua binding (#3316) (diff) | |
download | cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar.gz cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar.bz2 cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar.lz cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar.xz cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.tar.zst cuberite-7175b9e435a54cff33914d21384625a445cc5cf0.zip |
Diffstat (limited to 'src/SpawnPrepare.h')
-rw-r--r-- | src/SpawnPrepare.h | 35 |
1 files changed, 18 insertions, 17 deletions
diff --git a/src/SpawnPrepare.h b/src/SpawnPrepare.h index 1c7a42b2f..4d6064af4 100644 --- a/src/SpawnPrepare.h +++ b/src/SpawnPrepare.h @@ -12,25 +12,19 @@ class cSpawnPrepare { public: - static void PrepareChunks(cWorld & a_World, int a_SpawnChunkX, int a_SpawnChunkZ, int a_PrepareDistance); + cSpawnPrepare(cWorld & a_World, int a_PrepareDistance, std::function<void()> a_PreparationCompletedCallback); -protected: - cWorld & m_World; - int m_SpawnChunkX; - int m_SpawnChunkZ; - int m_PrepareDistance; + static void PrepareChunks(cWorld & a_World, int a_PrepareDistance, std::function<void()> a_PreparationCompletedCallback = {}); - /** The index of the next chunk to be queued in the lighting thread. */ - int m_NextIdx; + /** Generates a random spawnpoint on solid land by walking chunks and finding their biomes */ + static Vector3d GenerateRandomSpawn(cWorld & a_World, int a_PrepareDistance); - /** The maximum index of the prepared chunks. Queueing stops when m_NextIdx reaches this number. */ - int m_MaxIdx; +protected: + cWorld & m_World; + const int m_TotalChunks; /** Total number of chunks already finished preparing. Preparation finishes when this number reaches m_MaxIdx. */ - std::atomic<int> m_NumPrepared; - - /** Event used to signal that the preparation is finished. */ - cEvent m_EvtFinished; + int m_NumPrepared; /** The timestamp of the last progress report emitted. */ std::chrono::steady_clock::time_point m_LastReportTime; @@ -38,12 +32,19 @@ protected: /** Number of chunks prepared when the last progress report was emitted. */ int m_LastReportChunkCount; - cSpawnPrepare(cWorld & a_World, int a_SpawnChunkX, int a_SpawnChunkZ, int a_PrepareDistance, int a_FirstIdx); + std::function<void()> m_PreparationCompletedCallback; void PreparedChunkCallback(int a_ChunkX, int a_ChunkZ); - /** Decodes the index into chunk coords. Provides the specific chunk ordering. */ - void DecodeChunkCoords(int a_Idx, int & a_ChunkX, int & a_ChunkZ); + /** Returns if the biome of the given chunk coordinates is a valid spawn candidate. */ + static bool IsValidSpawnBiome(cWorld & a_World, int a_ChunkX, int a_ChunkZ); + + /** Can the specified coordinates be used as a spawn point? + Returns true if spawn position is valid and sets a_Y to the valid spawn height */ + static bool CanSpawnAt(cWorld & a_World, double a_X, double & a_Y, double a_Z); + + /** Check if player starting point is acceptable */ + static bool CheckPlayerSpawnPoint(cWorld & a_World, int a_PosX, int a_PosY, int a_PosZ); friend class cSpawnPrepareCallback; |