Modernize client code (#6250)
[oweals/minetest.git] / src / treegen.cpp
index e6c514ab9274498a1a240bd150ff1864fb1597bb..25f614d273780936682cf53663ca1b45c3560d1d 100644 (file)
@@ -21,11 +21,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include <stack>
 #include "util/pointer.h"
 #include "util/numeric.h"
-#include "util/mathconstants.h"
 #include "map.h"
 #include "serverenvironment.h"
 #include "nodedef.h"
 #include "treegen.h"
+#include "voxelalgorithms.h"
 
 namespace treegen
 {
@@ -57,7 +57,6 @@ void make_tree(MMVManip &vmanip, v3s16 p0,
        p1.Y -= 1;
 
        VoxelArea leaves_a(v3s16(-2, -1, -2), v3s16(2, 2, 2));
-       //SharedPtr<u8> leaves_d(new u8[leaves_a.getVolume()]);
        Buffer<u8> leaves_d(leaves_a.getVolume());
        for (s32 i = 0; i < leaves_a.getVolume(); i++)
                leaves_d[i] = 0;
@@ -113,7 +112,7 @@ void make_tree(MMVManip &vmanip, v3s16 p0,
 
 // L-System tree LUA spawner
 treegen::error spawn_ltree(ServerEnvironment *env, v3s16 p0,
-               INodeDefManager *ndef, TreeDef tree_definition)
+               INodeDefManager *ndef, const TreeDef &tree_definition)
 {
        ServerMap *map = &env->getServerMap();
        std::map<v3s16, MapBlock*> modified_blocks;
@@ -126,12 +125,8 @@ treegen::error spawn_ltree(ServerEnvironment *env, v3s16 p0,
        if (e != SUCCESS)
                return e;
 
-       vmanip.blitBackAll(&modified_blocks);
+       voxalgo::blit_back_with_light(map, &vmanip, &modified_blocks);
 
-       // update lighting
-       std::map<v3s16, MapBlock*> lighting_modified_blocks;
-       lighting_modified_blocks.insert(modified_blocks.begin(), modified_blocks.end());
-       map->updateLighting(lighting_modified_blocks, modified_blocks);
        // Send a MEET_OTHER event
        MapEditEvent event;
        event.type = MEET_OTHER;
@@ -547,10 +542,13 @@ void tree_trunk_placement(MMVManip &vmanip, v3f p0, TreeDef &tree_definition)
        if (vmanip.m_area.contains(p1) == false)
                return;
        u32 vi = vmanip.m_area.index(p1);
-       if (vmanip.m_data[vi].getContent() != CONTENT_AIR
-                       && vmanip.m_data[vi].getContent() != CONTENT_IGNORE)
+       content_t current_node = vmanip.m_data[vi].getContent();
+       if (current_node != CONTENT_AIR && current_node != CONTENT_IGNORE
+                       && current_node != tree_definition.leavesnode.getContent()
+                       && current_node != tree_definition.leaves2node.getContent()
+                       && current_node != tree_definition.fruitnode.getContent())
                return;
-       vmanip.m_data[vmanip.m_area.index(p1)] = tree_definition.trunknode;
+       vmanip.m_data[vi] = tree_definition.trunknode;
 }
 
 
@@ -784,7 +782,6 @@ void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, s32 seed)
        p1.Y -= 1;
 
        VoxelArea leaves_a(v3s16(-3, -6, -3), v3s16(3, 3, 3));
-       //SharedPtr<u8> leaves_d(new u8[leaves_a.getVolume()]);
        Buffer<u8> leaves_d(leaves_a.getVolume());
        for (s32 i = 0; i < leaves_a.getVolume(); i++)
                leaves_d[i] = 0;
@@ -808,12 +805,9 @@ void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, s32 seed)
        }
 
        // Centre top nodes
-       u32 i = leaves_a.index(v3s16(0, 1, 0));
-       leaves_d[i] = 1;
-       i = leaves_a.index(v3s16(0, 2, 0));
-       leaves_d[i] = 1;
-       i = leaves_a.index(v3s16(0, 3, 0));
-       leaves_d[i] = 2;
+       leaves_d[leaves_a.index(v3s16(0, 1, 0))] = 1;
+       leaves_d[leaves_a.index(v3s16(0, 2, 0))] = 1;
+       leaves_d[leaves_a.index(v3s16(0, 3, 0))] = 2;
 
        // Lower branches
        s16 my = -6;
@@ -826,7 +820,7 @@ void make_pine_tree(MMVManip &vmanip, v3s16 p0, INodeDefManager *ndef, s32 seed)
                for (s16 zz = zi; zz <= zi + 1; zz++) {
                        u32 i = leaves_a.index(v3s16(xi, yy, zz));
                        u32 ia = leaves_a.index(v3s16(xi, yy + 1, zz));
-                       for (s16 xx = xi; xx <= xi + 1; xx++) {
+                       for (s32 xx = xi; xx <= xi + 1; xx++) {
                                leaves_d[i] = 1;
                                if (leaves_d[ia] == 0)
                                        leaves_d[ia] = 2;