1
0

Squashed Bonemeal Plant Growth Update

* Fixed Crops growing to maturity with only 1 bonemeal
* Trees now go through growth stages with bonemeal, as they do in
Vanilla Minecraft
This commit is contained in:
Samuel Barney 2015-07-06 15:41:08 -06:00
parent 106e06617a
commit 2faff189d4

View File

@ -59,6 +59,7 @@
#include "Broadcaster.h" #include "Broadcaster.h"
#include "SpawnPrepare.h" #include "SpawnPrepare.h"
#include "FastRandom.h"
@ -1465,6 +1466,7 @@ void cWorld::GrowTreeImage(const sSetBlockVector & a_Blocks)
bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsByBonemeal) bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsByBonemeal)
{ {
cFastRandom random;
BLOCKTYPE BlockType; BLOCKTYPE BlockType;
NIBBLETYPE BlockMeta; NIBBLETYPE BlockMeta;
GetBlockTypeMeta(a_BlockX, a_BlockY, a_BlockZ, BlockType, BlockMeta); GetBlockTypeMeta(a_BlockX, a_BlockY, a_BlockZ, BlockType, BlockMeta);
@ -1478,10 +1480,19 @@ bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsBy
} }
if (BlockMeta < 7) if (BlockMeta < 7)
{ {
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, 7); if (!a_IsByBonemeal)
{
++BlockMeta;
}
else
{
BlockMeta += random.NextInt(4) + 2;
BlockMeta = std::min(BlockMeta, static_cast<NIBBLETYPE>(7));
}
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, BlockMeta);
BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0); BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0);
} }
return true; return BlockMeta == 7;
} }
case E_BLOCK_COCOA_POD: case E_BLOCK_COCOA_POD:
@ -1495,7 +1506,7 @@ bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsBy
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, (NIBBLETYPE) (GrowState << 2 | TypeMeta)); FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, (NIBBLETYPE) (GrowState << 2 | TypeMeta));
BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0); BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0);
} }
return true; return GrowState == 2;
} }
case E_BLOCK_CROPS: case E_BLOCK_CROPS:
@ -1506,10 +1517,19 @@ bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsBy
} }
if (BlockMeta < 7) if (BlockMeta < 7)
{ {
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, 7); if (!a_IsByBonemeal)
{
++BlockMeta;
}
else
{
BlockMeta += random.NextInt(4) + 2;
BlockMeta = std::min(BlockMeta, static_cast<NIBBLETYPE>(7));
}
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, BlockMeta);
BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0); BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0);
} }
return true; return BlockMeta == 7;
} }
case E_BLOCK_MELON_STEM: case E_BLOCK_MELON_STEM:
@ -1520,7 +1540,17 @@ bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsBy
{ {
return false; return false;
} }
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, 7);
if (!a_IsByBonemeal)
{
++BlockMeta;
}
else
{
BlockMeta += random.NextInt(4) + 2;
BlockMeta = std::min(BlockMeta, static_cast<NIBBLETYPE>(7));
}
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, BlockMeta);
BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0); BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0);
} }
else else
@ -1531,7 +1561,7 @@ bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsBy
} }
GrowMelonPumpkin(a_BlockX, a_BlockY, a_BlockZ, BlockType); GrowMelonPumpkin(a_BlockX, a_BlockY, a_BlockZ, BlockType);
} }
return true; return BlockMeta == 7;
} }
case E_BLOCK_POTATOES: case E_BLOCK_POTATOES:
@ -1542,10 +1572,19 @@ bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsBy
} }
if (BlockMeta < 7) if (BlockMeta < 7)
{ {
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, 7); if (!a_IsByBonemeal)
{
++BlockMeta;
}
else
{
BlockMeta += random.NextInt(4) + 2;
BlockMeta = std::min(BlockMeta, static_cast<NIBBLETYPE>(7));
}
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, BlockMeta);
BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0); BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0);
} }
return true; return BlockMeta == 7;
} }
case E_BLOCK_PUMPKIN_STEM: case E_BLOCK_PUMPKIN_STEM:
@ -1556,7 +1595,17 @@ bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsBy
{ {
return false; return false;
} }
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, 7);
if (!a_IsByBonemeal)
{
++BlockMeta;
}
else
{
BlockMeta += random.NextInt(4) + 2;
BlockMeta = std::min(BlockMeta, static_cast<NIBBLETYPE>(7));
}
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, BlockMeta);
BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0); BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0);
} }
else else
@ -1567,7 +1616,7 @@ bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsBy
} }
GrowMelonPumpkin(a_BlockX, a_BlockY, a_BlockZ, BlockType); GrowMelonPumpkin(a_BlockX, a_BlockY, a_BlockZ, BlockType);
} }
return true; return BlockMeta == 7;
} }
case E_BLOCK_SAPLING: case E_BLOCK_SAPLING:
@ -1576,9 +1625,32 @@ bool cWorld::GrowRipePlant(int a_BlockX, int a_BlockY, int a_BlockZ, bool a_IsBy
{ {
return false; return false;
} }
NIBBLETYPE TypeMeta = BlockMeta & 0x07;
int GrowState = BlockMeta >> 3;
if (GrowState < 1)
{
// Non-bonemeal forces a growth, while bonemeal only has a chance of growing it
if (!a_IsByBonemeal)
{
++GrowState;
}
else if (random.NextInt(99) < 45)
{
++GrowState;
}
FastSetBlock(a_BlockX, a_BlockY, a_BlockZ, BlockType, static_cast<NIBBLETYPE>(GrowState << 3 | TypeMeta));
BroadcastSoundParticleEffect(2005, a_BlockX, a_BlockY, a_BlockZ, 0);
}
else if (random.NextInt(99) < 45)
{
GrowTreeFromSapling(a_BlockX, a_BlockY, a_BlockZ, BlockMeta); GrowTreeFromSapling(a_BlockX, a_BlockY, a_BlockZ, BlockMeta);
return true; return true;
} }
return false;
}
case E_BLOCK_GRASS: case E_BLOCK_GRASS:
{ {