From 82a06725bddd18e88db59afac65435bf3079a26b Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Fri, 10 Jan 2014 16:31:45 +0100 Subject: Added cFinishGenNetherSprinkleFoliage. --- src/Generating/FinishGen.cpp | 45 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'src/Generating/FinishGen.cpp') diff --git a/src/Generating/FinishGen.cpp b/src/Generating/FinishGen.cpp index 145fe22e0..8c05b2135 100644 --- a/src/Generating/FinishGen.cpp +++ b/src/Generating/FinishGen.cpp @@ -39,6 +39,51 @@ static inline bool IsWater(BLOCKTYPE a_BlockType) +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// cFinishGenNetherSprinkleFoliage: + +void cFinishGenNetherSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc) +{ + double ChunkX = a_ChunkDesc.GetChunkX() + 0.5; // We can't devide through 0 so lets add 0.5 to all the chunk coordinates. + double ChunkZ = a_ChunkDesc.GetChunkZ() + 0.5; + + for (int z = 0; z < cChunkDef::Width; z++) + { + for (int x = 0; x < cChunkDef::Width; x++) + { + for (int y = 1; y < cChunkDef::Height; y++) + { + if (!g_BlockIsSolid[a_ChunkDesc.GetBlockType(x, y - 1, z)]) // Only place on solid blocks + { + continue; + } + if (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR) + { + continue; + } + + NOISE_DATATYPE Val = m_Noise.CubicNoise1D((float) ((ChunkX * x) * (ChunkZ * z) * y)); + if (Val < -0.98) + { + a_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_BROWN_MUSHROOM); + } + else if (Val < -0.96) + { + a_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_RED_MUSHROOM); + } + else if (Val < -0.94) + { + a_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_FIRE); + } + } + } + } +} + + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cFinishGenSprinkleFoliage: -- cgit v1.2.3 From 7c787de2615fb50169e92bbda388c4ef6b29d90a Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Fri, 17 Jan 2014 22:58:01 +0100 Subject: First attempt at creating a clumb version NetherFinisher. --- src/Generating/FinishGen.cpp | 84 ++++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 22 deletions(-) (limited to 'src/Generating/FinishGen.cpp') diff --git a/src/Generating/FinishGen.cpp b/src/Generating/FinishGen.cpp index 8c05b2135..87f00cbab 100644 --- a/src/Generating/FinishGen.cpp +++ b/src/Generating/FinishGen.cpp @@ -44,46 +44,86 @@ static inline bool IsWater(BLOCKTYPE a_BlockType) void cFinishGenNetherSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc) { - double ChunkX = a_ChunkDesc.GetChunkX() + 0.5; // We can't devide through 0 so lets add 0.5 to all the chunk coordinates. - double ChunkZ = a_ChunkDesc.GetChunkZ() + 0.5; + 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 Val = m_Noise.CubicNoise2D((float) ChunkX, (float) ChunkZ); + + int Pos; + if (Val <= 0) + { + Pos = (int) (Val + 1) * 16; + } + else if (Val <= 1) + { + Pos = (int) Val * 16; + } + else + { + Pos = (int) 16 / Val; + } + + for (int y = 1; y < cChunkDef::Height; y++) + { + if (a_ChunkDesc.GetBlockType(Pos, y, Pos) != E_BLOCK_AIR) + { + continue; + } + if (!g_BlockIsSolid[a_ChunkDesc.GetBlockType(Pos, y - 1, Pos)]) // Only place on solid blocks + { + continue; + } + + NOISE_DATATYPE BlockType = m_Noise.CubicNoise2D(ChunkX / ChunkZ, y * 0.01f); + if (BlockType > 0.08) + { + TryPlaceClumb(a_ChunkDesc, Pos, y, Pos, E_BLOCK_BROWN_MUSHROOM); + } + else if (BlockType > -0.18) + { + TryPlaceClumb(a_ChunkDesc, Pos, y, Pos, E_BLOCK_RED_MUSHROOM); + } + else if (BlockType > -0.28) + { + TryPlaceClumb(a_ChunkDesc, Pos, y, Pos, E_BLOCK_FIRE); + } + } +} - for (int z = 0; z < cChunkDef::Width; z++) + + + + +void cFinishGenNetherSprinkleFoliage::TryPlaceClumb(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_Block) +{ + a_ChunkDesc.SetBlockType(a_RelX, a_RelY, a_RelZ, a_Block); + for (int x = a_RelX - 4; x < a_RelX + 4; x++) { - for (int x = 0; x < cChunkDef::Width; x++) + float xx = (float) a_ChunkDesc.GetChunkX() * cChunkDef::Width + x; + for (int z = a_RelZ - 4; x < a_RelX + 4; x++) { - for (int y = 1; y < cChunkDef::Height; y++) + float zz = (float) a_ChunkDesc.GetChunkZ() * cChunkDef::Width + z; + for (int y = a_RelY - 2; y < a_RelY + 2; y++) { - if (!g_BlockIsSolid[a_ChunkDesc.GetBlockType(x, y - 1, z)]) // Only place on solid blocks + if (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR) // Don't replace non air blocks. { continue; } - if (a_ChunkDesc.GetBlockType(x, y, z) != E_BLOCK_AIR) + if (!g_BlockIsSolid[a_ChunkDesc.GetBlockType(x, y - 1, z)]) // Only place on solid blocks { continue; } - NOISE_DATATYPE Val = m_Noise.CubicNoise1D((float) ((ChunkX * x) * (ChunkZ * z) * y)); - if (Val < -0.98) - { - a_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_BROWN_MUSHROOM); - } - else if (Val < -0.96) - { - a_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_RED_MUSHROOM); - } - else if (Val < -0.94) + NOISE_DATATYPE Val = m_Noise.CubicNoise1D(xx * zz * 0.1f / y); + if (Val > 1) { - a_ChunkDesc.SetBlockType(x, y, z, E_BLOCK_FIRE); + a_ChunkDesc.SetBlockType(x, y, z, a_Block); } } } } } - - - - /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cFinishGenSprinkleFoliage: -- cgit v1.2.3 From 9f17c9799bfdbf1a6594c41a42b60492d66e7d5b Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 18 Jan 2014 00:27:13 +0100 Subject: It now actualy works. --- src/Generating/FinishGen.cpp | 62 ++++++++++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 20 deletions(-) (limited to 'src/Generating/FinishGen.cpp') diff --git a/src/Generating/FinishGen.cpp b/src/Generating/FinishGen.cpp index 87f00cbab..9c98994e2 100644 --- a/src/Generating/FinishGen.cpp +++ b/src/Generating/FinishGen.cpp @@ -47,45 +47,63 @@ void cFinishGenNetherSprinkleFoliage::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 Val = m_Noise.CubicNoise2D((float) ChunkX, (float) ChunkZ); + 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; + } - int Pos; - if (Val <= 0) + if (Val2 < 0) { - Pos = (int) (Val + 1) * 16; + Val2 = -Val2; } - else if (Val <= 1) + + int PosX, PosZ; + // Calculate PosX + if (Val1 <= 1) { - Pos = (int) Val * 16; + PosX = (int) floor(Val1 * 16); } else { - Pos = (int) 16 / Val; + 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(Pos, y, Pos) != E_BLOCK_AIR) + if (a_ChunkDesc.GetBlockType(PosX, y, PosZ) != E_BLOCK_AIR) { continue; } - if (!g_BlockIsSolid[a_ChunkDesc.GetBlockType(Pos, y - 1, Pos)]) // Only place on solid blocks + if (!g_BlockIsSolid[a_ChunkDesc.GetBlockType(PosX, y - 1, PosZ)]) // Only place on solid blocks { continue; } - NOISE_DATATYPE BlockType = m_Noise.CubicNoise2D(ChunkX / ChunkZ, y * 0.01f); - if (BlockType > 0.08) + NOISE_DATATYPE BlockType = m_Noise.CubicNoise1D((float) (ChunkX * ChunkZ) / (y * 0.1f)); + if (BlockType < 0.10) { - TryPlaceClumb(a_ChunkDesc, Pos, y, Pos, E_BLOCK_BROWN_MUSHROOM); + TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_BROWN_MUSHROOM); } - else if (BlockType > -0.18) + else if (BlockType < -0.09) { - TryPlaceClumb(a_ChunkDesc, Pos, y, Pos, E_BLOCK_RED_MUSHROOM); + TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_RED_MUSHROOM); } - else if (BlockType > -0.28) + else if (BlockType < -0.08) { - TryPlaceClumb(a_ChunkDesc, Pos, y, Pos, E_BLOCK_FIRE); + TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_FIRE); } } } @@ -100,7 +118,7 @@ void cFinishGenNetherSprinkleFoliage::TryPlaceClumb(cChunkDesc & a_ChunkDesc, in 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; x < a_RelX + 4; 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++) @@ -114,16 +132,20 @@ void cFinishGenNetherSprinkleFoliage::TryPlaceClumb(cChunkDesc & a_ChunkDesc, in continue; } - NOISE_DATATYPE Val = m_Noise.CubicNoise1D(xx * zz * 0.1f / y); - if (Val > 1) + NOISE_DATATYPE Val = m_Noise.CubicNoise2D(xx, zz); + if (Val < -0.70) { - a_ChunkDesc.SetBlockType(x, y, z, a_Block); + a_ChunkDesc.SetBlockType(x, y, z, a_Block); } } } } } + + + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // cFinishGenSprinkleFoliage: -- cgit v1.2.3 From 087d650aed362cbf14fdd50940d69d5dff6c4667 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 18 Jan 2014 00:37:21 +0100 Subject: Fixed bug where only brown mushrooms would spawn. --- src/Generating/FinishGen.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/Generating/FinishGen.cpp') diff --git a/src/Generating/FinishGen.cpp b/src/Generating/FinishGen.cpp index 9c98994e2..0b5205c5c 100644 --- a/src/Generating/FinishGen.cpp +++ b/src/Generating/FinishGen.cpp @@ -93,15 +93,15 @@ void cFinishGenNetherSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc) } NOISE_DATATYPE BlockType = m_Noise.CubicNoise1D((float) (ChunkX * ChunkZ) / (y * 0.1f)); - if (BlockType < 0.10) + if (BlockType < -0.30) { TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_BROWN_MUSHROOM); } - else if (BlockType < -0.09) + else if (BlockType < -0.20) { TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_RED_MUSHROOM); } - else if (BlockType < -0.08) + else if (BlockType < -0.10) { TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_FIRE); } -- cgit v1.2.3 From dd7c02bba9b963afa572ba3e3b9abe50aa8cf4d5 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 18 Jan 2014 13:45:41 +0100 Subject: Some tweaks. Everything generates more often. Fire can only spawn on ForeverBurning blocks. --- src/Generating/FinishGen.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'src/Generating/FinishGen.cpp') diff --git a/src/Generating/FinishGen.cpp b/src/Generating/FinishGen.cpp index 0b5205c5c..5726c5806 100644 --- a/src/Generating/FinishGen.cpp +++ b/src/Generating/FinishGen.cpp @@ -13,6 +13,7 @@ #include "../Noise.h" #include "../BlockID.h" #include "../Simulator/FluidSimulator.h" // for cFluidSimulator::CanWashAway() +#include "../Simulator/FireSimulator.h" #include "../World.h" @@ -93,15 +94,15 @@ void cFinishGenNetherSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc) } NOISE_DATATYPE BlockType = m_Noise.CubicNoise1D((float) (ChunkX * ChunkZ) / (y * 0.1f)); - if (BlockType < -0.30) + if (BlockType < -0.7) { TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_BROWN_MUSHROOM); } - else if (BlockType < -0.20) + else if (BlockType < 0) { TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_RED_MUSHROOM); } - else if (BlockType < -0.10) + else if (BlockType < 0.7) { TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_FIRE); } @@ -114,7 +115,8 @@ void cFinishGenNetherSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc) void cFinishGenNetherSprinkleFoliage::TryPlaceClumb(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_Block) { - a_ChunkDesc.SetBlockType(a_RelX, a_RelY, a_RelZ, 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; @@ -127,11 +129,22 @@ void cFinishGenNetherSprinkleFoliage::TryPlaceClumb(cChunkDesc & a_ChunkDesc, in { continue; } - if (!g_BlockIsSolid[a_ChunkDesc.GetBlockType(x, y - 1, z)]) // Only place on solid blocks + + 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) { -- cgit v1.2.3 From ca27f87272c647d583f6df2491c7f2cc4cd729a2 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 18 Jan 2014 14:16:07 +0100 Subject: Renamed cFinishGenNetherSprinkleFoliage to cFinishGenNetherClumpFoliage. Fixed typo's --- src/Generating/FinishGen.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/Generating/FinishGen.cpp') diff --git a/src/Generating/FinishGen.cpp b/src/Generating/FinishGen.cpp index 5726c5806..cd4ef13aa 100644 --- a/src/Generating/FinishGen.cpp +++ b/src/Generating/FinishGen.cpp @@ -41,9 +41,9 @@ static inline bool IsWater(BLOCKTYPE a_BlockType) /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// cFinishGenNetherSprinkleFoliage: +// cFinishGenNetherClumpFoliage: -void cFinishGenNetherSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc) +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; @@ -96,15 +96,15 @@ void cFinishGenNetherSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc) NOISE_DATATYPE BlockType = m_Noise.CubicNoise1D((float) (ChunkX * ChunkZ) / (y * 0.1f)); if (BlockType < -0.7) { - TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_BROWN_MUSHROOM); + TryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_BROWN_MUSHROOM); } else if (BlockType < 0) { - TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_RED_MUSHROOM); + TryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_RED_MUSHROOM); } else if (BlockType < 0.7) { - TryPlaceClumb(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_FIRE); + TryPlaceClump(a_ChunkDesc, PosX, y, PosZ, E_BLOCK_FIRE); } } } @@ -113,7 +113,7 @@ void cFinishGenNetherSprinkleFoliage::GenFinish(cChunkDesc & a_ChunkDesc) -void cFinishGenNetherSprinkleFoliage::TryPlaceClumb(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_Block) +void cFinishGenNetherSprinkleFoliage::TryPlaceClump(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_Block) { bool IsFireBlock = a_Block == E_BLOCK_FIRE; -- cgit v1.2.3 From 188cb1f6bc0172a8bb6bb12154e004517cef31f8 Mon Sep 17 00:00:00 2001 From: STRWarrior Date: Sat, 18 Jan 2014 14:17:26 +0100 Subject: Fixed errors. --- src/Generating/FinishGen.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Generating/FinishGen.cpp') diff --git a/src/Generating/FinishGen.cpp b/src/Generating/FinishGen.cpp index cd4ef13aa..4ac6ff0f3 100644 --- a/src/Generating/FinishGen.cpp +++ b/src/Generating/FinishGen.cpp @@ -113,7 +113,7 @@ void cFinishGenNetherClumpFoliage::GenFinish(cChunkDesc & a_ChunkDesc) -void cFinishGenNetherSprinkleFoliage::TryPlaceClump(cChunkDesc & a_ChunkDesc, int a_RelX, int a_RelY, int a_RelZ, BLOCKTYPE a_Block) +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; -- cgit v1.2.3