MineShafts: added supports in corridors
git-svn-id: http://mc-server.googlecode.com/svn/trunk@1329 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
55eaa3e175
commit
d8635f812c
@ -117,20 +117,18 @@ public:
|
|||||||
);
|
);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
static const int MAX_SEGMENTS = 5;
|
||||||
|
|
||||||
int m_NumSegments;
|
int m_NumSegments;
|
||||||
eDirection m_Direction;
|
eDirection m_Direction;
|
||||||
|
bool m_HasFullBeam[MAX_SEGMENTS]; // If true, segment at that index has a full beam support (planks in the top center block)
|
||||||
|
|
||||||
cMineShaftCorridor(
|
cMineShaftCorridor(
|
||||||
cStructGenMineShafts::cMineShaftSystem & a_ParentSystem,
|
cStructGenMineShafts::cMineShaftSystem & a_ParentSystem,
|
||||||
const cCuboid & a_BoundingBox, int a_NumSegments, eDirection a_Direction
|
const cCuboid & a_BoundingBox, int a_NumSegments, eDirection a_Direction,
|
||||||
) :
|
cNoise & a_Noise
|
||||||
super(a_ParentSystem, mskCorridor),
|
);
|
||||||
m_NumSegments(a_NumSegments),
|
|
||||||
m_Direction(a_Direction)
|
|
||||||
{
|
|
||||||
m_BoundingBox = a_BoundingBox;
|
|
||||||
}
|
|
||||||
|
|
||||||
// cMineShaft overrides:
|
// cMineShaft overrides:
|
||||||
virtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) override;
|
virtual void AppendBranches(int a_RecursionLevel, cNoise & a_Noise) override;
|
||||||
virtual void ProcessChunk(cChunkDesc & a_ChunkDesc) override;
|
virtual void ProcessChunk(cChunkDesc & a_ChunkDesc) override;
|
||||||
@ -448,6 +446,28 @@ void cMineShaftDirtRoom::ProcessChunk(cChunkDesc & a_ChunkDesc)
|
|||||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// cMineShaftCorridor:
|
// cMineShaftCorridor:
|
||||||
|
|
||||||
|
cMineShaftCorridor::cMineShaftCorridor(
|
||||||
|
cStructGenMineShafts::cMineShaftSystem & a_ParentSystem,
|
||||||
|
const cCuboid & a_BoundingBox, int a_NumSegments, eDirection a_Direction,
|
||||||
|
cNoise & a_Noise
|
||||||
|
) :
|
||||||
|
super(a_ParentSystem, mskCorridor),
|
||||||
|
m_NumSegments(a_NumSegments),
|
||||||
|
m_Direction(a_Direction)
|
||||||
|
{
|
||||||
|
m_BoundingBox = a_BoundingBox;
|
||||||
|
int rnd = a_Noise.IntNoise3DInt(a_BoundingBox.p1.x, a_BoundingBox.p1.y, a_BoundingBox.p1.z) / 7;
|
||||||
|
for (int i = 0; i < a_NumSegments; i++)
|
||||||
|
{
|
||||||
|
m_HasFullBeam[i] = (rnd % 4) < 3; // 75 % chance of full beam
|
||||||
|
rnd >>= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
cMineShaft * cMineShaftCorridor::CreateAndFit(
|
cMineShaft * cMineShaftCorridor::CreateAndFit(
|
||||||
cStructGenMineShafts::cMineShaftSystem & a_ParentSystem,
|
cStructGenMineShafts::cMineShaftSystem & a_ParentSystem,
|
||||||
int a_PivotX, int a_PivotY, int a_PivotZ, eDirection a_Direction,
|
int a_PivotX, int a_PivotY, int a_PivotZ, eDirection a_Direction,
|
||||||
@ -457,7 +477,7 @@ cMineShaft * cMineShaftCorridor::CreateAndFit(
|
|||||||
cCuboid BoundingBox(a_PivotX, a_PivotY - 1, a_PivotZ);
|
cCuboid BoundingBox(a_PivotX, a_PivotY - 1, a_PivotZ);
|
||||||
BoundingBox.p2.y += 3;
|
BoundingBox.p2.y += 3;
|
||||||
int rnd = a_Noise.IntNoise3DInt(a_PivotX, a_PivotY + a_ParentSystem.m_MineShafts.size(), a_PivotZ) / 7;
|
int rnd = a_Noise.IntNoise3DInt(a_PivotX, a_PivotY + a_ParentSystem.m_MineShafts.size(), a_PivotZ) / 7;
|
||||||
int NumSegments = 2 + (rnd) % 4; // 2 .. 5
|
int NumSegments = 2 + (rnd) % (MAX_SEGMENTS - 1); // 2 .. MAX_SEGMENTS
|
||||||
switch (a_Direction)
|
switch (a_Direction)
|
||||||
{
|
{
|
||||||
case dirXP: BoundingBox.p2.x += NumSegments * 5; BoundingBox.p1.z -= 1; BoundingBox.p2.z += 1; break;
|
case dirXP: BoundingBox.p2.x += NumSegments * 5; BoundingBox.p1.z -= 1; BoundingBox.p2.z += 1; break;
|
||||||
@ -469,7 +489,7 @@ cMineShaft * cMineShaftCorridor::CreateAndFit(
|
|||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return new cMineShaftCorridor(a_ParentSystem, BoundingBox, NumSegments, a_Direction);
|
return new cMineShaftCorridor(a_ParentSystem, BoundingBox, NumSegments, a_Direction, a_Noise);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -560,6 +580,78 @@ void cMineShaftCorridor::ProcessChunk(cChunkDesc & a_ChunkDesc)
|
|||||||
RelBoundingBox.p1.y -= 1;
|
RelBoundingBox.p1.y -= 1;
|
||||||
RelBoundingBox.p2.y = RelBoundingBox.p1.y;
|
RelBoundingBox.p2.y = RelBoundingBox.p1.y;
|
||||||
a_ChunkDesc.ReplaceRelCuboid(RelBoundingBox, E_BLOCK_AIR, 0, E_BLOCK_PLANKS, 0);
|
a_ChunkDesc.ReplaceRelCuboid(RelBoundingBox, E_BLOCK_AIR, 0, E_BLOCK_PLANKS, 0);
|
||||||
|
switch (m_Direction)
|
||||||
|
{
|
||||||
|
case dirXM:
|
||||||
|
case dirXP:
|
||||||
|
{
|
||||||
|
int y1 = m_BoundingBox.p1.y + 1;
|
||||||
|
int y2 = m_BoundingBox.p1.y + 2;
|
||||||
|
int y3 = m_BoundingBox.p1.y + 3;
|
||||||
|
int z1 = m_BoundingBox.p1.z - BlockZ;
|
||||||
|
int z2 = m_BoundingBox.p2.z - BlockZ;
|
||||||
|
for (int i = 0; i < m_NumSegments; i++)
|
||||||
|
{
|
||||||
|
int x = m_BoundingBox.p1.x + i * 5 + 3 - BlockX;
|
||||||
|
if ((x < 0) || (x >= cChunkDef::Width))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ((z1 >= 0) && (z1 < cChunkDef::Width))
|
||||||
|
{
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x, y1, z1, E_BLOCK_FENCE, 0);
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x, y2, z1, E_BLOCK_FENCE, 0);
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x, y3, z1, E_BLOCK_PLANKS, 0);
|
||||||
|
}
|
||||||
|
if ((z2 >= 0) && (z2 < cChunkDef::Width))
|
||||||
|
{
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x, y1, z2, E_BLOCK_FENCE, 0);
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x, y2, z2, E_BLOCK_FENCE, 0);
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x, y3, z2, E_BLOCK_PLANKS, 0);
|
||||||
|
}
|
||||||
|
if ((z1 > -1) && (z1 < cChunkDef::Width - 1) && m_HasFullBeam[i])
|
||||||
|
{
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x, y3, z1 + 1, E_BLOCK_PLANKS, 0);
|
||||||
|
}
|
||||||
|
} // for i - NumSegments
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case dirZM:
|
||||||
|
case dirZP:
|
||||||
|
{
|
||||||
|
int y1 = m_BoundingBox.p1.y + 1;
|
||||||
|
int y2 = m_BoundingBox.p1.y + 2;
|
||||||
|
int y3 = m_BoundingBox.p1.y + 3;
|
||||||
|
int x1 = m_BoundingBox.p1.x - BlockX;
|
||||||
|
int x2 = m_BoundingBox.p2.x - BlockX;
|
||||||
|
for (int i = 0; i < m_NumSegments; i++)
|
||||||
|
{
|
||||||
|
int z = m_BoundingBox.p1.z + i * 5 + 3 - BlockZ;
|
||||||
|
if ((z < 0) || (z >= cChunkDef::Width))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if ((x1 >= 0) && (x1 < cChunkDef::Width))
|
||||||
|
{
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x1, y1, z, E_BLOCK_FENCE, 0);
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x1, y2, z, E_BLOCK_FENCE, 0);
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x1, y3, z, E_BLOCK_PLANKS, 0);
|
||||||
|
}
|
||||||
|
if ((x2 >= 0) && (x2 < cChunkDef::Width))
|
||||||
|
{
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x2, y1, z, E_BLOCK_FENCE, 0);
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x2, y2, z, E_BLOCK_FENCE, 0);
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x2, y3, z, E_BLOCK_PLANKS, 0);
|
||||||
|
}
|
||||||
|
if ((x1 > -1) && (x1 < cChunkDef::Width - 1) && m_HasFullBeam[i])
|
||||||
|
{
|
||||||
|
a_ChunkDesc.SetBlockTypeMeta(x1 + 1, y3, z, E_BLOCK_PLANKS, 0);
|
||||||
|
}
|
||||||
|
} // for i - NumSegments
|
||||||
|
break;
|
||||||
|
} // case dirZ?
|
||||||
|
} // for i
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user