Make saplings only grow on dirt or grass, make jungle tree trunks only replace air
parent
6823ce99a7
commit
e3badd7062
|
@ -94,7 +94,17 @@ public:
|
||||||
class MakeTreesFromSaplingsABM : public ActiveBlockModifier
|
class MakeTreesFromSaplingsABM : public ActiveBlockModifier
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
content_t c_junglesapling;
|
||||||
|
content_t c_dirt;
|
||||||
|
content_t c_dirt_with_grass;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
MakeTreesFromSaplingsABM(ServerEnvironment *env, INodeDefManager *nodemgr) {
|
||||||
|
c_junglesapling = nodemgr->getId("junglesapling");
|
||||||
|
c_dirt = nodemgr->getId("mapgen_dirt");
|
||||||
|
c_dirt_with_grass = nodemgr->getId("mapgen_dirt_with_grass");
|
||||||
|
}
|
||||||
|
|
||||||
virtual std::set<std::string> getTriggerContents()
|
virtual std::set<std::string> getTriggerContents()
|
||||||
{
|
{
|
||||||
std::set<std::string> s;
|
std::set<std::string> s;
|
||||||
|
@ -112,7 +122,12 @@ public:
|
||||||
INodeDefManager *ndef = env->getGameDef()->ndef();
|
INodeDefManager *ndef = env->getGameDef()->ndef();
|
||||||
ServerMap *map = &env->getServerMap();
|
ServerMap *map = &env->getServerMap();
|
||||||
|
|
||||||
bool is_jungle_tree = n.getContent() == ndef->getId("junglesapling");
|
MapNode n_below = map->getNodeNoEx(p - v3s16(0, 1, 0));
|
||||||
|
if (n_below.getContent() != c_dirt &&
|
||||||
|
n_below.getContent() != c_dirt_with_grass)
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool is_jungle_tree = n.getContent() == c_junglesapling;
|
||||||
|
|
||||||
actionstream <<"A " << (is_jungle_tree ? "jungle " : "")
|
actionstream <<"A " << (is_jungle_tree ? "jungle " : "")
|
||||||
<< "sapling grows into a tree at "
|
<< "sapling grows into a tree at "
|
||||||
|
@ -187,7 +202,7 @@ void add_legacy_abms(ServerEnvironment *env, INodeDefManager *nodedef)
|
||||||
{
|
{
|
||||||
env->addActiveBlockModifier(new GrowGrassABM());
|
env->addActiveBlockModifier(new GrowGrassABM());
|
||||||
env->addActiveBlockModifier(new RemoveGrassABM());
|
env->addActiveBlockModifier(new RemoveGrassABM());
|
||||||
env->addActiveBlockModifier(new MakeTreesFromSaplingsABM());
|
env->addActiveBlockModifier(new MakeTreesFromSaplingsABM(env, nodedef));
|
||||||
if (g_settings->getBool("liquid_finite"))
|
if (g_settings->getBool("liquid_finite"))
|
||||||
env->addActiveBlockModifier(new LiquidFlowABM(env, nodedef));
|
env->addActiveBlockModifier(new LiquidFlowABM(env, nodedef));
|
||||||
}
|
}
|
||||||
|
|
|
@ -528,19 +528,27 @@ void make_jungletree(VoxelManipulator &vmanip, v3s16 p0,
|
||||||
continue;
|
continue;
|
||||||
v3s16 p1 = p0 + v3s16(x,0,z);
|
v3s16 p1 = p0 + v3s16(x,0,z);
|
||||||
v3s16 p2 = p0 + v3s16(x,-1,z);
|
v3s16 p2 = p0 + v3s16(x,-1,z);
|
||||||
if(vmanip.m_area.contains(p2)
|
u32 vi1 = vmanip.m_area.index(p1);
|
||||||
&& vmanip.m_data[vmanip.m_area.index(p2)] == CONTENT_AIR)
|
u32 vi2 = vmanip.m_area.index(p2);
|
||||||
vmanip.m_data[vmanip.m_area.index(p2)] = treenode;
|
|
||||||
else if(vmanip.m_area.contains(p1))
|
if (vmanip.m_area.contains(p2) &&
|
||||||
vmanip.m_data[vmanip.m_area.index(p1)] = treenode;
|
vmanip.m_data[vi2].getContent() == CONTENT_AIR)
|
||||||
|
vmanip.m_data[vi2] = treenode;
|
||||||
|
else if (vmanip.m_area.contains(p1) &&
|
||||||
|
vmanip.m_data[vi1].getContent() == CONTENT_AIR)
|
||||||
|
vmanip.m_data[vi1] = treenode;
|
||||||
}
|
}
|
||||||
|
vmanip.m_data[vmanip.m_area.index(p0)] = treenode;
|
||||||
|
|
||||||
s16 trunk_h = pr.range(8, 12);
|
s16 trunk_h = pr.range(8, 12);
|
||||||
v3s16 p1 = p0;
|
v3s16 p1 = p0;
|
||||||
for(s16 ii=0; ii<trunk_h; ii++)
|
for (s16 ii=0; ii<trunk_h; ii++)
|
||||||
{
|
{
|
||||||
if(vmanip.m_area.contains(p1))
|
if (vmanip.m_area.contains(p1)) {
|
||||||
vmanip.m_data[vmanip.m_area.index(p1)] = treenode;
|
u32 vi = vmanip.m_area.index(p1);
|
||||||
|
if (vmanip.m_data[vi].getContent() == CONTENT_AIR)
|
||||||
|
vmanip.m_data[vi] = treenode;
|
||||||
|
}
|
||||||
p1.Y++;
|
p1.Y++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -593,8 +601,8 @@ void make_jungletree(VoxelManipulator &vmanip, v3s16 p0,
|
||||||
if(vmanip.m_area.contains(p) == false)
|
if(vmanip.m_area.contains(p) == false)
|
||||||
continue;
|
continue;
|
||||||
u32 vi = vmanip.m_area.index(p);
|
u32 vi = vmanip.m_area.index(p);
|
||||||
if(vmanip.m_data[vi].getContent() != CONTENT_AIR
|
if (vmanip.m_data[vi].getContent() != CONTENT_AIR &&
|
||||||
&& vmanip.m_data[vi].getContent() != CONTENT_IGNORE)
|
vmanip.m_data[vi].getContent() != CONTENT_IGNORE)
|
||||||
continue;
|
continue;
|
||||||
u32 i = leaves_a.index(x,y,z);
|
u32 i = leaves_a.index(x,y,z);
|
||||||
if(leaves_d[i] == 1)
|
if(leaves_d[i] == 1)
|
||||||
|
|
Loading…
Reference in New Issue