diff options
author | Mattes D <github@xoft.cz> | 2017-07-14 16:18:33 +0200 |
---|---|---|
committer | Lukas Pioch <lukas@zgow.de> | 2017-07-16 10:01:19 +0200 |
commit | 167c4bf2e691e22240a3c41ebc7181a03933fdb4 (patch) | |
tree | 562d5ac29ef39b1fa2b94fad3825333e39204e69 /src/Simulator/Simulator.cpp | |
parent | Handle middle mouse drag (#3847) (diff) | |
download | cuberite-167c4bf2e691e22240a3c41ebc7181a03933fdb4.tar cuberite-167c4bf2e691e22240a3c41ebc7181a03933fdb4.tar.gz cuberite-167c4bf2e691e22240a3c41ebc7181a03933fdb4.tar.bz2 cuberite-167c4bf2e691e22240a3c41ebc7181a03933fdb4.tar.lz cuberite-167c4bf2e691e22240a3c41ebc7181a03933fdb4.tar.xz cuberite-167c4bf2e691e22240a3c41ebc7181a03933fdb4.tar.zst cuberite-167c4bf2e691e22240a3c41ebc7181a03933fdb4.zip |
Diffstat (limited to 'src/Simulator/Simulator.cpp')
-rw-r--r-- | src/Simulator/Simulator.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/Simulator/Simulator.cpp b/src/Simulator/Simulator.cpp index 0175fd67d..275d60161 100644 --- a/src/Simulator/Simulator.cpp +++ b/src/Simulator/Simulator.cpp @@ -5,6 +5,7 @@ #include "../BlockID.h" #include "../Defines.h" #include "../Chunk.h" +#include "../Cuboid.h" #ifdef __clang__ #pragma clang diagnostic ignored "-Wweak-template-vtables" @@ -38,3 +39,52 @@ void cSimulator::WakeUp(int a_BlockX, int a_BlockY, int a_BlockZ, cChunk * a_Chu + +void cSimulator::WakeUpArea(const cCuboid & a_Area) +{ + cCuboid area(a_Area); + area.Sort(); + area.Expand(1, 1, 1, 1, 1, 1); // Expand the area to contain the neighbors, too. + area.ClampY(0, cChunkDef::Height - 1); + + // Add all blocks, in a per-chunk manner: + int chunkStartX, chunkStartZ, chunkEndX, chunkEndZ; + cChunkDef::BlockToChunk(area.p1.x, area.p1.z, chunkStartX, chunkStartZ); + cChunkDef::BlockToChunk(area.p2.x, area.p2.z, chunkEndX, chunkEndZ); + for (int cz = chunkStartZ; cz <= chunkEndZ; ++cz) + { + for (int cx = chunkStartX; cx <= chunkEndX; ++cx) + { + m_World.DoWithChunk(cx, cz, [this, &area](cChunk & a_CBChunk) -> bool + { + if (!a_CBChunk.IsValid()) + { + LOGWARNING("%s: Trying to wake up inside a non-valid chunk [%d, %d]. Ignoring.", + __FUNCTION__, a_CBChunk.GetPosX(), a_CBChunk.GetPosZ() + ); + return true; + } + int startX = std::max(area.p1.x, a_CBChunk.GetPosX() * cChunkDef::Width); + int startZ = std::max(area.p1.z, a_CBChunk.GetPosZ() * cChunkDef::Width); + int endX = std::min(area.p2.x, a_CBChunk.GetPosX() * cChunkDef::Width + cChunkDef::Width - 1); + int endZ = std::min(area.p2.z, a_CBChunk.GetPosZ() * cChunkDef::Width + cChunkDef::Width - 1); + for (int y = area.p1.y; y <= area.p2.y; ++y) + { + for (int z = startZ; z <= endZ; ++z) + { + for (int x = startX; x <= endX; ++x) + { + AddBlock(x, y, z, &a_CBChunk); + } // for x + } // for z + } // for y + return true; + } // lambda + ); // DoWithChunk + } // for cx + } // for cz +} + + + + |