summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@outlook.com>2020-07-05 22:04:40 +0200
committerTiger Wang <ziwei.tiger@outlook.com>2020-07-06 21:56:05 +0200
commita24dd3a2ab3339a8bfc5ed94106887ccf2fdb9a4 (patch)
treed9b4a50ac6351fc2064792898f9b5a8dd1f0c0e5
parentReduced packet spam when entities idle (diff)
downloadcuberite-a24dd3a2ab3339a8bfc5ed94106887ccf2fdb9a4.tar
cuberite-a24dd3a2ab3339a8bfc5ed94106887ccf2fdb9a4.tar.gz
cuberite-a24dd3a2ab3339a8bfc5ed94106887ccf2fdb9a4.tar.bz2
cuberite-a24dd3a2ab3339a8bfc5ed94106887ccf2fdb9a4.tar.lz
cuberite-a24dd3a2ab3339a8bfc5ed94106887ccf2fdb9a4.tar.xz
cuberite-a24dd3a2ab3339a8bfc5ed94106887ccf2fdb9a4.tar.zst
cuberite-a24dd3a2ab3339a8bfc5ed94106887ccf2fdb9a4.zip
-rw-r--r--src/Blocks/BlockGrass.h53
1 files changed, 34 insertions, 19 deletions
diff --git a/src/Blocks/BlockGrass.h b/src/Blocks/BlockGrass.h
index 8792a51f9..2bae49281 100644
--- a/src/Blocks/BlockGrass.h
+++ b/src/Blocks/BlockGrass.h
@@ -15,6 +15,18 @@ class cBlockGrassHandler :
{
using super = cBlockHandler;
+ enum class Survivability
+ {
+ // Light level so good that the grass can try to spread to neighbours
+ CanSpread,
+
+ // Stay put, light is enough to live on but not propagate
+ DoNothing,
+
+ // Insufficient light, death is upon us
+ DieInDarkness
+ };
+
public:
cBlockGrassHandler(BLOCKTYPE a_BlockType):
@@ -53,9 +65,15 @@ public:
return;
}
- if (!cBlockGrassHandler::TrySurvive(a_Chunk, a_RelPos))
+ switch (cBlockGrassHandler::DetermineSurvivability(a_Chunk, a_RelPos))
{
- return;
+ case Survivability::CanSpread: break;
+ case Survivability::DoNothing: return;
+ case Survivability::DieInDarkness:
+ {
+ a_Chunk.FastSetBlock(a_RelPos, E_BLOCK_DIRT, E_META_DIRT_NORMAL);
+ return;
+ }
}
// Grass spreads to adjacent dirt blocks:
@@ -66,7 +84,7 @@ public:
int OfsY = Random.RandInt(-3, 1);
int OfsZ = Random.RandInt(-1, 1);
- cBlockGrassHandler::TryThrive(a_Chunk, a_RelPos + Vector3i(OfsX, OfsY, OfsZ));
+ cBlockGrassHandler::TrySpreadTo(a_Chunk, a_RelPos + Vector3i(OfsX, OfsY, OfsZ));
} // for i - repeat twice
}
@@ -74,15 +92,23 @@ public:
+ virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) override
+ {
+ UNUSED(a_Meta);
+ return 1;
+ }
+
+private:
+
/** Check if conditions are favourable to a grass block at the given position.
If they are not, the grass dies and is turned to dirt.
Returns whether conditions are so good that the grass can try to spread to neighbours. */
- static bool TrySurvive(cChunk & a_Chunk, const Vector3i a_RelPos)
+ static Survivability DetermineSurvivability(cChunk & a_Chunk, const Vector3i a_RelPos)
{
const auto AbovePos = a_RelPos.addedY(1);
if (!cChunkDef::IsValidHeight(AbovePos.y))
{
- return true;
+ return Survivability::CanSpread;
}
// Grass turns back to dirt when the block Above it is not transparent or water.
@@ -92,13 +118,12 @@ public:
(Above != E_BLOCK_SNOW) &&
(!cBlockInfo::IsTransparent(Above) || IsBlockWater(Above)))
{
- a_Chunk.FastSetBlock(a_RelPos, E_BLOCK_DIRT, E_META_DIRT_NORMAL);
- return false;
+ return Survivability::DieInDarkness;
}
// Make sure that there is enough light at the source block to spread
const auto Light = std::max(a_Chunk.GetBlockLight(AbovePos), a_Chunk.GetSkyLightAltered(AbovePos));
- return (Light >= 9);
+ return (Light >= 9) ? Survivability::CanSpread : Survivability::DoNothing;
}
@@ -106,7 +131,7 @@ public:
/** Attempt to spread grass to a block at the given position. */
- static void TryThrive(cChunk & a_Chunk, Vector3i a_RelPos)
+ static void TrySpreadTo(cChunk & a_Chunk, Vector3i a_RelPos)
{
if (!cChunkDef::IsValidHeight(a_RelPos.y))
{
@@ -149,14 +174,4 @@ public:
}
}
}
-
-
-
-
-
- virtual ColourID GetMapBaseColourID(NIBBLETYPE a_Meta) override
- {
- UNUSED(a_Meta);
- return 1;
- }
} ;