2014-12-01 12:10:37 -05:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "BlockHandler.h"
|
|
|
|
#include "../FastRandom.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class cBlockCocoaPodHandler :
|
|
|
|
public cBlockHandler
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
cBlockCocoaPodHandler(BLOCKTYPE a_BlockType)
|
|
|
|
: cBlockHandler(a_BlockType)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
virtual bool CanBeAt(cChunkInterface & a_ChunkInterface, int a_RelX, int a_RelY, int a_RelZ, const cChunk & a_Chunk) override
|
|
|
|
{
|
|
|
|
eBlockFace BlockFace = MetaToBlockFace(a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ));
|
|
|
|
AddFaceDirection(a_RelX, a_RelY, a_RelZ, BlockFace, true);
|
|
|
|
|
|
|
|
BLOCKTYPE BlockType;
|
|
|
|
NIBBLETYPE BlockMeta;
|
|
|
|
a_Chunk.UnboundedRelGetBlock(a_RelX, a_RelY, a_RelZ, BlockType, BlockMeta);
|
|
|
|
|
|
|
|
return ((BlockType == E_BLOCK_LOG) && ((BlockMeta & 0x3) == E_META_LOG_JUNGLE));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
virtual void OnUpdate(cChunkInterface & cChunkInterface, cWorldInterface & a_WorldInterface, cBlockPluginInterface & a_PluginInterface, cChunk & a_Chunk, int a_RelX, int a_RelY, int a_RelZ) override
|
|
|
|
{
|
|
|
|
cFastRandom Random;
|
|
|
|
|
|
|
|
if (Random.NextInt(5) == 0)
|
|
|
|
{
|
|
|
|
NIBBLETYPE Meta = a_Chunk.GetMeta(a_RelX, a_RelY, a_RelZ);
|
|
|
|
NIBBLETYPE TypeMeta = Meta & 0x03;
|
2014-12-14 07:14:48 -05:00
|
|
|
int GrowState = Meta >> 2;
|
2014-12-01 12:10:37 -05:00
|
|
|
|
|
|
|
if (GrowState < 2)
|
|
|
|
{
|
|
|
|
++GrowState;
|
|
|
|
a_Chunk.SetMeta(a_RelX, a_RelY, a_RelZ, (NIBBLETYPE) (GrowState << 2 | TypeMeta));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
virtual void ConvertToPickups(cItems & a_Pickups, NIBBLETYPE a_BlockMeta) override
|
|
|
|
{
|
2014-12-14 07:14:48 -05:00
|
|
|
int GrowState = a_BlockMeta >> 2;
|
2014-12-01 12:10:37 -05:00
|
|
|
a_Pickups.Add(E_ITEM_DYE, ((GrowState >= 2) ? 3 : 1), E_META_DYE_BROWN);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static eBlockFace MetaToBlockFace(NIBBLETYPE a_Meta)
|
|
|
|
{
|
|
|
|
switch (a_Meta & 0x3)
|
|
|
|
{
|
|
|
|
case 0: return BLOCK_FACE_ZM;
|
|
|
|
case 1: return BLOCK_FACE_XP;
|
|
|
|
case 2: return BLOCK_FACE_ZP;
|
|
|
|
case 3: return BLOCK_FACE_XM;
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
ASSERT(!"Bad meta");
|
|
|
|
return BLOCK_FACE_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static NIBBLETYPE BlockFaceToMeta(eBlockFace a_BlockFace)
|
|
|
|
{
|
|
|
|
switch (a_BlockFace)
|
|
|
|
{
|
|
|
|
case BLOCK_FACE_ZM: return 0;
|
|
|
|
case BLOCK_FACE_XM: return 3;
|
|
|
|
case BLOCK_FACE_XP: return 1;
|
|
|
|
case BLOCK_FACE_ZP: return 2;
|
|
|
|
default:
|
|
|
|
{
|
|
|
|
ASSERT(!"Unknown face");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|