summaryrefslogtreecommitdiffstats
path: root/src/Blocks/BlockSapling.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Blocks/BlockSapling.h')
-rw-r--r--src/Blocks/BlockSapling.h133
1 files changed, 2 insertions, 131 deletions
diff --git a/src/Blocks/BlockSapling.h b/src/Blocks/BlockSapling.h
index 15bd57f6a..e72d5ae51 100644
--- a/src/Blocks/BlockSapling.h
+++ b/src/Blocks/BlockSapling.h
@@ -45,140 +45,11 @@ public:
virtual void OnUpdate(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_PluginInterface, cChunk & a_Chunk, int a_RelX, int a_RelY, int a_RelZ) override
{
- NIBBLETYPE Meta = a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ);
- NIBBLETYPE Light = std::max(a_Chunk.GetBlockLight(a_RelX, a_RelY, a_RelZ), a_Chunk.GetTimeAlteredLight(a_Chunk.GetSkyLight(a_RelX, a_RelY, a_RelZ)));
-
// Only grow if we have the right amount of light
- if (Light > 8)
- {
- auto & random = GetRandomProvider();
- // Only grow if we are in the right growth stage and have the right amount of space around them.
- if (((Meta & 0x08) != 0) && random.RandBool(0.45) && CanGrowAt(a_Chunk, a_RelX, a_RelY, a_RelZ, Meta))
- {
- int BlockX = a_RelX + a_Chunk.GetPosX() * cChunkDef::Width;
- int BlockZ = a_RelZ + a_Chunk.GetPosZ() * cChunkDef::Width;
- a_Chunk.GetWorld()->GrowTree(BlockX, a_RelY, BlockZ);
- }
- // Only move to the next growth stage if we haven't gone there yet
- else if (((Meta & 0x08) == 0) && random.RandBool(0.45))
- {
- a_Chunk.SetMeta(a_RelX, a_RelY, a_RelZ, Meta | 0x08);
- }
- }
- }
-
-
-
-
-
- bool CanGrowAt(cChunk & a_Chunk, int a_RelX, int a_RelY, int a_RelZ, NIBBLETYPE a_Meta)
- {
- a_Meta = a_Meta & 0x07;
- int CheckHeight = 0;
- bool LargeTree = false;
-
- // Get the height to check against
- switch (a_Meta)
- {
- case E_META_SAPLING_APPLE:
- {
- CheckHeight = 5;
- break;
- }
- case E_META_SAPLING_CONIFER:
- {
- CheckHeight = 7;
- if (IsLargeTree(a_Chunk, a_RelX, a_RelY, a_RelZ, a_Meta))
- {
- CheckHeight = 16;
- LargeTree = true;
- }
- break;
- }
- case E_META_SAPLING_BIRCH:
- {
- CheckHeight = 6;
- break;
- }
- case E_META_SAPLING_JUNGLE:
- {
- CheckHeight = 7;
- if (IsLargeTree(a_Chunk, a_RelX, a_RelY, a_RelZ, a_Meta))
- {
- CheckHeight = 13;
- LargeTree = true;
- }
- break;
- }
- // Acacias don't need horizontal clearance
- case E_META_SAPLING_ACACIA:
- {
- if (!IsLargeTree(a_Chunk, a_RelX, a_RelY, a_RelZ, a_Meta))
- {
- return false;
- }
- CheckHeight = 7;
- LargeTree = true;
- break;
- }
- // Dark Oaks don't need horizontal clearance
- case E_META_SAPLING_DARK_OAK:
- {
- if (!IsLargeTree(a_Chunk, a_RelX, a_RelY, a_RelZ, a_Meta))
- {
- return false;
- }
- CheckHeight = 7;
- LargeTree = true;
- break;
- }
- }
- // We should always get a valid CheckHeight
- ASSERT(CheckHeight != 0);
-
- // Don't grow a tree if we don't have enough space left above it in the chunk
- if ((a_RelY + CheckHeight) > cChunkDef::Height)
- {
- return false;
- }
- bool CanGrow = true;
-
- // Validate the neighbor blocks. They cannot be solid.
- BLOCKTYPE check = E_BLOCK_AIR;
- a_Chunk.UnboundedRelGetBlockType(a_RelX - 1, a_RelY, a_RelZ, check);
- CanGrow = CanGrow && cBlockInfo::IsTransparent(check);
-
- a_Chunk.UnboundedRelGetBlockType(a_RelX + 1, a_RelY, a_RelZ, check);
- CanGrow = CanGrow && cBlockInfo::IsTransparent(check);
-
- a_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ - 1, check);
- CanGrow = CanGrow && cBlockInfo::IsTransparent(check);
-
- a_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY, a_RelZ + 1, check);
- CanGrow = CanGrow && cBlockInfo::IsTransparent(check);
-
- while (CheckHeight && CanGrow)
+ if ((a_Chunk.GetLightAltered(Vector3i(a_RelX, a_RelY, a_RelZ)) > 8) && GetRandomProvider().RandBool(0.45))
{
- check = a_Chunk.GetBlock(a_RelX, a_RelY + CheckHeight, a_RelZ);
- CanGrow = CanGrow && ((check == E_BLOCK_AIR) || (check == E_BLOCK_LEAVES));
-
- // We have to check above the neighboring saplings as well
- if (LargeTree)
- {
- a_Chunk.UnboundedRelGetBlockType(a_RelX + 1, a_RelY + CheckHeight, a_RelZ, check);
- CanGrow = CanGrow && ((check == E_BLOCK_AIR) || (check == E_BLOCK_LEAVES));
-
- a_Chunk.UnboundedRelGetBlockType(a_RelX, a_RelY + CheckHeight, a_RelZ + 1, check);
- CanGrow = CanGrow && ((check == E_BLOCK_AIR) || (check == E_BLOCK_LEAVES));
-
- a_Chunk.UnboundedRelGetBlockType(a_RelX + 1, a_RelY + CheckHeight, a_RelZ + 1, check);
- CanGrow = CanGrow && ((check == E_BLOCK_AIR) || (check == E_BLOCK_LEAVES));
- }
-
- --CheckHeight;
+ Grow(a_Chunk, Vector3i(a_RelX, a_RelY, a_RelZ));
}
-
- return CanGrow;
}