Add blockseed to on_generated
authorPerttu Ahola <celeron55@gmail.com>
Wed, 28 Mar 2012 17:46:05 +0000 (20:46 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Wed, 28 Mar 2012 19:01:21 +0000 (22:01 +0300)
doc/lua_api.txt
src/mapgen.cpp
src/mapgen.h
src/scriptapi.cpp
src/scriptapi.h
src/server.cpp

index 49da0089bbf0a083f09cb10e9b47fdc868259b88..ae6771be50d3db9afbdea700b6bb719e4200086f 100644 (file)
@@ -444,7 +444,7 @@ minetest.register_globalstep(func(dtime))
 minetest.register_on_placenode(func(pos, newnode, placer))
 minetest.register_on_dignode(func(pos, oldnode, digger))
 minetest.register_on_punchnode(func(pos, node, puncher))
-minetest.register_on_generated(func(minp, maxp))
+minetest.register_on_generated(func(minp, maxp, blockseed))
 minetest.register_on_newplayer(func(ObjectRef))
 minetest.register_on_dieplayer(func(ObjectRef))
 minetest.register_on_respawnplayer(func(ObjectRef))
index 46304cdf65ed40df6f99c84c6537228a59a5b327..61718d91088ba1e37ca19c092ab3744bcf1b6d14 100644 (file)
@@ -193,6 +193,7 @@ void make_tree(ManualMapVoxelManipulator &vmanip, v3s16 p0,
        }
 }
 
+#if 0
 static void make_jungletree(VoxelManipulator &vmanip, v3s16 p0,
                INodeDefManager *ndef)
 {
@@ -280,7 +281,7 @@ static void make_jungletree(VoxelManipulator &vmanip, v3s16 p0,
        }
 }
 
-void make_papyrus(VoxelManipulator &vmanip, v3s16 p0,
+static void make_papyrus(VoxelManipulator &vmanip, v3s16 p0,
                INodeDefManager *ndef)
 {
        MapNode papyrusnode(ndef->getId("mapgen_papyrus"));
@@ -295,7 +296,7 @@ void make_papyrus(VoxelManipulator &vmanip, v3s16 p0,
        }
 }
 
-void make_cactus(VoxelManipulator &vmanip, v3s16 p0,
+static void make_cactus(VoxelManipulator &vmanip, v3s16 p0,
                INodeDefManager *ndef)
 {
        MapNode cactusnode(ndef->getId("mapgen_cactus"));
@@ -309,7 +310,9 @@ void make_cactus(VoxelManipulator &vmanip, v3s16 p0,
                p1.Y++;
        }
 }
+#endif
 
+#if 0
 /*
        Dungeon making routines
 */
@@ -861,7 +864,9 @@ static void make_dungeon1(VoxelManipulator &vmanip, PseudoRandom &random,
                
        }
 }
+#endif
 
+#if 0
 static void make_nc(VoxelManipulator &vmanip, PseudoRandom &random,
                INodeDefManager *ndef)
 {
@@ -896,6 +901,7 @@ static void make_nc(VoxelManipulator &vmanip, PseudoRandom &random,
                vmanip.m_data[vmanip.m_area.index(p)] = MapNode(ndef->getId("mapgen_nyancat_rainbow"));
        }
 }
+#endif
 
 /*
        Noise functions. Make sure seed is mangled differently in each one.
@@ -1272,6 +1278,12 @@ bool get_have_sand(u64 seed, v2s16 p2d)
        return (sandnoise > -0.15);
 }
 
+u32 get_blockseed(u64 seed, v3s16 p)
+{
+       s32 x=p.X, y=p.Y, z=p.Z;
+       return (u32)(seed%0x100000000ULL) + z*38134234 + y*42123 + x*23;
+}
+
 #define VMANIP_FLAG_CAVE VOXELFLAG_CHECKED1
 
 void make_block(BlockMakeData *data)
index 24a853bdccb14f897a7e66602d023b8318d8d496..3374c678212d893d0a849c22ed8a78427e77af30 100644 (file)
@@ -36,6 +36,9 @@ namespace mapgen
        // Find out if block is completely underground
        bool block_is_underground(u64 seed, v3s16 blockpos);
 
+       // Get a pseudorandom seed for a position on the map
+       u32 get_blockseed(u64 seed, v3s16 p);
+
        // Main map generation routine
        void make_block(BlockMakeData *data);
        
index d2ded57c6d7efdfeb668c24d87d6afe439ee6090..944b81a5e28e1cca621090c79680284f32aa2442 100644 (file)
@@ -4403,7 +4403,8 @@ void scriptapi_environment_step(lua_State *L, float dtime)
        }
 }
 
-void scriptapi_environment_on_generated(lua_State *L, v3s16 minp, v3s16 maxp)
+void scriptapi_environment_on_generated(lua_State *L, v3s16 minp, v3s16 maxp,
+               u32 blockseed)
 {
        realitycheck(L);
        assert(lua_checkstack(L, 20));
@@ -4423,7 +4424,8 @@ void scriptapi_environment_on_generated(lua_State *L, v3s16 minp, v3s16 maxp)
                // Call function
                push_v3s16(L, minp);
                push_v3s16(L, maxp);
-               if(lua_pcall(L, 2, 0, 0))
+               lua_pushnumber(L, blockseed);
+               if(lua_pcall(L, 3, 0, 0))
                        script_error(L, "error: %s", lua_tostring(L, -1));
                // value removed, keep key for next iteration
        }
index f63cab3681c45971fcf5e6a9d93d29b17c517de1..373262888cf2a1ee8a8f8156a58e826d2f00b245 100644 (file)
@@ -51,7 +51,8 @@ bool scriptapi_on_chat_message(lua_State *L, const std::string &name,
 // On environment step
 void scriptapi_environment_step(lua_State *L, float dtime);
 // After generating a piece of map
-void scriptapi_environment_on_generated(lua_State *L, v3s16 minp, v3s16 maxp);
+void scriptapi_environment_on_generated(lua_State *L, v3s16 minp, v3s16 maxp,
+               u32 blockseed);
 
 /* misc */
 void scriptapi_on_newplayer(lua_State *L, ServerActiveObject *player);
index 6756e4a0884a92c631988375f45b11c81af6a5d5..d3c1218e73c6997d4ade313411e441cafec3af11 100644 (file)
@@ -283,7 +283,7 @@ void * EmergeThread::Thread()
                                v3s16 minp = block->getPos()*MAP_BLOCKSIZE;
                                v3s16 maxp = minp + v3s16(1,1,1)*(MAP_BLOCKSIZE-1);
                                scriptapi_environment_on_generated(m_server->m_lua,
-                                               minp, maxp);
+                                               minp, maxp, mapgen::get_blockseed(data.seed, minp));
                                
                                if(enable_mapgen_debug_info)
                                        infostream<<"EmergeThread: ended up with: "