1
0

ChunkDesc: Cuboid-based manipulation

git-svn-id: http://mc-server.googlecode.com/svn/trunk@1324 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
madmaxoft@gmail.com
2013-03-29 20:47:51 +00:00
parent a633c45e8e
commit c76092e329
4 changed files with 181 additions and 2 deletions

View File

@@ -6,6 +6,7 @@
#include "Globals.h"
#include "ChunkDesc.h"
#include "../BlockArea.h"
#include "../Cuboid.h"
@@ -382,6 +383,62 @@ HEIGHTTYPE cChunkDesc::GetMaxHeight(void) const
void cChunkDesc::FillRelCuboid(const cCuboid & a_RelCuboid, BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta)
{
int MinX = std::max(a_RelCuboid.p1.x, 0);
int MinY = std::max(a_RelCuboid.p1.y, 0);
int MinZ = std::max(a_RelCuboid.p1.z, 0);
int MaxX = std::min(a_RelCuboid.p2.x, cChunkDef::Width - 1);
int MaxY = std::min(a_RelCuboid.p2.y, cChunkDef::Height - 1);
int MaxZ = std::min(a_RelCuboid.p2.z, cChunkDef::Width - 1);
for (int y = MinY; y <= MaxY; y++)
{
for (int z = MinZ; z <= MaxZ; z++)
{
for (int x = MinX; x <= MaxX; x++)
{
SetBlockTypeMeta(x, y, z, a_BlockType, a_BlockMeta);
}
} // for z
} // for y
}
void cChunkDesc::ReplaceRelCuboid(const cCuboid & a_RelCuboid, BLOCKTYPE a_SrcType, NIBBLETYPE a_SrcMeta, BLOCKTYPE a_DstType, NIBBLETYPE a_DstMeta)
{
int MinX = std::max(a_RelCuboid.p1.x, 0);
int MinY = std::max(a_RelCuboid.p1.y, 0);
int MinZ = std::max(a_RelCuboid.p1.z, 0);
int MaxX = std::min(a_RelCuboid.p2.x, cChunkDef::Width - 1);
int MaxY = std::min(a_RelCuboid.p2.y, cChunkDef::Height - 1);
int MaxZ = std::min(a_RelCuboid.p2.z, cChunkDef::Width - 1);
for (int y = MinY; y <= MaxY; y++)
{
for (int z = MinZ; z <= MaxZ; z++)
{
for (int x = MinX; x <= MaxX; x++)
{
BLOCKTYPE BlockType;
NIBBLETYPE BlockMeta;
GetBlockTypeMeta(x, y, z, BlockType, BlockMeta);
if ((BlockType == a_SrcType) && (BlockMeta == a_SrcMeta))
{
SetBlockTypeMeta(x, y, z, a_DstType, a_DstMeta);
}
}
} // for z
} // for y
}
void cChunkDesc::CompressBlockMetas(cChunkDef::BlockNibbles & a_DestMetas)
{
const NIBBLETYPE * AreaMetas = m_BlockArea.GetBlockMetas();