1
0
Fork 0

Merge pull request #1769 from mc-server/snowweather

Snow weather
This commit is contained in:
NiLSPACE 2015-02-28 18:05:06 +01:00
commit 24bb911c3c
4 changed files with 219 additions and 113 deletions

View File

@ -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;
}
}
}

View File

@ -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

View File

@ -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);
}
}

View File

@ -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
}