commit
24bb911c3c
127
src/BiomeDef.cpp
127
src/BiomeDef.cpp
@ -222,3 +222,130 @@ bool IsBiomeCold(EMCSBiome a_Biome)
|
||||
|
||||
|
||||
|
||||
|
||||
int GetSnowStartHeight(EMCSBiome a_Biome)
|
||||
{
|
||||
switch (a_Biome)
|
||||
{
|
||||
case biIcePlainsSpikes:
|
||||
case biIcePlains:
|
||||
case biIceMountains:
|
||||
case biFrozenRiver:
|
||||
case biColdBeach:
|
||||
case biColdTaiga:
|
||||
case biColdTaigaHills:
|
||||
case biColdTaigaM:
|
||||
{
|
||||
// Always snow
|
||||
return 0;
|
||||
}
|
||||
|
||||
case biExtremeHills:
|
||||
case biExtremeHillsM:
|
||||
case biExtremeHillsPlus:
|
||||
case biExtremeHillsPlusM:
|
||||
case biStoneBeach:
|
||||
{
|
||||
// Starts snowing at 96
|
||||
return 96;
|
||||
}
|
||||
|
||||
case biTaiga:
|
||||
case biTaigaHills:
|
||||
case biTaigaM:
|
||||
{
|
||||
// Start snowing at 130
|
||||
return 130;
|
||||
}
|
||||
|
||||
case biMegaTaiga:
|
||||
case biMegaSpruceTaiga:
|
||||
case biMegaTaigaHills:
|
||||
case biMegaSpruceTaigaHills:
|
||||
{
|
||||
// Start snowing at 160
|
||||
return 160;
|
||||
}
|
||||
|
||||
case biRiver:
|
||||
case biOcean:
|
||||
case biDeepOcean:
|
||||
{
|
||||
// Starts snowing at 280
|
||||
return 280;
|
||||
}
|
||||
|
||||
case biBirchForest:
|
||||
case biBirchForestHills:
|
||||
case biBirchForestM:
|
||||
case biBirchForestHillsM:
|
||||
{
|
||||
// Starts snowing at 335
|
||||
return 335;
|
||||
}
|
||||
|
||||
case biForest:
|
||||
case biForestHills:
|
||||
case biFlowerForest:
|
||||
case biRoofedForest:
|
||||
case biRoofedForestM:
|
||||
{
|
||||
// Starts snowing at 400
|
||||
return 400;
|
||||
}
|
||||
|
||||
case biPlains:
|
||||
case biSunflowerPlains:
|
||||
case biSwampland:
|
||||
case biSwamplandM:
|
||||
case biBeach:
|
||||
{
|
||||
// Starts snowing at 460
|
||||
return 460;
|
||||
}
|
||||
|
||||
case biMushroomIsland:
|
||||
case biMushroomShore:
|
||||
{
|
||||
// Starts snowing at 520
|
||||
return 520;
|
||||
}
|
||||
|
||||
case biJungle:
|
||||
case biJungleHills:
|
||||
case biJungleM:
|
||||
case biJungleEdge:
|
||||
case biJungleEdgeM:
|
||||
{
|
||||
// Starts snowing at 550
|
||||
return 550;
|
||||
}
|
||||
|
||||
case biDesert:
|
||||
case biDesertHills:
|
||||
case biDesertM:
|
||||
case biSavanna:
|
||||
case biSavannaM:
|
||||
case biSavannaPlateau:
|
||||
case biSavannaPlateauM:
|
||||
case biMesa:
|
||||
case biMesaBryce:
|
||||
case biMesaPlateau:
|
||||
case biMesaPlateauF:
|
||||
case biMesaPlateauFM:
|
||||
case biMesaPlateauM:
|
||||
{
|
||||
// These biomes don't actualy have any downfall.
|
||||
return 1000;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -129,4 +129,7 @@ extern bool IsBiomeVeryCold(EMCSBiome a_Biome);
|
||||
Doesn't report Very Cold biomes, use IsBiomeVeryCold() for those. */
|
||||
extern bool IsBiomeCold(EMCSBiome a_Biome);
|
||||
|
||||
/** Returns the height when a biome when a biome starts snowing.*/
|
||||
extern int GetSnowStartHeight(EMCSBiome a_Biome);
|
||||
|
||||
// tolua_end
|
||||
|
121
src/Chunk.cpp
121
src/Chunk.cpp
@ -874,80 +874,71 @@ void cChunk::ApplyWeatherToTop()
|
||||
|
||||
int X = m_World->GetTickRandomNumber(15);
|
||||
int Z = m_World->GetTickRandomNumber(15);
|
||||
switch (GetBiomeAt(X, Z))
|
||||
|
||||
// TODO: Check light levels, don't snow over when the BlockLight is higher than (7?)
|
||||
int Height = GetHeight(X, Z);
|
||||
|
||||
if (GetSnowStartHeight(GetBiomeAt(X, Z)) > Height)
|
||||
{
|
||||
case biTaiga:
|
||||
case biFrozenOcean:
|
||||
case biFrozenRiver:
|
||||
case biIcePlains:
|
||||
case biIceMountains:
|
||||
case biTaigaHills:
|
||||
return;
|
||||
}
|
||||
|
||||
BLOCKTYPE TopBlock = GetBlock(X, Height, Z);
|
||||
NIBBLETYPE TopMeta = GetMeta (X, Height, Z);
|
||||
if (m_World->IsDeepSnowEnabled() && (TopBlock == E_BLOCK_SNOW))
|
||||
{
|
||||
int MaxSize = 7;
|
||||
BLOCKTYPE BlockType[4];
|
||||
NIBBLETYPE BlockMeta[4];
|
||||
UnboundedRelGetBlock(X - 1, Height, Z, BlockType[0], BlockMeta[0]);
|
||||
UnboundedRelGetBlock(X + 1, Height, Z, BlockType[1], BlockMeta[1]);
|
||||
UnboundedRelGetBlock(X, Height, Z - 1, BlockType[2], BlockMeta[2]);
|
||||
UnboundedRelGetBlock(X, Height, Z + 1, BlockType[3], BlockMeta[3]);
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
// TODO: Check light levels, don't snow over when the BlockLight is higher than (7?)
|
||||
int Height = GetHeight(X, Z);
|
||||
BLOCKTYPE TopBlock = GetBlock(X, Height, Z);
|
||||
NIBBLETYPE TopMeta = GetMeta (X, Height, Z);
|
||||
if (m_World->IsDeepSnowEnabled() && (TopBlock == E_BLOCK_SNOW))
|
||||
switch (BlockType[i])
|
||||
{
|
||||
int MaxSize = 7;
|
||||
BLOCKTYPE BlockType[4];
|
||||
NIBBLETYPE BlockMeta[4];
|
||||
UnboundedRelGetBlock(X - 1, Height, Z, BlockType[0], BlockMeta[0]);
|
||||
UnboundedRelGetBlock(X + 1, Height, Z, BlockType[1], BlockMeta[1]);
|
||||
UnboundedRelGetBlock(X, Height, Z - 1, BlockType[2], BlockMeta[2]);
|
||||
UnboundedRelGetBlock(X, Height, Z + 1, BlockType[3], BlockMeta[3]);
|
||||
for (int i = 0; i < 4; i++)
|
||||
case E_BLOCK_AIR:
|
||||
{
|
||||
switch (BlockType[i])
|
||||
{
|
||||
case E_BLOCK_AIR:
|
||||
{
|
||||
MaxSize = 0;
|
||||
break;
|
||||
}
|
||||
case E_BLOCK_SNOW:
|
||||
{
|
||||
MaxSize = std::min(BlockMeta[i] + 1, MaxSize);
|
||||
break;
|
||||
}
|
||||
}
|
||||
MaxSize = 0;
|
||||
break;
|
||||
}
|
||||
if (TopMeta < MaxSize)
|
||||
case E_BLOCK_SNOW:
|
||||
{
|
||||
FastSetBlock(X, Height, Z, E_BLOCK_SNOW, TopMeta + 1);
|
||||
}
|
||||
else if (TopMeta > MaxSize)
|
||||
{
|
||||
FastSetBlock(X, Height, Z, E_BLOCK_SNOW, TopMeta - 1);
|
||||
MaxSize = std::min(BlockMeta[i] + 1, MaxSize);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (cBlockInfo::IsSnowable(TopBlock) && (Height + 1 < cChunkDef::Height))
|
||||
{
|
||||
SetBlock(X, Height + 1, Z, E_BLOCK_SNOW, 0);
|
||||
}
|
||||
else if (IsBlockWater(TopBlock) && (TopMeta == 0))
|
||||
{
|
||||
SetBlock(X, Height, Z, E_BLOCK_ICE, 0);
|
||||
}
|
||||
else if (
|
||||
(m_World->IsDeepSnowEnabled()) &&
|
||||
(
|
||||
(TopBlock == E_BLOCK_RED_ROSE) ||
|
||||
(TopBlock == E_BLOCK_YELLOW_FLOWER) ||
|
||||
(TopBlock == E_BLOCK_RED_MUSHROOM) ||
|
||||
(TopBlock == E_BLOCK_BROWN_MUSHROOM)
|
||||
)
|
||||
)
|
||||
{
|
||||
SetBlock(X, Height, Z, E_BLOCK_SNOW, 0);
|
||||
}
|
||||
break;
|
||||
} // case (snowy biomes)
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
} // switch (biome)
|
||||
if (TopMeta < MaxSize)
|
||||
{
|
||||
FastSetBlock(X, Height, Z, E_BLOCK_SNOW, TopMeta + 1);
|
||||
}
|
||||
else if (TopMeta > MaxSize)
|
||||
{
|
||||
FastSetBlock(X, Height, Z, E_BLOCK_SNOW, TopMeta - 1);
|
||||
}
|
||||
}
|
||||
else if (cBlockInfo::IsSnowable(TopBlock) && (Height + 1 < cChunkDef::Height))
|
||||
{
|
||||
SetBlock(X, Height + 1, Z, E_BLOCK_SNOW, 0);
|
||||
}
|
||||
else if (IsBlockWater(TopBlock) && (TopMeta == 0))
|
||||
{
|
||||
SetBlock(X, Height, Z, E_BLOCK_ICE, 0);
|
||||
}
|
||||
else if (
|
||||
(m_World->IsDeepSnowEnabled()) &&
|
||||
(
|
||||
(TopBlock == E_BLOCK_RED_ROSE) ||
|
||||
(TopBlock == E_BLOCK_YELLOW_FLOWER) ||
|
||||
(TopBlock == E_BLOCK_RED_MUSHROOM) ||
|
||||
(TopBlock == E_BLOCK_BROWN_MUSHROOM)
|
||||
)
|
||||
)
|
||||
{
|
||||
SetBlock(X, Height, Z, E_BLOCK_SNOW, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -470,30 +470,22 @@ void cFinishGenSnow::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
{
|
||||
for (int x = 0; x < cChunkDef::Width; x++)
|
||||
{
|
||||
switch (a_ChunkDesc.GetBiome(x, z))
|
||||
int Height = a_ChunkDesc.GetHeight(x, z);
|
||||
if (GetSnowStartHeight(a_ChunkDesc.GetBiome(x, z)) > Height)
|
||||
{
|
||||
case biIcePlains:
|
||||
case biIceMountains:
|
||||
case biTaiga:
|
||||
case biTaigaHills:
|
||||
case biFrozenRiver:
|
||||
case biFrozenOcean:
|
||||
{
|
||||
int Height = a_ChunkDesc.GetHeight(x, z);
|
||||
if (cBlockInfo::IsSnowable(a_ChunkDesc.GetBlockType(x, Height, z)) && (Height < cChunkDef::Height - 1))
|
||||
{
|
||||
a_ChunkDesc.SetBlockType(x, Height + 1, z, E_BLOCK_SNOW);
|
||||
a_ChunkDesc.SetHeight(x, z, Height + 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// There's no snow in the other biomes.
|
||||
break;
|
||||
}
|
||||
// Height isn't high enough for snow to start forming.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!cBlockInfo::IsSnowable(a_ChunkDesc.GetBlockType(x, Height, z)) && (Height < cChunkDef::Height - 1))
|
||||
{
|
||||
// The top block can't be snown over.
|
||||
continue;
|
||||
}
|
||||
|
||||
a_ChunkDesc.SetBlockType(x, Height + 1, z, E_BLOCK_SNOW);
|
||||
a_ChunkDesc.SetHeight(x, z, Height + 1);
|
||||
} // for x
|
||||
} // for z
|
||||
}
|
||||
|
||||
@ -511,34 +503,27 @@ void cFinishGenIce::GenFinish(cChunkDesc & a_ChunkDesc)
|
||||
{
|
||||
for (int x = 0; x < cChunkDef::Width; x++)
|
||||
{
|
||||
switch (a_ChunkDesc.GetBiome(x, z))
|
||||
int Height = a_ChunkDesc.GetHeight(x, z);
|
||||
if (GetSnowStartHeight(a_ChunkDesc.GetBiome(x, z)) > Height)
|
||||
{
|
||||
case biIcePlains:
|
||||
case biIceMountains:
|
||||
case biTaiga:
|
||||
case biTaigaHills:
|
||||
case biFrozenRiver:
|
||||
case biFrozenOcean:
|
||||
{
|
||||
int Height = a_ChunkDesc.GetHeight(x, z);
|
||||
switch (a_ChunkDesc.GetBlockType(x, Height, z))
|
||||
{
|
||||
case E_BLOCK_WATER:
|
||||
case E_BLOCK_STATIONARY_WATER:
|
||||
{
|
||||
a_ChunkDesc.SetBlockType(x, Height, z, E_BLOCK_ICE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
// No icy water in other biomes.
|
||||
break;
|
||||
}
|
||||
// Height isn't high enough for snow to start forming.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!IsBlockWater(a_ChunkDesc.GetBlockType(x, Height, z)))
|
||||
{
|
||||
// The block isn't a water block.
|
||||
continue;
|
||||
}
|
||||
|
||||
if (a_ChunkDesc.GetBlockMeta(x, Height, z) != 0)
|
||||
{
|
||||
// The water block isn't a source block.
|
||||
continue;
|
||||
}
|
||||
|
||||
a_ChunkDesc.SetBlockType(x, Height, z, E_BLOCK_ICE);
|
||||
} // for x
|
||||
} // for z
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user