Changed tree-growing functions in cWorld to use Vector3i coords.
This commit is contained in:
@@ -1599,17 +1599,17 @@ bool cWorld::DoWithChunkAt(Vector3i a_BlockPos, cChunkCallback a_Callback)
|
||||
|
||||
|
||||
|
||||
bool cWorld::GrowTree(int a_X, int a_Y, int a_Z)
|
||||
bool cWorld::GrowTree(const Vector3i a_BlockPos)
|
||||
{
|
||||
if (GetBlock(a_X, a_Y, a_Z) == E_BLOCK_SAPLING)
|
||||
if (GetBlock(a_BlockPos) == E_BLOCK_SAPLING)
|
||||
{
|
||||
// There is a sapling here, grow a tree according to its type:
|
||||
return GrowTreeFromSapling(a_X, a_Y, a_Z, GetBlockMeta(a_X, a_Y, a_Z));
|
||||
return GrowTreeFromSapling(a_BlockPos);
|
||||
}
|
||||
else
|
||||
{
|
||||
// There is nothing here, grow a tree based on the current biome here:
|
||||
return GrowTreeByBiome(a_X, a_Y, a_Z);
|
||||
return GrowTreeByBiome(a_BlockPos);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1617,36 +1617,37 @@ bool cWorld::GrowTree(int a_X, int a_Y, int a_Z)
|
||||
|
||||
|
||||
|
||||
bool cWorld::GrowTreeFromSapling(int a_X, int a_Y, int a_Z, NIBBLETYPE a_SaplingMeta)
|
||||
bool cWorld::GrowTreeFromSapling(Vector3i a_BlockPos)
|
||||
{
|
||||
cNoise Noise(m_Generator.GetSeed());
|
||||
sSetBlockVector Logs, Other;
|
||||
auto WorldAge = static_cast<int>(std::chrono::duration_cast<cTickTimeLong>(m_WorldAge).count() & 0xffffffff);
|
||||
switch (a_SaplingMeta & 0x07)
|
||||
auto SaplingMeta = GetBlockMeta(a_BlockPos);
|
||||
switch (SaplingMeta & 0x07)
|
||||
{
|
||||
case E_META_SAPLING_APPLE: GetAppleTreeImage ({ a_X, a_Y, a_Z }, Noise, WorldAge, Logs, Other); break;
|
||||
case E_META_SAPLING_BIRCH: GetBirchTreeImage ({ a_X, a_Y, a_Z }, Noise, WorldAge, Logs, Other); break;
|
||||
case E_META_SAPLING_APPLE: GetAppleTreeImage (a_BlockPos, Noise, WorldAge, Logs, Other); break;
|
||||
case E_META_SAPLING_BIRCH: GetBirchTreeImage (a_BlockPos, Noise, WorldAge, Logs, Other); break;
|
||||
case E_META_SAPLING_CONIFER:
|
||||
{
|
||||
bool IsLarge = GetLargeTreeAdjustment(a_X, a_Y, a_Z, a_SaplingMeta);
|
||||
GetConiferTreeImage({ a_X, a_Y, a_Z }, Noise, WorldAge, Logs, Other, IsLarge);
|
||||
bool IsLarge = GetLargeTreeAdjustment(a_BlockPos, SaplingMeta);
|
||||
GetConiferTreeImage(a_BlockPos, Noise, WorldAge, Logs, Other, IsLarge);
|
||||
break;
|
||||
}
|
||||
case E_META_SAPLING_ACACIA: GetAcaciaTreeImage ({ a_X, a_Y, a_Z }, Noise, WorldAge, Logs, Other); break;
|
||||
case E_META_SAPLING_ACACIA: GetAcaciaTreeImage (a_BlockPos, Noise, WorldAge, Logs, Other); break;
|
||||
case E_META_SAPLING_JUNGLE:
|
||||
{
|
||||
bool IsLarge = GetLargeTreeAdjustment(a_X, a_Y, a_Z, a_SaplingMeta);
|
||||
GetJungleTreeImage({ a_X, a_Y, a_Z }, Noise, WorldAge, Logs, Other, IsLarge);
|
||||
bool IsLarge = GetLargeTreeAdjustment(a_BlockPos, SaplingMeta);
|
||||
GetJungleTreeImage(a_BlockPos, Noise, WorldAge, Logs, Other, IsLarge);
|
||||
break;
|
||||
}
|
||||
case E_META_SAPLING_DARK_OAK:
|
||||
{
|
||||
if (!GetLargeTreeAdjustment(a_X, a_Y, a_Z, a_SaplingMeta))
|
||||
if (!GetLargeTreeAdjustment(a_BlockPos, SaplingMeta))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
GetDarkoakTreeImage({ a_X, a_Y, a_Z }, Noise, WorldAge, Logs, Other);
|
||||
GetDarkoakTreeImage(a_BlockPos, Noise, WorldAge, Logs, Other);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1659,7 +1660,7 @@ bool cWorld::GrowTreeFromSapling(int a_X, int a_Y, int a_Z, NIBBLETYPE a_Sapling
|
||||
|
||||
|
||||
|
||||
bool cWorld::GetLargeTreeAdjustment(int & a_X, int & a_Y, int & a_Z, NIBBLETYPE a_Meta)
|
||||
bool cWorld::GetLargeTreeAdjustment(Vector3i & a_BlockPos, NIBBLETYPE a_Meta)
|
||||
{
|
||||
bool IsLarge = true;
|
||||
a_Meta = a_Meta & 0x07;
|
||||
@@ -1671,8 +1672,8 @@ bool cWorld::GetLargeTreeAdjustment(int & a_X, int & a_Y, int & a_Z, NIBBLETYPE
|
||||
{
|
||||
NIBBLETYPE meta;
|
||||
BLOCKTYPE type;
|
||||
GetBlockTypeMeta(a_X + x, a_Y, a_Z + z, type, meta);
|
||||
IsLarge = IsLarge && (type == E_BLOCK_SAPLING) && ((a_Meta & meta) == a_Meta);
|
||||
GetBlockTypeMeta(a_BlockPos.addedXZ(x, z), type, meta);
|
||||
IsLarge = IsLarge && (type == E_BLOCK_SAPLING) && ((meta & 0x07) == a_Meta);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1689,14 +1690,14 @@ bool cWorld::GetLargeTreeAdjustment(int & a_X, int & a_Y, int & a_Z, NIBBLETYPE
|
||||
{
|
||||
NIBBLETYPE meta;
|
||||
BLOCKTYPE type;
|
||||
GetBlockTypeMeta(a_X + x, a_Y, a_Z + z, type, meta);
|
||||
IsLarge = IsLarge && (type == E_BLOCK_SAPLING) && ((a_Meta & meta) == a_Meta);
|
||||
GetBlockTypeMeta(a_BlockPos.addedXZ(x, z), type, meta);
|
||||
IsLarge = IsLarge && (type == E_BLOCK_SAPLING) && ((meta & 0x07) == a_Meta);
|
||||
}
|
||||
}
|
||||
|
||||
if (IsLarge)
|
||||
{
|
||||
--a_Z;
|
||||
--a_BlockPos.z;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1708,15 +1709,15 @@ bool cWorld::GetLargeTreeAdjustment(int & a_X, int & a_Y, int & a_Z, NIBBLETYPE
|
||||
{
|
||||
NIBBLETYPE meta;
|
||||
BLOCKTYPE type;
|
||||
GetBlockTypeMeta(a_X + x, a_Y, a_Z + z, type, meta);
|
||||
IsLarge = IsLarge && (type == E_BLOCK_SAPLING) && ((a_Meta & meta) == a_Meta);
|
||||
GetBlockTypeMeta(a_BlockPos.addedXZ(x, z), type, meta);
|
||||
IsLarge = IsLarge && (type == E_BLOCK_SAPLING) && ((meta & 0x07) == a_Meta);
|
||||
}
|
||||
}
|
||||
|
||||
if (IsLarge)
|
||||
{
|
||||
--a_Z;
|
||||
--a_X;
|
||||
--a_BlockPos.x;
|
||||
--a_BlockPos.z;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1728,14 +1729,14 @@ bool cWorld::GetLargeTreeAdjustment(int & a_X, int & a_Y, int & a_Z, NIBBLETYPE
|
||||
{
|
||||
NIBBLETYPE meta;
|
||||
BLOCKTYPE type;
|
||||
GetBlockTypeMeta(a_X + x, a_Y, a_Z + z, type, meta);
|
||||
IsLarge = IsLarge && (type == E_BLOCK_SAPLING) && ((a_Meta & meta) == a_Meta);
|
||||
GetBlockTypeMeta(a_BlockPos.addedXZ(x, z), type, meta);
|
||||
IsLarge = IsLarge && (type == E_BLOCK_SAPLING) && ((meta & 0x07) == a_Meta);
|
||||
}
|
||||
}
|
||||
|
||||
if (IsLarge)
|
||||
{
|
||||
--a_X;
|
||||
--a_BlockPos.x;
|
||||
}
|
||||
|
||||
return IsLarge;
|
||||
@@ -1745,11 +1746,12 @@ bool cWorld::GetLargeTreeAdjustment(int & a_X, int & a_Y, int & a_Z, NIBBLETYPE
|
||||
|
||||
|
||||
|
||||
bool cWorld::GrowTreeByBiome(int a_X, int a_Y, int a_Z)
|
||||
bool cWorld::GrowTreeByBiome(const Vector3i a_BlockPos)
|
||||
{
|
||||
cNoise Noise(m_Generator.GetSeed());
|
||||
sSetBlockVector Logs, Other;
|
||||
GetTreeImageByBiome({ a_X, a_Y, a_Z }, Noise, static_cast<int>(std::chrono::duration_cast<cTickTimeLong>(m_WorldAge).count() & 0xffffffff), GetBiomeAt(a_X, a_Z), Logs, Other);
|
||||
auto seq = static_cast<int>(std::chrono::duration_cast<cTickTimeLong>(m_WorldAge).count() & 0xffffffff);
|
||||
GetTreeImageByBiome(a_BlockPos, Noise, seq, GetBiomeAt(a_BlockPos.x, a_BlockPos.z), Logs, Other);
|
||||
Other.insert(Other.begin(), Logs.begin(), Logs.end());
|
||||
Logs.clear();
|
||||
return GrowTreeImage(Other);
|
||||
|
||||
Reference in New Issue
Block a user