diff options
-rw-r--r-- | source/Chunk.cpp | 66 | ||||
-rw-r--r-- | source/Chunk.h | 7 |
2 files changed, 73 insertions, 0 deletions
diff --git a/source/Chunk.cpp b/source/Chunk.cpp index 14b4acba7..a119c7c61 100644 --- a/source/Chunk.cpp +++ b/source/Chunk.cpp @@ -2354,6 +2354,72 @@ cChunk * cChunk::GetRelNeighborChunk(int a_RelX, int a_RelZ) +cChunk * cChunk::GetRelNeighborChunkAdjustCoords(int & a_RelX, int & a_RelZ) +{ + bool ReturnThis = true; + int RelX = a_RelX; + int RelZ = a_RelZ; + if (a_RelX < 0) + { + if (m_NeighborXM != NULL) + { + RelX = a_RelX + cChunkDef::Width; + cChunk * Candidate = m_NeighborXM->GetRelNeighborChunkAdjustCoords(RelX, RelZ); + if (Candidate != NULL) + { + a_RelX = RelX; + a_RelZ = RelZ; + return Candidate; + } + } + // Going X-first failed, but if the request is crossing Z as well, let's try the Z-first later on. + ReturnThis = false; + } + else if (a_RelX >= cChunkDef::Width) + { + if (m_NeighborXP != NULL) + { + RelX = a_RelX - cChunkDef::Width; + cChunk * Candidate = m_NeighborXP->GetRelNeighborChunkAdjustCoords(RelX, RelZ); + if (Candidate != NULL) + { + a_RelX = RelX; + a_RelZ = RelZ; + return Candidate; + } + } + // Going X-first failed, but if the request is crossing Z as well, let's try the Z-first later on. + ReturnThis = false; + } + + if (a_RelZ < 0) + { + if (m_NeighborZM != NULL) + { + a_RelZ += cChunkDef::Width; + return m_NeighborZM->GetRelNeighborChunkAdjustCoords(a_RelX, a_RelZ); + // For requests crossing both X and Z, the X-first way has been already tried + } + return NULL; + } + else if (a_RelZ >= cChunkDef::Width) + { + if (m_NeighborZP != NULL) + { + a_RelZ -= cChunkDef::Width; + return m_NeighborZP->GetRelNeighborChunkAdjustCoords(a_RelX, a_RelZ); + // For requests crossing both X and Z, the X-first way has been already tried + } + return NULL; + } + + return (ReturnThis ? this : NULL); +} + + + + + void cChunk::BroadcastAttachEntity(const cEntity & a_Entity, const cEntity * a_Vehicle) { for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr ) diff --git a/source/Chunk.h b/source/Chunk.h index 506d0cd0f..a1a6bc1d7 100644 --- a/source/Chunk.h +++ b/source/Chunk.h @@ -159,6 +159,13 @@ public: */ cChunk * GetRelNeighborChunk(int a_RelX, int a_RelZ); + /** + Returns the chunk into which the relatively-specified block belongs, by walking the neighbors. + Also modifies the relative coords from this-relative to return-relative. + Will return self if appropriate. Returns NULL if not reachable through neighbors. + */ + cChunk * GetRelNeighborChunkAdjustCoords(int & a_RelX, int & a_RelZ); + EMCSBiome GetBiomeAt(int a_RelX, int a_RelZ) const {return cChunkDef::GetBiome(m_BiomeMap, a_RelX, a_RelZ); } void CollectPickupsByPlayer(cPlayer * a_Player); |