Merged branch 'NetherFinish'.
This commit is contained in:
@@ -13,6 +13,7 @@
|
||||
#include "../Noise.h"
|
||||
#include "../BlockID.h"
|
||||
#include "../Simulator/FluidSimulator.h" // for cFluidSimulator::CanWashAway()
|
||||
#include "../Simulator/FireSimulator.h"
|
||||
#include "../World.h"
|
||||
|
||||
|
||||
@@ -39,6 +40,125 @@ static inline bool IsWater(BLOCKTYPE a_BlockType)
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// cFinishGenNetherClumpFoliage:
|
||||
|
||||
void cFinishGenNetherClumpFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
{
|
||||
double ChunkX = a_ChunkDesc.GetChunkX() + 0.1; // We can't devide through 0 so lets add 0.1 to all the chunk coordinates.
|
||||
double ChunkZ = a_ChunkDesc.GetChunkZ() + 0.1;
|
||||
|
||||
NOISE_DATATYPE Val1 = m_Noise.CubicNoise2D((float) (ChunkX * ChunkZ * 0.01f), (float) (ChunkZ / ChunkX * 0.01f));
|
||||
NOISE_DATATYPE Val2 = m_Noise.CubicNoise2D((float) (ChunkX / ChunkZ / 0.01f), (float) (ChunkZ * ChunkX / 0.01f));
|
||||
|
||||
if (Val1 < 0)
|
||||
{
|
||||
Val1 = -Val1;
|
||||
}
|
||||
|
||||
if (Val2 < 0)
|
||||
{
|
||||
Val2 = -Val2;
|
||||
}
|
||||
|
||||
int PosX, PosZ;
|
||||
// Calculate PosX
|
||||
if (Val1 <= 1)
|
||||
{
|
||||
PosX = (int) floor(Val1 * 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
PosX = (int) floor(16 / Val1);
|
||||
}
|
||||
|
||||
// Calculate PosZ
|
||||
if (Val2 <= 1)
|
||||
{
|
||||
PosZ = (int) floor(Val2 * 16);
|
||||
}
|
||||
else
|
||||
{
|
||||
PosZ = (int) floor(16 / Val2);
|
||||
}
|
||||
|
||||
for (int y = 1; y < cChunkDef::Height; y++)
|
||||
{
|
||||
if (a_ChunkDesc.GetBlockType(PosX, y, PosZ) != E_BLOCK_AIR)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!g_BlockIsSolid[a_ChunkDesc.GetBlockType(PosX, y - 1, PosZ)]) // Only place on solid blocks
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
NOISE_DATATYPE BlockType = m_Noise.CubicNoise1D((float) (ChunkX * ChunkZ) / (y * 0.1f));
|
||||
if (BlockType < -0.7)
|
||||
{
|
||||
TryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_BROWN_MUSHROOM);
|
||||
}
|
||||
else if (BlockType < 0)
|
||||
{
|
||||
TryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_RED_MUSHROOM);
|
||||
}
|
||||
else if (BlockType < 0.7)
|
||||
{
|
||||
TryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_FIRE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void cFinishGenNetherClumpFoliage::TryPlaceClump(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_Block)
|
||||
{
|
||||
bool IsFireBlock = a_Block == E_BLOCK_FIRE;
|
||||
|
||||
for (int x = a_RelX - 4; x < a_RelX + 4; x++)
|
||||
{
|
||||
float xx = (float) a_ChunkDesc.GetChunkX() * cChunkDef::Width + x;
|
||||
for (int z = a_RelZ - 4; z < a_RelZ + 4; z++)
|
||||
{
|
||||
float zz = (float) a_ChunkDesc.GetChunkZ() * cChunkDef::Width + z;
|
||||
for (int y = a_RelY - 2; y < a_RelY + 2; y++)
|
||||
{
|
||||
if (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR) // Don't replace non air blocks.
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
BLOCKTYPE BlockBelow = a_ChunkDesc.GetBlockType(x, y - 1, z);
|
||||
if (!g_BlockIsSolid[BlockBelow]) // Only place on solid blocks
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (IsFireBlock) // don't place fire on non-forever burning blocks.
|
||||
{
|
||||
if (!cFireSimulator::DoesBurnForever(BlockBelow))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NOISE_DATATYPE Val = m_Noise.CubicNoise2D(xx, zz);
|
||||
if (Val < -0.70)
|
||||
{
|
||||
a_ChunkDesc.SetBlockType(x, y, z, a_Block);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// cFinishGenSprinkleFoliage:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user