Add minetest.load_area (#8023)
authorHybridDog <ovvv@web.de>
Mon, 31 Dec 2018 00:32:54 +0000 (01:32 +0100)
committerParamat <paramat@users.noreply.github.com>
Mon, 31 Dec 2018 00:32:54 +0000 (00:32 +0000)
doc/lua_api.txt
src/script/lua_api/l_env.cpp
src/script/lua_api/l_env.h

index e9605ee4913cf7cb0bb889f7f120094d7fd497b6..ded7b580f44ed010e6132b5ad06d2b7d256cafa5 100644 (file)
@@ -3989,6 +3989,10 @@ Environment access
         * mode = `"quick"`: Clear objects immediately in loaded mapblocks,
                             clear objects in unloaded mapblocks only when the
                             mapblocks are next activated.
+* `minetest.load_area(pos1[, pos2])`
+    * Load the mapblocks containing the area from `pos1` to `pos2`.
+      `pos2` defaults to `pos1` if not specified.
+    * This function does not trigger map generation.
 * `minetest.emerge_area(pos1, pos2, [callback], [param])`
     * Queue all blocks in the area from `pos1` to `pos2`, inclusive, to be
       asynchronously fetched from memory, loaded from disk, or if inexistent,
index ba2be0cb5edce498ec6e5bfcfe798e65f63508ea..711bd3fdd35f6b1bd1ade0045f37cde84dbd16b7 100644 (file)
@@ -1047,6 +1047,30 @@ int ModApiEnvMod::l_raycast(lua_State *L)
        return LuaRaycast::create_object(L);
 }
 
+// load_area(p1, [p2])
+// load mapblocks in area p1..p2, but do not generate map
+int ModApiEnvMod::l_load_area(lua_State *L)
+{
+       GET_ENV_PTR;
+       MAP_LOCK_REQUIRED;
+
+       Map *map = &(env->getMap());
+       v3s16 bp1 = getNodeBlockPos(check_v3s16(L, 1));
+       if (!lua_istable(L, 2)) {
+               map->emergeBlock(bp1);
+       } else {
+               v3s16 bp2 = getNodeBlockPos(check_v3s16(L, 2));
+               sortBoxVerticies(bp1, bp2);
+               for (s16 z = bp1.Z; z <= bp2.Z; z++)
+               for (s16 y = bp1.Y; y <= bp2.Y; y++)
+               for (s16 x = bp1.X; x <= bp2.X; x++) {
+                       map->emergeBlock(v3s16(x, y, z));
+               }
+       }
+
+       return 0;
+}
+
 // emerge_area(p1, p2, [callback, context])
 // emerge mapblocks in area p1..p2, calls callback with context upon completion
 int ModApiEnvMod::l_emerge_area(lua_State *L)
@@ -1287,6 +1311,7 @@ void ModApiEnvMod::Initialize(lua_State *L, int top)
        API_FCT(find_nodes_in_area);
        API_FCT(find_nodes_in_area_under_air);
        API_FCT(fix_light);
+       API_FCT(load_area);
        API_FCT(emerge_area);
        API_FCT(delete_area);
        API_FCT(get_perlin);
index 4a8700f124d622844ad4a2b1c9e195a703996f33..68a4eae5043052c77f59c76fee35ceb4afdea11d 100644 (file)
@@ -135,6 +135,9 @@ private:
        // fix_light(p1, p2) -> true/false
        static int l_fix_light(lua_State *L);
 
+       // load_area(p1)
+       static int l_load_area(lua_State *L);
+
        // emerge_area(p1, p2)
        static int l_emerge_area(lua_State *L);