Skip to content

Commit

Permalink
Expose mapgen parameters on scripting init
Browse files Browse the repository at this point in the history
Add minetest.get_mapgen_params()
Deprecate minetest.register_on_mapgen_init()
  • Loading branch information
kwolekr committed Dec 29, 2014
1 parent ff3cfb7 commit 5e2753c
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 86 deletions.
7 changes: 6 additions & 1 deletion builtin/game/register.lua
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,6 @@ end
core.registered_on_chat_messages, core.register_on_chat_message = make_registration()
core.registered_globalsteps, core.register_globalstep = make_registration()
core.registered_playerevents, core.register_playerevent = make_registration()
core.registered_on_mapgen_inits, core.register_on_mapgen_init = make_registration()
core.registered_on_shutdown, core.register_on_shutdown = make_registration()
core.registered_on_punchnodes, core.register_on_punchnode = make_registration()
core.registered_on_placenodes, core.register_on_placenode = make_registration()
Expand All @@ -409,3 +408,9 @@ core.registered_craft_predicts, core.register_craft_predict = make_registration(
core.registered_on_protection_violation, core.register_on_protection_violation = make_registration()
core.registered_on_item_eats, core.register_on_item_eat = make_registration()

--
-- Compatibility for on_mapgen_init()
--

core.register_on_mapgen_init = function(func) func(core.get_mapgen_params()) end

9 changes: 7 additions & 2 deletions doc/lua_api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1504,8 +1504,9 @@ minetest.register_on_player_receive_fields(func(player, formname, fields))
^ Newest functions are called first
^ If function returns true, remaining functions are not called
minetest.register_on_mapgen_init(func(MapgenParams))
^ Called just before the map generator is initialized but before the environment is initialized
^ MapgenParams consists of a table with the fields mgname, seed, water_level, and flags
^ Deprecated; maintained for compatibility
^ This immediately calls func(minetest.get_mapgen_params())
^ MapgenParams consists of a table with the fields mgname, chunksize, seed, water_level, and flags
minetest.register_on_craft(func(itemstack, player, old_craft_grid, craft_inv))
^ Called when player crafts something
^ itemstack is the output
Expand Down Expand Up @@ -1621,6 +1622,10 @@ minetest.set_gen_notify(flags, {deco_ids})
^ The second parameter is a list of IDS of decorations which notification is requested for
minetest.get_mapgen_object(objectname)
^ Return requested mapgen object if available (see Mapgen objects)
minetest.get_mapgen_params()
^ Returns mapgen params
^ A table consisting of mgname, seed, chunksize, water_level, and flags
^ Can be called at any time
minetest.set_mapgen_params(MapgenParams)
^ Set map generation parameters
^ Function cannot be called after the registration period; only initialization and on_mapgen_init
Expand Down
61 changes: 40 additions & 21 deletions src/emerge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ class EmergeThread : public JThread

/////////////////////////////// Emerge Manager ////////////////////////////////

EmergeManager::EmergeManager(IGameDef *gamedef) {
EmergeManager::EmergeManager(IGameDef *gamedef)
{
//register built-in mapgens
registerMapgen("v5", new MapgenFactoryV5());
registerMapgen("v6", new MapgenFactoryV6());
Expand Down Expand Up @@ -132,7 +133,8 @@ EmergeManager::EmergeManager(IGameDef *gamedef) {
}


EmergeManager::~EmergeManager() {
EmergeManager::~EmergeManager()
{
for (unsigned int i = 0; i != emergethread.size(); i++) {
if (threads_active) {
emergethread[i]->Stop();
Expand Down Expand Up @@ -162,7 +164,8 @@ EmergeManager::~EmergeManager() {
}


void EmergeManager::loadMapgenParams() {
void EmergeManager::loadMapgenParams()
{
loadParamsFromSettings(g_settings);

if (g_settings->get("fixed_map_seed").empty()) {
Expand All @@ -174,7 +177,8 @@ void EmergeManager::loadMapgenParams() {
}


void EmergeManager::initMapgens() {
void EmergeManager::initMapgens()
{
if (mapgen.size())
return;

Expand All @@ -197,7 +201,8 @@ void EmergeManager::initMapgens() {
}


Mapgen *EmergeManager::getCurrentMapgen() {
Mapgen *EmergeManager::getCurrentMapgen()
{
for (unsigned int i = 0; i != emergethread.size(); i++) {
if (emergethread[i]->IsSameThread())
return emergethread[i]->mapgen;
Expand All @@ -207,7 +212,8 @@ Mapgen *EmergeManager::getCurrentMapgen() {
}


void EmergeManager::startThreads() {
void EmergeManager::startThreads()
{
if (threads_active)
return;

Expand All @@ -218,7 +224,8 @@ void EmergeManager::startThreads() {
}


void EmergeManager::stopThreads() {
void EmergeManager::stopThreads()
{
if (!threads_active)
return;

Expand All @@ -236,7 +243,8 @@ void EmergeManager::stopThreads() {
}


bool EmergeManager::enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate) {
bool EmergeManager::enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate)
{
std::map<v3s16, BlockEmergeData *>::const_iterator iter;
BlockEmergeData *bedata;
u16 count;
Expand Down Expand Up @@ -290,7 +298,8 @@ bool EmergeManager::enqueueBlockEmerge(u16 peer_id, v3s16 p, bool allow_generate
}


int EmergeManager::getGroundLevelAtPoint(v2s16 p) {
int EmergeManager::getGroundLevelAtPoint(v2s16 p)
{
if (mapgen.size() == 0 || !mapgen[0]) {
errorstream << "EmergeManager: getGroundLevelAtPoint() called"
" before mapgen initialized" << std::endl;
Expand All @@ -301,7 +310,8 @@ int EmergeManager::getGroundLevelAtPoint(v2s16 p) {
}


bool EmergeManager::isBlockUnderground(v3s16 blockpos) {
bool EmergeManager::isBlockUnderground(v3s16 blockpos)
{
/*
v2s16 p = v2s16((blockpos.X * MAP_BLOCKSIZE) + MAP_BLOCKSIZE / 2,
(blockpos.Y * MAP_BLOCKSIZE) + MAP_BLOCKSIZE / 2);
Expand All @@ -315,7 +325,8 @@ bool EmergeManager::isBlockUnderground(v3s16 blockpos) {
}


u32 EmergeManager::getBlockSeed(v3s16 p) {
u32 EmergeManager::getBlockSeed(v3s16 p)
{
return (u32)(params.seed & 0xFFFFFFFF) +
p.Z * 38134234 +
p.Y * 42123 +
Expand All @@ -324,12 +335,13 @@ u32 EmergeManager::getBlockSeed(v3s16 p) {


Mapgen *EmergeManager::createMapgen(std::string mgname, int mgid,
MapgenParams *mgparams) {
MapgenParams *mgparams)
{
std::map<std::string, MapgenFactory *>::const_iterator iter;
iter = mglist.find(mgname);
if (iter == mglist.end()) {
errorstream << "EmergeManager; mapgen " << mgname <<
" not registered" << std::endl;
" not registered" << std::endl;
return NULL;
}

Expand All @@ -338,12 +350,13 @@ Mapgen *EmergeManager::createMapgen(std::string mgname, int mgid,
}


MapgenSpecificParams *EmergeManager::createMapgenParams(std::string mgname) {
MapgenSpecificParams *EmergeManager::createMapgenParams(std::string mgname)
{
std::map<std::string, MapgenFactory *>::const_iterator iter;
iter = mglist.find(mgname);
if (iter == mglist.end()) {
errorstream << "EmergeManager: mapgen " << mgname <<
" not registered" << std::endl;
" not registered" << std::endl;
return NULL;
}

Expand All @@ -352,7 +365,8 @@ MapgenSpecificParams *EmergeManager::createMapgenParams(std::string mgname) {
}


void EmergeManager::loadParamsFromSettings(Settings *settings) {
void EmergeManager::loadParamsFromSettings(Settings *settings)
{
std::string seed_str;
const char *setname = (settings == g_settings) ? "fixed_map_seed" : "seed";

Expand All @@ -373,7 +387,8 @@ void EmergeManager::loadParamsFromSettings(Settings *settings) {
}


void EmergeManager::saveParamsToSettings(Settings *settings) {
void EmergeManager::saveParamsToSettings(Settings *settings)
{
settings->set("mg_name", params.mg_name);
settings->setU64("seed", params.seed);
settings->setS16("water_level", params.water_level);
Expand All @@ -387,15 +402,17 @@ void EmergeManager::saveParamsToSettings(Settings *settings) {
}


void EmergeManager::registerMapgen(std::string mgname, MapgenFactory *mgfactory) {
void EmergeManager::registerMapgen(std::string mgname, MapgenFactory *mgfactory)
{
mglist.insert(std::make_pair(mgname, mgfactory));
infostream << "EmergeManager: registered mapgen " << mgname << std::endl;
}


////////////////////////////// Emerge Thread //////////////////////////////////

bool EmergeThread::popBlockEmerge(v3s16 *pos, u8 *flags) {
bool EmergeThread::popBlockEmerge(v3s16 *pos, u8 *flags)
{
std::map<v3s16, BlockEmergeData *>::iterator iter;
JMutexAutoLock queuelock(emerge->queuemutex);

Expand Down Expand Up @@ -423,7 +440,8 @@ bool EmergeThread::popBlockEmerge(v3s16 *pos, u8 *flags) {


bool EmergeThread::getBlockOrStartGen(v3s16 p, MapBlock **b,
BlockMakeData *data, bool allow_gen) {
BlockMakeData *data, bool allow_gen)
{
v2s16 p2d(p.X, p.Z);
//envlock: usually takes <=1ms, sometimes 90ms or ~400ms to acquire
JMutexAutoLock envlock(m_server->m_env_mutex);
Expand Down Expand Up @@ -454,7 +472,8 @@ bool EmergeThread::getBlockOrStartGen(v3s16 p, MapBlock **b,
}


void *EmergeThread::Thread() {
void *EmergeThread::Thread()
{
ThreadStarted();
log_register_thread("EmergeThread" + itos(id));
DSTACK(__FUNCTION_NAME);
Expand Down
5 changes: 0 additions & 5 deletions src/emerge.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "mapgen.h" // for MapgenParams
#include "map.h"

#define MGPARAMS_SET_MGNAME 1
#define MGPARAMS_SET_SEED 2
#define MGPARAMS_SET_WATER_LEVEL 4
#define MGPARAMS_SET_FLAGS 8

#define BLOCK_EMERGE_ALLOWGEN (1<<0)

#define EMERGE_DBG_OUT(x) \
Expand Down
31 changes: 0 additions & 31 deletions src/script/cpp_api/s_env.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,37 +79,6 @@ void ScriptApiEnv::player_event(ServerActiveObject* player, std::string type)
}
}

void ScriptApiEnv::environment_OnMapgenInit(MapgenParams *mgparams)
{
SCRIPTAPI_PRECHECKHEADER

// Get core.registered_on_mapgen_inits
lua_getglobal(L, "core");
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");

lua_pushinteger(L, mgparams->chunksize);
lua_setfield(L, -2, "chunksize");

std::string flagstr = writeFlagString(mgparams->flags,
flagdesc_mapgen, (u32)-1);
lua_pushstring(L, flagstr.c_str());
lua_setfield(L, -2, "flags");

script_run_callbacks(L, 1, RUN_CALLBACKS_MODE_FIRST);
}

void ScriptApiEnv::initializeEnvironment(ServerEnvironment *env)
{
SCRIPTAPI_PRECHECKHEADER
Expand Down
2 changes: 0 additions & 2 deletions src/script/cpp_api/s_env.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,6 @@ class ScriptApiEnv
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);

//called on player event
void player_event(ServerActiveObject* player, std::string type);
Expand Down
48 changes: 35 additions & 13 deletions src/script/lua_api/l_mapgen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -325,45 +325,66 @@ int ModApiMapgen::l_get_mapgen_object(lua_State *L)
return 0;
}

int ModApiMapgen::l_get_mapgen_params(lua_State *L)
{
MapgenParams *params = &getServer(L)->getEmergeManager()->params;

lua_newtable(L);

lua_pushstring(L, params->mg_name.c_str());
lua_setfield(L, -2, "mgname");

lua_pushinteger(L, params->seed);
lua_setfield(L, -2, "seed");

lua_pushinteger(L, params->water_level);
lua_setfield(L, -2, "water_level");

lua_pushinteger(L, params->chunksize);
lua_setfield(L, -2, "chunksize");

std::string flagstr = writeFlagString(params->flags, flagdesc_mapgen, (u32)-1);
lua_pushstring(L, flagstr.c_str());
lua_setfield(L, -2, "flags");

return 1;
}

// set_mapgen_params(params)
// set mapgen parameters
int ModApiMapgen::l_set_mapgen_params(lua_State *L)
{
if (!lua_istable(L, 1))
return 0;

EmergeManager *emerge = getServer(L)->getEmergeManager();
assert(emerge);

std::string flagstr;
MapgenParams *params = &getServer(L)->getEmergeManager()->params;
u32 flags = 0, flagmask = 0;

lua_getfield(L, 1, "mgname");
if (lua_isstring(L, -1)) {
emerge->params.mg_name = std::string(lua_tostring(L, -1));
delete emerge->params.sparams;
emerge->params.sparams = NULL;
params->mg_name = lua_tostring(L, -1);
delete params->sparams;
params->sparams = NULL;
}

lua_getfield(L, 1, "seed");
if (lua_isnumber(L, -1))
emerge->params.seed = lua_tointeger(L, -1);
params->seed = lua_tointeger(L, -1);

lua_getfield(L, 1, "water_level");
if (lua_isnumber(L, -1))
emerge->params.water_level = lua_tointeger(L, -1);
params->water_level = lua_tointeger(L, -1);

lua_getfield(L, 1, "flagmask");
if (lua_isstring(L, -1)) {
flagstr = lua_tostring(L, -1);
emerge->params.flags &= ~readFlagString(flagstr, flagdesc_mapgen, NULL);
params->flags &= ~readFlagString(lua_tostring(L, -1), flagdesc_mapgen, NULL);
errorstream << "set_mapgen_params(): flagmask field is deprecated, "
"see lua_api.txt" << std::endl;
}

if (getflagsfield(L, 1, "flags", flagdesc_mapgen, &flags, &flagmask)) {
emerge->params.flags &= ~flagmask;
emerge->params.flags |= flags;
params->flags &= ~flagmask;
params->flags |= flags;
}

return 0;
Expand Down Expand Up @@ -818,6 +839,7 @@ void ModApiMapgen::Initialize(lua_State *L, int top)
{
API_FCT(get_mapgen_object);

API_FCT(get_mapgen_params);
API_FCT(set_mapgen_params);
API_FCT(set_noiseparams);
API_FCT(set_gen_notify);
Expand Down
Loading

0 comments on commit 5e2753c

Please sign in to comment.