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:
parent
106e06617a
commit
2faff189d4
@ -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:
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user