1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Add Lua on_mapgen_init callback, and minetest.set_mapgen_params API

This commit is contained in:
kwolekr 2013-06-27 17:06:52 -04:00
parent 18882a4d26
commit 2e292b67a0
18 changed files with 163 additions and 14 deletions

View file

@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "common/c_converter.h"
#include "log.h"
#include "environment.h"
#include "mapgen.h"
#include "lua_api/l_env.h"
extern "C" {
@ -55,6 +56,33 @@ void ScriptApiEnv::environment_Step(float dtime)
runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
}
void ScriptApiEnv::environment_OnMapgenInit(MapgenParams *mgparams)
{
SCRIPTAPI_PRECHECKHEADER
// Get minetest.registered_on_mapgen_inits
lua_getglobal(L, "minetest");
lua_getfield(L, -1, "registered_on_mapgen_inits");
// Call callbacks
lua_newtable(L);
lua_pushstring(L, mgparams->mg_name.c_str());
lua_setfield(L, -2, "mgname");
lua_pushinteger(L, mgparams->seed);
lua_setfield(L, -2, "seed");
lua_pushinteger(L, mgparams->water_level);
lua_setfield(L, -2, "water_level");
std::string flagstr = writeFlagString(mgparams->flags, flagdesc_mapgen);
lua_pushstring(L, flagstr.c_str());
lua_setfield(L, -2, "flags");
runCallbacks(1, RUN_CALLBACKS_MODE_FIRST);
}
void ScriptApiEnv::initializeEnvironment(ServerEnvironment *env)
{
SCRIPTAPI_PRECHECKHEADER

View file

@ -24,6 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "irr_v3d.h"
class ServerEnvironment;
struct MapgenParams;
class ScriptApiEnv
: virtual public ScriptApiBase
@ -33,6 +34,8 @@ public:
void environment_Step(float dtime);
// After generating a piece of map
void environment_OnGenerated(v3s16 minp, v3s16 maxp,u32 blockseed);
// After initializing mapgens
void environment_OnMapgenInit(MapgenParams *mgparams);
void initializeEnvironment(ServerEnvironment *env);
};

View file

@ -652,6 +652,59 @@ int ModApiEnvMod::l_get_mapgen_object(lua_State *L)
return nargs;
}
// minetest.set_mapgen_params(params)
// set mapgen parameters
int ModApiEnvMod::l_set_mapgen_params(lua_State *L)
{
if (!lua_istable(L, 1))
return 0;
EmergeManager *emerge = getServer(L)->getEmergeManager();
if (emerge->mapgen.size())
return 0;
MapgenParams *oparams = new MapgenParams;
u32 paramsmodified = 0;
u32 flagmask = 0;
lua_getfield(L, 1, "mgname");
if (lua_isstring(L, -1)) {
oparams->mg_name = std::string(lua_tostring(L, -1));
paramsmodified |= MGPARAMS_SET_MGNAME;
}
lua_getfield(L, 1, "seed");
if (lua_isnumber(L, -1)) {
oparams->seed = lua_tointeger(L, -1);
paramsmodified |= MGPARAMS_SET_SEED;
}
lua_getfield(L, 1, "water_level");
if (lua_isnumber(L, -1)) {
oparams->water_level = lua_tointeger(L, -1);
paramsmodified |= MGPARAMS_SET_WATER_LEVEL;
}
lua_getfield(L, 1, "flags");
if (lua_isstring(L, -1)) {
std::string flagstr = std::string(lua_tostring(L, -1));
oparams->flags = readFlagString(flagstr, flagdesc_mapgen);
paramsmodified |= MGPARAMS_SET_FLAGS;
lua_getfield(L, 1, "flagmask");
if (lua_isstring(L, -1)) {
flagstr = std::string(lua_tostring(L, -1));
flagmask = readFlagString(flagstr, flagdesc_mapgen);
}
}
emerge->luaoverride_params = oparams;
emerge->luaoverride_params_modified = paramsmodified;
emerge->luaoverride_flagmask = flagmask;
return 0;
}
// minetest.clear_objects()
// clear all objects in the environment
int ModApiEnvMod::l_clear_objects(lua_State *L)
@ -799,6 +852,7 @@ bool ModApiEnvMod::Initialize(lua_State *L,int top)
retval &= API_FCT(get_perlin_map);
retval &= API_FCT(get_voxel_manip);
retval &= API_FCT(get_mapgen_object);
retval &= API_FCT(set_mapgen_params);
retval &= API_FCT(clear_objects);
retval &= API_FCT(spawn_tree);
retval &= API_FCT(find_path);

View file

@ -117,6 +117,10 @@ private:
// minetest.get_mapgen_object(objectname)
// returns the requested object used during map generation
static int l_get_mapgen_object(lua_State *L);
// minetest.set_mapgen_params(params)
// set mapgen parameters
static int l_set_mapgen_params(lua_State *L);
// minetest.clear_objects()
// clear all objects in the environment