summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
Diffstat (limited to 'source')
-rw-r--r--source/Chunk.cpp66
-rw-r--r--source/Chunk.h7
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);