1
0

BlockArea: Implemented mirroring without meta manipulation

git-svn-id: http://mc-server.googlecode.com/svn/trunk@1316 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
madmaxoft@gmail.com
2013-03-25 12:16:23 +00:00
parent bdc7d5f9c7
commit e0707a7af6
5 changed files with 962 additions and 6 deletions

View File

@@ -919,6 +919,187 @@ void cBlockArea::RelLine(int a_RelX1, int a_RelY1, int a_RelZ1, int a_RelX2, int
void cBlockArea::RotateCW(void)
{
ASSERT(!"Not implemented yet");
// TODO
}
void cBlockArea::RotateCCW(void)
{
ASSERT(!"Not implemented yet");
// TODO
}
void cBlockArea::MirrorXY(void)
{
ASSERT(!"Not implemented yet");
// TODO
}
void cBlockArea::MirrorXZ(void)
{
ASSERT(!"Not implemented yet");
// TODO
}
void cBlockArea::MirrorYZ(void)
{
ASSERT(!"Not implemented yet");
// TODO
}
void cBlockArea::RotateCWNoMeta(void)
{
ASSERT(!"Not implemented yet");
// TODO
}
void cBlockArea::RotateCCWNoMeta(void)
{
ASSERT(!"Not implemented yet");
// TODO
}
void cBlockArea::MirrorXYNoMeta(void)
{
int HalfZ = m_SizeZ / 2;
int MaxZ = m_SizeZ - 1;
if (HasBlockTypes())
{
for (int y = 0; y < m_SizeY; y++)
{
for (int z = 0; z < HalfZ; z++)
{
for (int x = 0; x < m_SizeX; x++)
{
std::swap(m_BlockTypes[MakeIndex(x, y, z)], m_BlockTypes[MakeIndex(x, y, MaxZ - z)]);
} // for x
} // for z
} // for y
} // if (HasBlockTypes)
if (HasBlockMetas())
{
for (int y = 0; y < m_SizeY; y++)
{
for (int z = 0; z < HalfZ; z++)
{
for (int x = 0; x < m_SizeX; x++)
{
std::swap(m_BlockMetas[MakeIndex(x, y, z)], m_BlockMetas[MakeIndex(x, y, MaxZ - z)]);
} // for x
} // for z
} // for y
} // if (HasBlockTypes)
}
void cBlockArea::MirrorXZNoMeta(void)
{
int HalfY = m_SizeY / 2;
int MaxY = m_SizeY - 1;
if (HasBlockTypes())
{
for (int y = 0; y < HalfY; y++)
{
for (int z = 0; z < m_SizeZ; z++)
{
for (int x = 0; x < m_SizeX; x++)
{
std::swap(m_BlockTypes[MakeIndex(x, y, z)], m_BlockTypes[MakeIndex(x, MaxY - y, z)]);
} // for x
} // for z
} // for y
} // if (HasBlockTypes)
if (HasBlockMetas())
{
for (int y = 0; y < HalfY; y++)
{
for (int z = 0; z < m_SizeZ; z++)
{
for (int x = 0; x < m_SizeX; x++)
{
std::swap(m_BlockMetas[MakeIndex(x, y, z)], m_BlockMetas[MakeIndex(x, MaxY - y, z)]);
} // for x
} // for z
} // for y
} // if (HasBlockTypes)
}
void cBlockArea::MirrorYZNoMeta(void)
{
int HalfX = m_SizeX / 2;
int MaxX = m_SizeX - 1;
if (HasBlockTypes())
{
for (int y = 0; y < m_SizeY; y++)
{
for (int z = 0; z < m_SizeZ; z++)
{
for (int x = 0; x < HalfX; x++)
{
std::swap(m_BlockTypes[MakeIndex(x, y, z)], m_BlockTypes[MakeIndex(MaxX - x, y, z)]);
} // for x
} // for z
} // for y
} // if (HasBlockTypes)
if (HasBlockMetas())
{
for (int y = 0; y < m_SizeY; y++)
{
for (int z = 0; z < m_SizeZ; z++)
{
for (int x = 0; x < HalfX; x++)
{
std::swap(m_BlockMetas[MakeIndex(x, y, z)], m_BlockMetas[MakeIndex(MaxX - x, y, z)]);
} // for x
} // for z
} // for y
} // if (HasBlockTypes)
}
void cBlockArea::SetRelBlockType(int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_BlockType)
{
if (m_BlockTypes == NULL)
@@ -1642,6 +1823,7 @@ bool cBlockArea::LoadFromSchematicNBT(cParsedNBT & a_NBT)
}
bool AreMetasPresent = (TBlockMetas > 0) && (a_NBT.GetType(TBlockMetas) == TAG_ByteArray);
Clear();
SetSize(SizeX, SizeY, SizeZ, AreMetasPresent ? (baTypes | baMetas) : baTypes);
// Copy the block types and metas: