diff options
author | Samuel Barney <samjbarney@gmail.com> | 2013-10-21 22:38:38 +0200 |
---|---|---|
committer | Samuel Barney <samjbarney@gmail.com> | 2013-10-21 22:38:38 +0200 |
commit | 6e361f195fa61ff6585f78dd7cd7302b1dba5619 (patch) | |
tree | 78d6964621093b963a48dc9d870028d5775df862 | |
parent | Swapped which block is checked for light first. (diff) | |
download | cuberite-6e361f195fa61ff6585f78dd7cd7302b1dba5619.tar cuberite-6e361f195fa61ff6585f78dd7cd7302b1dba5619.tar.gz cuberite-6e361f195fa61ff6585f78dd7cd7302b1dba5619.tar.bz2 cuberite-6e361f195fa61ff6585f78dd7cd7302b1dba5619.tar.lz cuberite-6e361f195fa61ff6585f78dd7cd7302b1dba5619.tar.xz cuberite-6e361f195fa61ff6585f78dd7cd7302b1dba5619.tar.zst cuberite-6e361f195fa61ff6585f78dd7cd7302b1dba5619.zip |
Diffstat (limited to '')
-rw-r--r-- | source/Chunk.cpp | 111 | ||||
-rw-r--r-- | source/Chunk.h | 3 |
2 files changed, 103 insertions, 11 deletions
diff --git a/source/Chunk.cpp b/source/Chunk.cpp index 5a54371ad..ea6fed50c 100644 --- a/source/Chunk.cpp +++ b/source/Chunk.cpp @@ -539,17 +539,10 @@ void cChunk::SpawnMobs(cMobSpawner& a_MobSpawner) // MG TODO: fix the "light" thing, I'm pretty sure that UnboundedRelGetBlock s not returning the right thing // MG TODO : check that "Level" really means Y - NIBBLETYPE SkyLight = GetSkyLight(Try_X, Try_Y, Try_Z); - if (!SkyLight) - SkyLight = GetSkyLight(Try_X, Try_Y + 1, Try_Z); - if (!SkyLight) - SkyLight = GetSkyLight(Try_X, Try_Y - 1, Try_Z); - - NIBBLETYPE BlockLight = GetBlockLight(Try_X, Try_Y, Try_Z); - if (!BlockLight) - BlockLight = GetBlockLight(Try_X, Try_Y + 1, Try_Z); - if (!BlockLight) - BlockLight = GetBlockLight(Try_X, Try_Y - 1, Try_Z); + + NIBBLETYPE SkyLight = UnboundedRelGetSkyLight(Try_X, Try_Y, Try_Z); + + NIBBLETYPE BlockLight = UnboundedRelGetBlockLight(Try_X, Try_Y, Try_Z); if (IsLightValid()) { @@ -1363,6 +1356,102 @@ void cChunk::UnboundedQueueTickBlock(int a_RelX, int a_RelY, int a_RelZ) +NIBBLETYPE cChunk::UnboundedRelGetSkyLight(int a_RelX, int a_RelY, int a_RelZ) +{ +if ((a_RelY < 0) || (a_RelY > cChunkDef::Height)) + { + LOGWARNING("UnboundedRelGetSkyLight(): requesting a block with a_RelY out of range: %d", a_RelY); + return -1; + } + + // Is it in this chunk? + if ((a_RelX >= 0) && (a_RelX < cChunkDef::Width) && (a_RelZ >= 0) && (a_RelZ < cChunkDef::Width)) + { + if (!IsValid()) + { + return -1; + } + return GetSkyLight(a_RelX, a_RelY, a_RelZ); + } + + // Not in this chunk, try walking the neighbors first: + if ((a_RelX < 0) && (m_NeighborXM != NULL)) + { + return m_NeighborXM->UnboundedRelGetSkyLight(a_RelX + cChunkDef::Width, a_RelY, a_RelZ); + } + if ((a_RelX >= cChunkDef::Width) && (m_NeighborXP != NULL)) + { + return m_NeighborXP->UnboundedRelGetSkyLight(a_RelX - cChunkDef::Width, a_RelY, a_RelZ); + } + if ((a_RelZ < 0) && (m_NeighborZM != NULL)) + { + return m_NeighborZM->UnboundedRelGetSkyLight(a_RelX, a_RelY, a_RelZ + cChunkDef::Width); + } + if ((a_RelZ >= cChunkDef::Width) && (m_NeighborZP != NULL)) + { + return m_NeighborZP->UnboundedRelGetSkyLight(a_RelX, a_RelY, a_RelZ - cChunkDef::Width); + } + + // Neighbors not available, use the chunkmap to locate the chunk: + return m_ChunkMap->GetBlockSkyLight( + m_PosX * cChunkDef::Width + a_RelX, + ZERO_CHUNK_Y * cChunkDef::Height + a_RelY, + m_PosZ * cChunkDef::Width + a_RelZ + ); +} + + + + + +NIBBLETYPE cChunk::UnboundedRelGetBlockLight(int a_RelX, int a_RelY, int a_RelZ) +{ +if ((a_RelY < 0) || (a_RelY > cChunkDef::Height)) + { + LOGWARNING("UnboundedRelGetBlockLight(): requesting a block with a_RelY out of range: %d", a_RelY); + return -1; + } + + // Is it in this chunk? + if ((a_RelX >= 0) && (a_RelX < cChunkDef::Width) && (a_RelZ >= 0) && (a_RelZ < cChunkDef::Width)) + { + if (!IsValid()) + { + return -1; + } + return GetBlockLight(a_RelX, a_RelY, a_RelZ); + } + + // Not in this chunk, try walking the neighbors first: + if ((a_RelX < 0) && (m_NeighborXM != NULL)) + { + return m_NeighborXM->UnboundedRelGetBlockLight(a_RelX + cChunkDef::Width, a_RelY, a_RelZ); + } + if ((a_RelX >= cChunkDef::Width) && (m_NeighborXP != NULL)) + { + return m_NeighborXP->UnboundedRelGetBlockLight(a_RelX - cChunkDef::Width, a_RelY, a_RelZ); + } + if ((a_RelZ < 0) && (m_NeighborZM != NULL)) + { + return m_NeighborZM->UnboundedRelGetBlockLight(a_RelX, a_RelY, a_RelZ + cChunkDef::Width); + } + if ((a_RelZ >= cChunkDef::Width) && (m_NeighborZP != NULL)) + { + return m_NeighborZP->UnboundedRelGetBlockLight(a_RelX, a_RelY, a_RelZ - cChunkDef::Width); + } + + // Neighbors not available, use the chunkmap to locate the chunk: + return m_ChunkMap->GetBlockBlockLight( + m_PosX * cChunkDef::Width + a_RelX, + ZERO_CHUNK_Y * cChunkDef::Height + a_RelY, + m_PosZ * cChunkDef::Width + a_RelZ + ); +} + + + + + int cChunk::GetHeight( int a_X, int a_Z ) { ASSERT((a_X >= 0) && (a_X < Width) && (a_Z >= 0) && (a_Z < Width)); diff --git a/source/Chunk.h b/source/Chunk.h index aca180d16..303e7b6a9 100644 --- a/source/Chunk.h +++ b/source/Chunk.h @@ -317,6 +317,9 @@ public: /// Same as QueueTickBlock(), but relative coords needn't be in this chunk (uses m_Neighbor-s in such a case), ignores unsuccessful attempts void UnboundedQueueTickBlock(int a_RelX, int a_RelY, int a_RelZ); + NIBBLETYPE UnboundedRelGetBlockLight(int a_RelX, int a_RelY, int a_RelZ); + NIBBLETYPE UnboundedRelGetSkyLight(int a_RelX, int a_RelY, int a_RelZ); + // Simulator data: cFireSimulatorChunkData & GetFireSimulatorData (void) { return m_FireSimulatorData; } cFluidSimulatorData * GetWaterSimulatorData(void) { return m_WaterSimulatorData; } |