Merge branch 'master' of github.com:p-mcgowan/MCServer into animalTerrainFinisher
update
This commit is contained in:
@@ -692,8 +692,14 @@ static float GetMarbleNoise( float x, float y, float z, cNoise & a_Noise)
|
||||
float oct1 = (a_Noise.CubicNoise3D(x * 0.1f, y * 0.1f, z * 0.1f)) * 4;
|
||||
|
||||
oct1 = oct1 * oct1 * oct1;
|
||||
if (oct1 < 0.f) oct1 = PI_2;
|
||||
if (oct1 > PI_2) oct1 = PI_2;
|
||||
if (oct1 < 0.f)
|
||||
{
|
||||
oct1 = PI_2;
|
||||
}
|
||||
if (oct1 > PI_2)
|
||||
{
|
||||
oct1 = PI_2;
|
||||
}
|
||||
|
||||
return oct1;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "DungeonRoomsFinisher.h"
|
||||
#include "../FastRandom.h"
|
||||
#include "../BlockEntities/ChestEntity.h"
|
||||
#include "../BlockEntities/MobSpawnerEntity.h"
|
||||
|
||||
|
||||
|
||||
@@ -57,6 +58,22 @@ public:
|
||||
int SecondChestPos = (FirstChestPos + 2 + (rnd % (NumPositions - 3))) % NumPositions;
|
||||
m_Chest1 = DecodeChestCoords(FirstChestPos, SizeX, SizeZ);
|
||||
m_Chest2 = DecodeChestCoords(SecondChestPos, SizeX, SizeZ);
|
||||
|
||||
// Choose what the mobspawner will spawn.
|
||||
// 25% chance for a spider, 25% for a skeleton and 50% chance to get a zombie spawer.
|
||||
int MobType = (a_Noise.IntNoise3DInt(a_OriginX, m_FloorHeight, a_OriginZ) / 7) % 100;
|
||||
if (MobType <= 25)
|
||||
{
|
||||
m_MonsterType = mtSkeleton;
|
||||
}
|
||||
else if (MobType <= 50)
|
||||
{
|
||||
m_MonsterType = mtSpider;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_MonsterType = mtZombie;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
@@ -76,6 +93,8 @@ protected:
|
||||
/** The (absolute) coords of the second chest. The Y coord represents the chest's Meta value (facing). */
|
||||
Vector3i m_Chest2;
|
||||
|
||||
/** The monster type for the mobspawner entity. */
|
||||
eMonsterType m_MonsterType;
|
||||
|
||||
|
||||
/** Decodes the position index along the room walls into a proper 2D position for a chest.
|
||||
@@ -246,7 +265,9 @@ protected:
|
||||
)
|
||||
{
|
||||
a_ChunkDesc.SetBlockTypeMeta(CenterX, b, CenterZ, E_BLOCK_MOB_SPAWNER, 0);
|
||||
// TODO: Set the spawned mob
|
||||
cMobSpawnerEntity * MobSpawner = static_cast<cMobSpawnerEntity *>(a_ChunkDesc.GetBlockEntity(CenterX, b, CenterZ));
|
||||
ASSERT((MobSpawner != nullptr) && (MobSpawner->GetBlockType() == E_BLOCK_MOB_SPAWNER));
|
||||
MobSpawner->SetEntity(m_MonsterType);
|
||||
}
|
||||
}
|
||||
} ;
|
||||
|
||||
@@ -67,7 +67,7 @@ void cFinishGenNetherClumpFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Choose what block to use.
|
||||
NOISE_DATATYPE BlockType = m_Noise.IntNoise3D((int) ChunkX, y, (int) ChunkZ);
|
||||
if (BlockType < -0.7)
|
||||
@@ -197,10 +197,10 @@ void cFinishGenTallGrass::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// Get the top block + 1. This is the place where the grass would finaly be placed:
|
||||
int y = a_ChunkDesc.GetHeight(x, z) + 1;
|
||||
|
||||
|
||||
if (y >= 255)
|
||||
{
|
||||
continue;
|
||||
@@ -283,7 +283,7 @@ bool cFinishGenSprinkleFoliage::TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// All conditions met, place a sugarcane here:
|
||||
a_ChunkDesc.SetBlockType(a_RelX, a_RelY + 1, a_RelZ, E_BLOCK_SUGARCANE);
|
||||
return true;
|
||||
@@ -296,7 +296,7 @@ bool cFinishGenSprinkleFoliage::TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_
|
||||
void cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
{
|
||||
// Generate small foliage (1-block):
|
||||
|
||||
|
||||
// TODO: Update heightmap with 1-block-tall foliage
|
||||
for (int z = 0; z < cChunkDef::Width; z++)
|
||||
{
|
||||
@@ -321,7 +321,7 @@ void cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
// WEIRD, since we're using heightmap, so there should NOT be anything above it
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
const float xx = (float)BlockX;
|
||||
float val1 = m_Noise.CubicNoise2D(xx * 0.1f, zz * 0.1f);
|
||||
float val2 = m_Noise.CubicNoise2D(xx * 0.01f, zz * 0.01f);
|
||||
@@ -361,7 +361,7 @@ void cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
}
|
||||
break;
|
||||
} // case E_BLOCK_GRASS
|
||||
|
||||
|
||||
case E_BLOCK_SAND:
|
||||
{
|
||||
int y = Top + 1;
|
||||
@@ -372,7 +372,8 @@ void cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
(a_ChunkDesc.GetBlockType(x + 1, y, z) == E_BLOCK_AIR) &&
|
||||
(a_ChunkDesc.GetBlockType(x - 1, y, z) == E_BLOCK_AIR) &&
|
||||
(a_ChunkDesc.GetBlockType(x, y, z + 1) == E_BLOCK_AIR) &&
|
||||
(a_ChunkDesc.GetBlockType(x, y, z - 1) == E_BLOCK_AIR)
|
||||
(a_ChunkDesc.GetBlockType(x, y, z - 1) == E_BLOCK_AIR) &&
|
||||
IsDesertVariant(a_ChunkDesc.GetBiome(x, z))
|
||||
)
|
||||
{
|
||||
a_ChunkDesc.SetBlockType(x, ++Top, z, E_BLOCK_CACTUS);
|
||||
@@ -393,6 +394,20 @@ void cFinishGenSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
|
||||
|
||||
|
||||
bool cFinishGenSprinkleFoliage::IsDesertVariant(EMCSBiome a_Biome)
|
||||
{
|
||||
return
|
||||
(
|
||||
(a_Biome == biDesertHills) ||
|
||||
(a_Biome == biDesert) ||
|
||||
(a_Biome == biDesertM)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// cFinishGenSoulsandRims
|
||||
|
||||
@@ -770,7 +785,7 @@ void cFinishGenPreSimulator::StationarizeFluid(
|
||||
} // for y
|
||||
} // for x
|
||||
} // for z
|
||||
|
||||
|
||||
// Turn fluid at the chunk edges into non-stationary fluid:
|
||||
for (int y = 0; y < cChunkDef::Height; y++)
|
||||
{
|
||||
@@ -862,12 +877,12 @@ void cFinishGenFluidSprings::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
// Not in this chunk
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Get the height at which to try:
|
||||
int Height = m_Noise.IntNoise3DInt(128 * a_ChunkDesc.GetChunkX(), 1024, 256 * a_ChunkDesc.GetChunkZ()) / 11;
|
||||
Height %= m_HeightDistribution.GetSum();
|
||||
Height = m_HeightDistribution.MapValue(Height);
|
||||
|
||||
|
||||
// Try adding the spring at the height, if unsuccessful, move lower:
|
||||
for (int y = Height; y > 1; y--)
|
||||
{
|
||||
@@ -905,7 +920,7 @@ bool cFinishGenFluidSprings::TryPlaceSpring(cChunkDesc & a_ChunkDesc, int x, int
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
static const struct
|
||||
{
|
||||
int x, y, z;
|
||||
@@ -936,7 +951,7 @@ bool cFinishGenFluidSprings::TryPlaceSpring(cChunkDesc & a_ChunkDesc, int x, int
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
// Has exactly one air neighbor, place a spring:
|
||||
a_ChunkDesc.SetBlockTypeMeta(x, y, z, m_Fluid, 0);
|
||||
return true;
|
||||
|
||||
@@ -142,14 +142,17 @@ class cFinishGenSprinkleFoliage :
|
||||
{
|
||||
public:
|
||||
cFinishGenSprinkleFoliage(int a_Seed) : m_Noise(a_Seed), m_Seed(a_Seed) {}
|
||||
|
||||
|
||||
protected:
|
||||
cNoise m_Noise;
|
||||
int m_Seed;
|
||||
|
||||
|
||||
/// Tries to place sugarcane at the coords specified, returns true if successful
|
||||
bool TryAddSugarcane(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ);
|
||||
|
||||
|
||||
// Returns true is the specified biome is a desert or its variant
|
||||
static bool IsDesertVariant(EMCSBiome a_biome);
|
||||
|
||||
// cFinishGen override:
|
||||
virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
|
||||
} ;
|
||||
@@ -187,31 +190,31 @@ public:
|
||||
{
|
||||
m_IsAllowedBelow[idx] = false;
|
||||
}
|
||||
|
||||
|
||||
// Load the allowed blocks into m_IsAllowedBelow
|
||||
for (BlockList::iterator itr = a_AllowedBelow.begin(); itr != a_AllowedBelow.end(); ++itr)
|
||||
{
|
||||
m_IsAllowedBelow[*itr] = true;
|
||||
}
|
||||
|
||||
|
||||
// Initialize all the biome types.
|
||||
for (size_t idx = 0; idx < ARRAYCOUNT(m_IsBiomeAllowed); ++idx)
|
||||
{
|
||||
m_IsBiomeAllowed[idx] = false;
|
||||
}
|
||||
|
||||
|
||||
// Load the allowed biomes into m_IsBiomeAllowed
|
||||
for (BiomeList::iterator itr = a_Biomes.begin(); itr != a_Biomes.end(); ++itr)
|
||||
{
|
||||
m_IsBiomeAllowed[*itr] = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
cNoise m_Noise;
|
||||
BLOCKTYPE m_BlockType;
|
||||
int m_Amount; ///< Relative amount of blocks to try adding. 1 = one block per 256 biome columns.
|
||||
|
||||
|
||||
int GetNumToGen(const cChunkDef::BiomeMap & a_BiomeMap);
|
||||
|
||||
// Returns true if the given biome is a biome that is allowed.
|
||||
@@ -226,7 +229,7 @@ protected:
|
||||
return m_IsAllowedBelow[a_BlockBelow];
|
||||
}
|
||||
|
||||
|
||||
|
||||
// cFinishGen override:
|
||||
virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
|
||||
} ;
|
||||
@@ -243,11 +246,11 @@ public:
|
||||
m_Level(a_Level)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
int GetLevel(void) const { return m_Level; }
|
||||
protected:
|
||||
int m_Level;
|
||||
|
||||
|
||||
// cFinishGen override:
|
||||
virtual void GenFinish(cChunkDesc & a_ChunkDesc) override;
|
||||
} ;
|
||||
@@ -261,7 +264,7 @@ class cFinishGenPreSimulator :
|
||||
{
|
||||
public:
|
||||
cFinishGenPreSimulator(bool a_PreSimulateFallingBlocks, bool a_PreSimulateWater, bool a_PreSimulateLava);
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
bool m_PreSimulateFallingBlocks;
|
||||
@@ -273,7 +276,7 @@ protected:
|
||||
cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change
|
||||
cChunkDef::HeightMap & a_HeightMap // Height map to update by the current data
|
||||
);
|
||||
|
||||
|
||||
/** For each fluid block:
|
||||
- if all surroundings are of the same fluid, makes it stationary; otherwise makes it flowing (excl. top)
|
||||
- all fluid on the chunk's edge is made flowing
|
||||
@@ -298,7 +301,7 @@ class cFinishGenFluidSprings :
|
||||
{
|
||||
public:
|
||||
cFinishGenFluidSprings(int a_Seed, BLOCKTYPE a_Fluid, cIniFile & a_IniFile, eDimension a_Dimension);
|
||||
|
||||
|
||||
protected:
|
||||
|
||||
cNoise m_Noise;
|
||||
|
||||
Reference in New Issue
Block a user