diff options
author | madmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6> | 2013-03-03 16:33:55 +0100 |
---|---|---|
committer | madmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6> | 2013-03-03 16:33:55 +0100 |
commit | 55326ee2a72aea190ba9ccc7b04969742fc7ce5f (patch) | |
tree | 9361d4cfe6cb50f753ef78629bd602d8afe05bb8 | |
parent | Redstone simulator: adding a block now checks if the neighbors are redstone-related; if not, the block is ignored. (diff) | |
download | cuberite-55326ee2a72aea190ba9ccc7b04969742fc7ce5f.tar cuberite-55326ee2a72aea190ba9ccc7b04969742fc7ce5f.tar.gz cuberite-55326ee2a72aea190ba9ccc7b04969742fc7ce5f.tar.bz2 cuberite-55326ee2a72aea190ba9ccc7b04969742fc7ce5f.tar.lz cuberite-55326ee2a72aea190ba9ccc7b04969742fc7ce5f.tar.xz cuberite-55326ee2a72aea190ba9ccc7b04969742fc7ce5f.tar.zst cuberite-55326ee2a72aea190ba9ccc7b04969742fc7ce5f.zip |
-rw-r--r-- | source/Chunk.cpp | 39 | ||||
-rw-r--r-- | source/Chunk.h | 4 | ||||
-rw-r--r-- | source/Simulator/Simulator.h | 2 |
3 files changed, 45 insertions, 0 deletions
diff --git a/source/Chunk.cpp b/source/Chunk.cpp index a013554db..cfe6ad22d 100644 --- a/source/Chunk.cpp +++ b/source/Chunk.cpp @@ -308,6 +308,9 @@ void cChunk::SetAllData( // Create block entities that the loader didn't load; fill them with defaults CreateBlockEntities(); + + // Wake up all simulators for their respective blocks: + WakeUpSimulators(); m_HasLoadFailed = false; } @@ -1052,6 +1055,42 @@ void cChunk::CreateBlockEntities(void) +void cChunk::WakeUpSimulators(void) +{ + cSimulator * WaterSimulator = m_World->GetWaterSimulator(); + cSimulator * LavaSimulator = m_World->GetLavaSimulator(); + int BaseX = m_PosX * cChunkDef::Width; + int BaseZ = m_PosZ * cChunkDef::Width; + for (int x = 0; x < Width; x++) + { + int BlockX = x + BaseX; + for (int z = 0; z < Width; z++) + { + int BlockZ = z + BaseZ; + for (int y = GetHeight(x, z); y >= 0; y--) + { + switch (cChunkDef::GetBlock(m_BlockTypes, x, y, z)) + { + case E_BLOCK_WATER: + { + WaterSimulator->AddBlock(BlockX, y, BlockZ, this); + break; + } + case E_BLOCK_LAVA: + { + LavaSimulator->AddBlock(BlockX, y, BlockZ, this); + break; + } + } // switch (BlockType) + } // for y + } // for z + } // for x +} + + + + + void cChunk::CalculateHeightmap() { for (int x = 0; x < Width; x++) diff --git a/source/Chunk.h b/source/Chunk.h index 4d88d1019..a85c99271 100644 --- a/source/Chunk.h +++ b/source/Chunk.h @@ -331,8 +331,12 @@ private: void SpreadLightOfBlock(NIBBLETYPE * a_LightBuffer, int a_X, int a_Y, int a_Z, char a_Falloff); + /// Creates a block entity for each block that needs a block entity and doesn't have one in the list void CreateBlockEntities(void); + /// Wakes up each simulator for its specific blocks; through all the blocks in the chunk + void WakeUpSimulators(void); + // Makes a copy of the list cClientHandleList GetAllClients(void) const {return m_LoadedByClient; } diff --git a/source/Simulator/Simulator.h b/source/Simulator/Simulator.h index 63cc0b17f..e1d88f1c5 100644 --- a/source/Simulator/Simulator.h +++ b/source/Simulator/Simulator.h @@ -33,6 +33,8 @@ public: virtual bool IsAllowedBlock(BLOCKTYPE a_BlockType) = 0; protected: + friend class cChunk; // Calls AddBlock() in its WakeUpSimulators() function, to speed things up + /// Called to simulate a new block virtual void AddBlock(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chunk) = 0; |