From e8e678e1b73adb3cc5987e6808cbbd633b6805e6 Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Sun, 11 Nov 2012 15:35:49 +0000 Subject: [PATCH] Added DeadBushes finisher (initial patch by STR_Warrior; DeathBushes FTW!) git-svn-id: http://mc-server.googlecode.com/svn/trunk@1037 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/Generating/ChunkGenerator.cpp | 25 +++++---- source/Generating/FinishGen.cpp | 84 +++++++++++++++++++++++++--- source/Generating/FinishGen.h | 35 +++++++++++- 3 files changed, 125 insertions(+), 19 deletions(-) diff --git a/source/Generating/ChunkGenerator.cpp b/source/Generating/ChunkGenerator.cpp index 27a802e4d..c68ceb7f9 100644 --- a/source/Generating/ChunkGenerator.cpp +++ b/source/Generating/ChunkGenerator.cpp @@ -340,18 +340,20 @@ void cChunkGenerator::InitStructureGens(cIniFile & a_IniFile) void cChunkGenerator::InitFinishGens(cIniFile & a_IniFile) { - AString Structures = a_IniFile.GetValueSet("Generator", "Finishers", "SprinkleFoliage,Ice,Snow,Lilypads,BottomLava"); + AString Structures = a_IniFile.GetValueSet("Generator", "Finishers", "SprinkleFoliage,Ice,Snow,Lilypads,BottomLava,DeadBushes,PreSimulator"); AStringVector Str = StringSplit(Structures, ","); for (AStringVector::const_iterator itr = Str.begin(); itr != Str.end(); ++itr) { - if (NoCaseCompare(*itr, "SprinkleFoliage") == 0) + // Finishers, alpha-sorted: + if (NoCaseCompare(*itr, "BottomLava") == 0) { - m_FinishGens.push_back(new cFinishGenSprinkleFoliage(m_Seed)); + int BottomLavaLevel = a_IniFile.GetValueSetI("Generator", "BottomLavaLevel", 10); + m_FinishGens.push_back(new cFinishGenBottomLava(BottomLavaLevel)); } - else if (NoCaseCompare(*itr, "Snow") == 0) + else if (NoCaseCompare(*itr, "DeadBushes") == 0) { - m_FinishGens.push_back(new cFinishGenSnow); + m_FinishGens.push_back(new cFinishGenDeadBushes(m_Seed)); } else if (NoCaseCompare(*itr, "Ice") == 0) { @@ -361,15 +363,18 @@ void cChunkGenerator::InitFinishGens(cIniFile & a_IniFile) { m_FinishGens.push_back(new cFinishGenLilypads(m_Seed)); } - else if (NoCaseCompare(*itr, "BottomLava") == 0) - { - int BottomLavaLevel = a_IniFile.GetValueSetI("Generator", "BottomLavaLevel", 10); - m_FinishGens.push_back(new cFinishGenBottomLava(BottomLavaLevel)); - } else if (NoCaseCompare(*itr, "PreSimulator") == 0) { m_FinishGens.push_back(new cFinishGenPreSimulator); } + else if (NoCaseCompare(*itr, "Snow") == 0) + { + m_FinishGens.push_back(new cFinishGenSnow); + } + else if (NoCaseCompare(*itr, "SprinkleFoliage") == 0) + { + m_FinishGens.push_back(new cFinishGenSprinkleFoliage(m_Seed)); + } } // for itr - Str[] } diff --git a/source/Generating/FinishGen.cpp b/source/Generating/FinishGen.cpp index cdea73b6b..edb213a13 100644 --- a/source/Generating/FinishGen.cpp +++ b/source/Generating/FinishGen.cpp @@ -307,12 +307,12 @@ int cFinishGenLilypads::GetNumLilypads(const cChunkDef::BiomeMap & a_BiomeMap) void cFinishGenLilypads::GenFinish( int a_ChunkX, int a_ChunkZ, - cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change - cChunkDef::BlockNibbles & a_BlockMeta, // Block meta to read and change - cChunkDef::HeightMap & a_HeightMap, // Height map to read and change by the current data - const cChunkDef::BiomeMap & a_BiomeMap, // Biomes to adhere to - cEntityList & a_Entities, // Entities may be added or deleted - cBlockEntityList & a_BlockEntities // Block entities may be added or deleted + cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change + cChunkDef::BlockNibbles & a_BlockMeta, // Block meta to read and change + cChunkDef::HeightMap & a_HeightMap, // Height map to read and change by the current data + const cChunkDef::BiomeMap & a_BiomeMap, // Biomes to adhere to + cEntityList & a_Entities, // Entities may be added or deleted + cBlockEntityList & a_BlockEntities // Block entities may be added or deleted ) { // Add Lilypads on top of water surface in Swampland @@ -320,8 +320,8 @@ void cFinishGenLilypads::GenFinish( int NumLilypads = GetNumLilypads(a_BiomeMap); for (int i = 0; i < NumLilypads; i++) { - int x = m_Noise.IntNoise3DInt(a_ChunkX + a_ChunkZ, a_ChunkZ, i) % cChunkDef::Width; - int z = m_Noise.IntNoise3DInt(a_ChunkX - a_ChunkZ, i, a_ChunkZ) % cChunkDef::Width; + int x = (m_Noise.IntNoise3DInt(a_ChunkX + a_ChunkZ, a_ChunkZ, i) / 13) % cChunkDef::Width; + int z = (m_Noise.IntNoise3DInt(a_ChunkX - a_ChunkZ, i, a_ChunkZ) / 11) % cChunkDef::Width; // Place a lily pad at {x, z} if possible (swampland, empty block, water below): if (cChunkDef::GetBiome(a_BiomeMap, x, z) != biSwampland) @@ -545,3 +545,71 @@ void cFinishGenPreSimulator::StationarizeFluid( + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cFinishGenDeadBushes: + +int cFinishGenDeadBushes::GetNumDeadBushes(const cChunkDef::BiomeMap & a_BiomeMap) +{ + int res = 0; + for (int i = 0; i < ARRAYCOUNT(a_BiomeMap); i++) + { + if (a_BiomeMap[i] == biDesert) + { + res++; + } + } // for i - a_BiomeMap[] + return res / 128; +} + + + + + +void cFinishGenDeadBushes::GenFinish( + int a_ChunkX, int a_ChunkZ, + cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change + cChunkDef::BlockNibbles & a_BlockMeta, // Block meta to read and change + cChunkDef::HeightMap & a_HeightMap, // Height map to read and change by the current data + const cChunkDef::BiomeMap & a_BiomeMap, // Biomes to adhere to + cEntityList & a_Entities, // Entities may be added or deleted + cBlockEntityList & a_BlockEntities // Block entities may be added or deleted +) +{ + // Add DeadBushes on top of sand surface in Desert + + int NumDeadBushes = GetNumDeadBushes(a_BiomeMap); + for (int i = 0; i < NumDeadBushes; i++) + { + int x = (m_Noise.IntNoise3DInt(a_ChunkX + a_ChunkZ, a_ChunkZ, i) / 13) % cChunkDef::Width; + int z = (m_Noise.IntNoise3DInt(a_ChunkX - a_ChunkZ, i, a_ChunkZ) / 11) % cChunkDef::Width; + + // Place a dead bush at {x, z} if possible (desert, empty block, sand below): + if (cChunkDef::GetBiome(a_BiomeMap, x, z) != biDesert) + { + // not swampland + continue; + } + int Height = cChunkDef::GetHeight(a_HeightMap, x, z); + if (Height >= cChunkDef::Height) + { + // Too high up + continue; + } + if (cChunkDef::GetBlock(a_BlockTypes, x, Height + 1, z) != E_BLOCK_AIR) + { + // not empty block + continue; + } + switch (cChunkDef::GetBlock(a_BlockTypes, x, Height, z)) + { + case E_BLOCK_SAND: + { + cChunkDef::SetBlock(a_BlockTypes, x, Height + 1, z, E_BLOCK_DEAD_BUSH); + cChunkDef::SetHeight(a_HeightMap, x, z, Height + 1); + break; + } + } // switch (GetBlock) + } // for i +} + diff --git a/source/Generating/FinishGen.h b/source/Generating/FinishGen.h index ecf26e5fb..6a2367f38 100644 --- a/source/Generating/FinishGen.h +++ b/source/Generating/FinishGen.h @@ -7,6 +7,8 @@ - cFinishGenSprinkleFoliage - cFinishGenLilypads - cFinishGenBottomLava + - cFinishGenPreSimulator + - cFinishGenDeadBushes */ @@ -59,6 +61,7 @@ protected: + class cFinishGenSprinkleFoliage : public cFinishGen { @@ -150,7 +153,6 @@ protected: - class cFinishGenPreSimulator : public cFinishGen { @@ -190,3 +192,34 @@ protected: + +class cFinishGenDeadBushes : + public cFinishGen +{ +public: + cFinishGenDeadBushes(int a_Seed) : + m_Noise(a_Seed) + { + } + +protected: + cNoise m_Noise; + + int GetNumDeadBushes(const cChunkDef::BiomeMap & a_BiomeMap); + + // cFinishGen override: + virtual void GenFinish( + int a_ChunkX, int a_ChunkZ, + cChunkDef::BlockTypes & a_BlockTypes, // Block types to read and change + cChunkDef::BlockNibbles & a_BlockMeta, // Block meta to read and change + cChunkDef::HeightMap & a_HeightMap, // Height map to read and change by the current data + const cChunkDef::BiomeMap & a_BiomeMap, // Biomes to adhere to + cEntityList & a_Entities, // Entities may be added or deleted + cBlockEntityList & a_BlockEntities // Block entities may be added or deleted + ) override; +} ; + + + + +