1
0
cuberite-2a/source/blocks/BlockDirt.h
lapayo94@gmail.com 14dce23845 A new Block handling system :o
It was really a lot of work :D
Took me the complete weekend :D

Would really like to here your opinion on this =)
The aim of this is to put all the actions for one block in one place so it is not spread around the source. (ToPickup, Action in cWorld, Action in cChunk, Action here, action there :D)

git-svn-id: http://mc-server.googlecode.com/svn/trunk@671 0a769ca7-a7f5-676a-18bf-c427514a06d6
2012-07-15 20:36:34 +00:00

62 lines
1.5 KiB
C++

#pragma once
#include "Block.h"
#include "../MersenneTwister.h"
#include "../cWorld.h"
class cBlockDirtHandler : public cBlockHandler
{
public:
cBlockDirtHandler(BLOCKTYPE a_BlockID);
virtual bool NeedsRandomTicks()
{
return m_BlockID == E_BLOCK_GRASS;
}
virtual int GetDropID()
{
return E_BLOCK_DIRT;
}
void OnUpdate(cWorld *a_World, int a_X, int a_Y, int a_Z)
{
if(m_BlockID == E_BLOCK_GRASS)
{
//Grass becomes dirt if there is something on top of them
BLOCKTYPE Above = a_World->GetBlock(a_X, a_Y + 1, a_Z);
if(!g_BlockTransparent[Above] && !g_BlockOneHitDig[Above])
{
a_World->FastSetBlock(a_X, a_Y, a_Z, E_BLOCK_DIRT, 0);
}
MTRand rand;
for (int i = 0; i < 2; i++) // Pick two blocks to grow to
{
int OfsX = rand.randInt(2) - 1; // [-1 .. 1]
int OfsY = rand.randInt(4) - 3; // [-3 .. 1]
int OfsZ = rand.randInt(2) - 1; // [-1 .. 1]
BLOCKTYPE DestBlock;
NIBBLETYPE DestMeta;
a_World->GetBlockTypeMeta(a_X + OfsX, a_Y + OfsY, a_Z + OfsZ, DestBlock, DestMeta);
if(DestBlock != E_BLOCK_DIRT)
{
continue;
}
BLOCKTYPE AboveDest;
NIBBLETYPE AboveMeta;
a_World->GetBlockTypeMeta(a_X + OfsX, a_Y + OfsY + 1, a_Z + OfsZ, AboveDest, AboveMeta);
if (g_BlockOneHitDig[AboveDest] || g_BlockTransparent[AboveDest])
{
a_World->FastSetBlock(a_X + OfsX, a_Y + OfsY, a_Z + OfsZ, E_BLOCK_GRASS, 0);
}
} // for i - repeat twice
}
}
};