From f9b56dd859b97dd9af5f2a0c7050270d7a44b525 Mon Sep 17 00:00:00 2001 From: Bond-009 Date: Tue, 18 Jul 2017 15:14:52 +0200 Subject: [PATCH] Break the cactus block when it grows next to a block. (#3851) --- src/Blocks/BlockCactus.h | 8 ++++++-- src/Chunk.cpp | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/Blocks/BlockCactus.h b/src/Blocks/BlockCactus.h index 29e86d085..371402423 100644 --- a/src/Blocks/BlockCactus.h +++ b/src/Blocks/BlockCactus.h @@ -36,7 +36,7 @@ public: return false; } - // Check surroundings. Cacti may ONLY be surrounded by air + // Check surroundings. Cacti may ONLY be surrounded by non-solid blocks static const struct { int x, z; @@ -53,7 +53,11 @@ public: NIBBLETYPE BlockMeta; if ( a_Chunk.UnboundedRelGetBlock(a_RelX + Coords[i].x, a_RelY, a_RelZ + Coords[i].z, BlockType, BlockMeta) && - cBlockInfo::IsSolid(BlockType) + ( + cBlockInfo::IsSolid(BlockType) || + (BlockType == E_BLOCK_LAVA) || + (BlockType == E_BLOCK_STATIONARY_LAVA) + ) ) { return false; diff --git a/src/Chunk.cpp b/src/Chunk.cpp index 282293c0f..3b9739907 100644 --- a/src/Chunk.cpp +++ b/src/Chunk.cpp @@ -1118,7 +1118,7 @@ int cChunk::GrowSugarcane(int a_RelX, int a_RelY, int a_RelZ, int a_NumBlocks) int cChunk::GrowCactus(int a_RelX, int a_RelY, int a_RelZ, int a_NumBlocks) { - // Check the total height of the sugarcane blocks here: + // Check the total height of the cacti blocks here: int Top = a_RelY + 1; while ( (Top < cChunkDef::Height) && @@ -1141,11 +1141,38 @@ int cChunk::GrowCactus(int a_RelX, int a_RelY, int a_RelZ, int a_NumBlocks) for (int i = 0; i < ToGrow; i++) { BLOCKTYPE BlockType; - NIBBLETYPE BlockMeta; - if (UnboundedRelGetBlock(a_RelX, Top + i, a_RelZ, BlockType, BlockMeta) && (BlockType == E_BLOCK_AIR)) + if (UnboundedRelGetBlockType(a_RelX, Top + i, a_RelZ, BlockType) && (BlockType == E_BLOCK_AIR)) { - // TODO: Check the surrounding blocks, if they aren't air, break the cactus block into pickups (and continue breaking blocks above in the next loop iterations) UnboundedRelFastSetBlock(a_RelX, Top + i, a_RelZ, E_BLOCK_CACTUS, 0); + + // Check surroundings. Cacti may ONLY be surrounded by non-solid blocks + static const struct + { + int x, z; + } Coords[] = + { + {-1, 0}, + { 1, 0}, + { 0, -1}, + { 0, 1}, + } ; + for (auto & Coord : Coords) + { + if ( + UnboundedRelGetBlockType(a_RelX + Coord.x, Top + 1, a_RelZ + Coord.z, BlockType) && + ( + cBlockInfo::IsSolid(BlockType) || + (BlockType == E_BLOCK_LAVA) || + (BlockType == E_BLOCK_STATIONARY_LAVA) + ) + ) + { + return false; + } + } // for i - Coords[] + { + GetWorld()->DigBlock(a_RelX + GetPosX() * cChunkDef::Width, Top + i, a_RelZ + GetPosZ() * cChunkDef::Width); + } } else {