summaryrefslogtreecommitdiffstats
path: root/source/Chunk.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/Chunk.cpp')
-rw-r--r--source/Chunk.cpp66
1 files changed, 66 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 )