Skip to content

Commit 3c63c30

Browse files
committedJul 3, 2016
Add MapSettingsManager and new mapgen setting script API functions
This commit refactors the majority of the Mapgen settings system. - MapgenParams is now owned by MapSettingsManager, itself a part of ServerMap, instead of the EmergeManager. - New Script API functions added: core.get_mapgen_setting core.get_mapgen_setting_noiseparams, core.set_mapgen_setting, and core.set_mapgen_setting_noiseparams. - minetest.get/set_mapgen_params are deprecated by the above new functions. - It is now possible to view and modify any arbitrary mapgen setting from a mod, rather than the base MapgenParams structure. - MapgenSpecificParams has been removed.
1 parent 9270530 commit 3c63c30

31 files changed

+889
-314
lines changed
 

‎build/android/jni/Android.mk

+2
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ LOCAL_SRC_FILES := \
169169
jni/src/log.cpp \
170170
jni/src/main.cpp \
171171
jni/src/map.cpp \
172+
jni/src/map_settings_manager.cpp \
172173
jni/src/mapblock.cpp \
173174
jni/src/mapblock_mesh.cpp \
174175
jni/src/mapgen.cpp \
@@ -238,6 +239,7 @@ LOCAL_SRC_FILES := \
238239
jni/src/unittest/test_connection.cpp \
239240
jni/src/unittest/test_filepath.cpp \
240241
jni/src/unittest/test_inventory.cpp \
242+
jni/src/unittest/test_map_settings_manager.cpp \
241243
jni/src/unittest/test_mapnode.cpp \
242244
jni/src/unittest/test_nodedef.cpp \
243245
jni/src/unittest/test_noderesolver.cpp \

‎doc/lua_api.txt

+19
Original file line numberDiff line numberDiff line change
@@ -2089,7 +2089,9 @@ and `minetest.auth_reload` call the authetification handler.
20892089
given biome_name string.
20902090
* `minetest.get_mapgen_params()` Returns mapgen parameters, a table containing
20912091
`mgname`, `seed`, `chunksize`, `water_level`, and `flags`.
2092+
* Deprecated: use minetest.get_mapgen_setting(name) instead
20922093
* `minetest.set_mapgen_params(MapgenParams)`
2094+
* Deprecated: use minetest.set_mapgen_setting(name, value, override) instead
20932095
* Set map generation parameters
20942096
* Function cannot be called after the registration period; only initialization
20952097
and `on_mapgen_init`
@@ -2099,6 +2101,23 @@ and `minetest.auth_reload` call the authetification handler.
20992101
* `flags` contains a comma-delimited string of flags to set,
21002102
or if the prefix `"no"` is attached, clears instead.
21012103
* `flags` is in the same format and has the same options as `mg_flags` in `minetest.conf`
2104+
* `minetest.get_mapgen_setting(name)`
2105+
* Gets the *active* mapgen setting (or nil if none exists) in string format with the following
2106+
order of precedence:
2107+
1) Settings loaded from map_meta.txt or overrides set during mod execution
2108+
2) Settings set by mods without a metafile override
2109+
3) Settings explicitly set in the user config file, minetest.conf
2110+
4) Settings set as the user config default
2111+
* `minetest.get_mapgen_setting_noiseparams(name)`
2112+
* Same as above, but returns the value as a NoiseParams table if the setting `name` exists
2113+
and is a valid NoiseParams
2114+
* `minetest.set_mapgen_setting(name, value, [override_meta=false])`
2115+
* Sets a mapgen param to `value`, and will take effect if the corresponding mapgen setting
2116+
is not already present in map_meta.txt. If the optional boolean override_meta is set to true,
2117+
this setting will become the active setting regardless of the map metafile contents.
2118+
* Note: to set the seed, use "seed", not "fixed_map_seed"
2119+
* `minetest.set_mapgen_setting_noiseparams(name, value, [override_meta=false])`
2120+
* Same as above, except value is a NoiseParams table
21022121
* `minetest.set_noiseparams(name, noiseparams, set_default)`
21032122
* Sets the noiseparams setting of `name` to the noiseparams table specified in `noiseparams`.
21042123
* `set_default` is an optional boolean (default: `true`) that specifies whether the setting

‎src/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ set(common_SRCS
414414
light.cpp
415415
log.cpp
416416
map.cpp
417+
map_settings_manager.cpp
417418
mapblock.cpp
418419
mapgen.cpp
419420
mapgen_flat.cpp

‎src/emerge.cpp

+12-28
Original file line numberDiff line numberDiff line change
@@ -156,37 +156,19 @@ EmergeManager::~EmergeManager()
156156
}
157157

158158

159-
void EmergeManager::loadMapgenParams()
160-
{
161-
params.load(*g_settings);
162-
}
163-
164-
165-
void EmergeManager::initMapgens()
159+
bool EmergeManager::initMapgens(MapgenParams *params)
166160
{
167161
if (m_mapgens.size())
168-
return;
169-
170-
MapgenType mgtype = Mapgen::getMapgenType(params.mg_name);
171-
if (mgtype == MAPGEN_INVALID) {
172-
const char *default_mapgen_name = Mapgen::getMapgenName(MAPGEN_DEFAULT);
173-
errorstream << "EmergeManager: mapgen " << params.mg_name <<
174-
" not registered; falling back to " <<
175-
default_mapgen_name << std::endl;
176-
177-
params.mg_name = default_mapgen_name;
178-
mgtype = MAPGEN_DEFAULT;
179-
}
162+
return false;
180163

181-
if (!params.sparams) {
182-
params.sparams = Mapgen::createMapgenParams(mgtype);
183-
params.sparams->readParams(g_settings);
184-
}
164+
this->mgparams = params;
185165

186166
for (u32 i = 0; i != m_threads.size(); i++) {
187-
Mapgen *mg = Mapgen::createMapgen(mgtype, i, &params, this);
167+
Mapgen *mg = Mapgen::createMapgen(params->mgtype, i, params, this);
188168
m_mapgens.push_back(mg);
189169
}
170+
171+
return true;
190172
}
191173

192174

@@ -288,12 +270,14 @@ bool EmergeManager::enqueueBlockEmergeEx(
288270
// Mapgen-related helper functions
289271
//
290272

273+
274+
// TODO(hmmmm): Move this to ServerMap
291275
v3s16 EmergeManager::getContainingChunk(v3s16 blockpos)
292276
{
293-
return getContainingChunk(blockpos, params.chunksize);
277+
return getContainingChunk(blockpos, mgparams->chunksize);
294278
}
295279

296-
280+
// TODO(hmmmm): Move this to ServerMap
297281
v3s16 EmergeManager::getContainingChunk(v3s16 blockpos, s16 chunksize)
298282
{
299283
s16 coff = -chunksize / 2;
@@ -327,7 +311,7 @@ int EmergeManager::getGroundLevelAtPoint(v2s16 p)
327311
return m_mapgens[0]->getGroundLevelAtPoint(p);
328312
}
329313

330-
314+
// TODO(hmmmm): Move this to ServerMap
331315
bool EmergeManager::isBlockUnderground(v3s16 blockpos)
332316
{
333317
#if 0
@@ -338,7 +322,7 @@ bool EmergeManager::isBlockUnderground(v3s16 blockpos)
338322
#endif
339323

340324
// Use a simple heuristic; the above method is wildly inaccurate anyway.
341-
return blockpos.Y * (MAP_BLOCKSIZE + 1) <= params.water_level;
325+
return blockpos.Y * (MAP_BLOCKSIZE + 1) <= mgparams->water_level;
342326
}
343327

344328
bool EmergeManager::pushBlockEmergeData(

‎src/emerge.h

+11-4
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,16 @@ class EmergeManager {
9797
u32 gen_notify_on;
9898
std::set<u32> gen_notify_on_deco_ids;
9999

100-
// Map generation parameters
101-
MapgenParams params;
100+
// Parameters passed to mapgens owned by ServerMap
101+
// TODO(hmmmm): Remove this after mapgen helper methods using them
102+
// are moved to ServerMap
103+
MapgenParams *mgparams;
104+
105+
// Hackish workaround:
106+
// For now, EmergeManager must hold onto a ptr to the Map's setting manager
107+
// since the Map can only be accessed through the Environment, and the
108+
// Environment is not created until after script initialization.
109+
MapSettingsManager *map_settings_mgr;
102110

103111
// Managers of various map generation-related components
104112
BiomeManager *biomemgr;
@@ -110,8 +118,7 @@ class EmergeManager {
110118
EmergeManager(IGameDef *gamedef);
111119
~EmergeManager();
112120

113-
void loadMapgenParams();
114-
void initMapgens();
121+
bool initMapgens(MapgenParams *mgparams);
115122

116123
void startThreads();
117124
void stopThreads();

‎src/map.cpp

+26-74
Original file line numberDiff line numberDiff line change
@@ -2130,11 +2130,15 @@ void Map::removeNodeTimer(v3s16 p)
21302130
*/
21312131
ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emerge):
21322132
Map(dout_server, gamedef),
2133+
settings_mgr(g_settings, savedir + DIR_DELIM + "map_meta.txt"),
21332134
m_emerge(emerge),
21342135
m_map_metadata_changed(true)
21352136
{
21362137
verbosestream<<FUNCTION_NAME<<std::endl;
21372138

2139+
// Tell the EmergeManager about our MapSettingsManager
2140+
emerge->map_settings_mgr = &settings_mgr;
2141+
21382142
/*
21392143
Try to load map; if not found, create a new one.
21402144
*/
@@ -2170,26 +2174,15 @@ ServerMap::ServerMap(std::string savedir, IGameDef *gamedef, EmergeManager *emer
21702174
}
21712175
else
21722176
{
2173-
try{
2174-
// Load map metadata (seed, chunksize)
2175-
loadMapMeta();
2176-
}
2177-
catch(SettingNotFoundException &e){
2178-
infostream<<"ServerMap: Some metadata not found."
2179-
<<" Using default settings."<<std::endl;
2180-
}
2181-
catch(FileNotGoodException &e){
2182-
warningstream<<"Could not load map metadata"
2183-
//<<" Disabling chunk-based generator."
2184-
<<std::endl;
2185-
//m_chunksize = 0;
2186-
}
21872177

2188-
infostream<<"ServerMap: Successfully loaded map "
2189-
<<"metadata from "<<savedir
2190-
<<", assuming valid save directory."
2191-
<<" seed="<< m_emerge->params.seed <<"."
2192-
<<std::endl;
2178+
if (settings_mgr.loadMapMeta()) {
2179+
infostream << "ServerMap: Metadata loaded from "
2180+
<< savedir << std::endl;
2181+
} else {
2182+
infostream << "ServerMap: Metadata could not be loaded "
2183+
"from " << savedir << ", assuming valid save "
2184+
"directory." << std::endl;
2185+
}
21932186

21942187
m_map_saving_enabled = true;
21952188
// Map loaded, not creating new one
@@ -2259,19 +2252,26 @@ ServerMap::~ServerMap()
22592252
#endif
22602253
}
22612254

2255+
MapgenParams *ServerMap::getMapgenParams()
2256+
{
2257+
// getMapgenParams() should only ever be called after Server is initialized
2258+
assert(settings_mgr.mapgen_params != NULL);
2259+
return settings_mgr.mapgen_params;
2260+
}
2261+
22622262
u64 ServerMap::getSeed()
22632263
{
2264-
return m_emerge->params.seed;
2264+
return getMapgenParams()->seed;
22652265
}
22662266

22672267
s16 ServerMap::getWaterLevel()
22682268
{
2269-
return m_emerge->params.water_level;
2269+
return getMapgenParams()->water_level;
22702270
}
22712271

22722272
bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data)
22732273
{
2274-
s16 csize = m_emerge->params.chunksize;
2274+
s16 csize = getMapgenParams()->chunksize;
22752275
v3s16 bpmin = EmergeManager::getContainingChunk(blockpos, csize);
22762276
v3s16 bpmax = bpmin + v3s16(1, 1, 1) * (csize - 1);
22772277

@@ -2287,7 +2287,7 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data)
22872287
blockpos_over_limit(full_bpmax))
22882288
return false;
22892289

2290-
data->seed = m_emerge->params.seed;
2290+
data->seed = getSeed();
22912291
data->blockpos_min = bpmin;
22922292
data->blockpos_max = bpmax;
22932293
data->blockpos_requested = blockpos;
@@ -2905,8 +2905,9 @@ void ServerMap::save(ModifiedState save_level)
29052905
infostream<<"ServerMap: Saving whole map, this can take time."
29062906
<<std::endl;
29072907

2908-
if(m_map_metadata_changed || save_level == MOD_STATE_CLEAN) {
2909-
saveMapMeta();
2908+
if (m_map_metadata_changed || save_level == MOD_STATE_CLEAN) {
2909+
if (settings_mgr.saveMapMeta())
2910+
m_map_metadata_changed = false;
29102911
}
29112912

29122913
// Profile modified reasons
@@ -3005,55 +3006,6 @@ void ServerMap::listAllLoadedBlocks(std::vector<v3s16> &dst)
30053006
}
30063007
}
30073008

3008-
void ServerMap::saveMapMeta()
3009-
{
3010-
DSTACK(FUNCTION_NAME);
3011-
3012-
createDirs(m_savedir);
3013-
3014-
std::string fullpath = m_savedir + DIR_DELIM + "map_meta.txt";
3015-
std::ostringstream oss(std::ios_base::binary);
3016-
Settings conf;
3017-
3018-
m_emerge->params.save(conf);
3019-
conf.writeLines(oss);
3020-
3021-
oss << "[end_of_params]\n";
3022-
3023-
if(!fs::safeWriteToFile(fullpath, oss.str())) {
3024-
errorstream << "ServerMap::saveMapMeta(): "
3025-
<< "could not write " << fullpath << std::endl;
3026-
throw FileNotGoodException("Cannot save chunk metadata");
3027-
}
3028-
3029-
m_map_metadata_changed = false;
3030-
}
3031-
3032-
void ServerMap::loadMapMeta()
3033-
{
3034-
DSTACK(FUNCTION_NAME);
3035-
3036-
Settings conf;
3037-
std::string fullpath = m_savedir + DIR_DELIM + "map_meta.txt";
3038-
3039-
std::ifstream is(fullpath.c_str(), std::ios_base::binary);
3040-
if (!is.good()) {
3041-
errorstream << "ServerMap::loadMapMeta(): "
3042-
"could not open " << fullpath << std::endl;
3043-
throw FileNotGoodException("Cannot open map metadata");
3044-
}
3045-
3046-
if (!conf.parseConfigLines(is, "[end_of_params]")) {
3047-
throw SerializationError("ServerMap::loadMapMeta(): "
3048-
"[end_of_params] not found!");
3049-
}
3050-
3051-
m_emerge->params.load(conf);
3052-
3053-
verbosestream << "ServerMap::loadMapMeta(): seed="
3054-
<< m_emerge->params.seed << std::endl;
3055-
}
3056-
30573009
void ServerMap::saveSectorMeta(ServerMapSector *sector)
30583010
{
30593011
DSTACK(FUNCTION_NAME);

‎src/map.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
3333
#include "modifiedstate.h"
3434
#include "util/container.h"
3535
#include "nodetimer.h"
36+
#include "map_settings_manager.h"
3637

3738
class Settings;
3839
class Database;
@@ -46,8 +47,6 @@ class IRollbackManager;
4647
class EmergeManager;
4748
class ServerEnvironment;
4849
struct BlockMakeData;
49-
struct MapgenParams;
50-
5150

5251
/*
5352
MapEditEvent
@@ -463,9 +462,8 @@ class ServerMap : public Map
463462
void save(ModifiedState save_level);
464463
void listAllLoadableBlocks(std::vector<v3s16> &dst);
465464
void listAllLoadedBlocks(std::vector<v3s16> &dst);
466-
// Saves map seed and possibly other stuff
467-
void saveMapMeta();
468-
void loadMapMeta();
465+
466+
MapgenParams *getMapgenParams();
469467

470468
/*void saveChunkMeta();
471469
void loadChunkMeta();*/
@@ -506,6 +504,8 @@ class ServerMap : public Map
506504
u64 getSeed();
507505
s16 getWaterLevel();
508506

507+
MapSettingsManager settings_mgr;
508+
509509
private:
510510
// Emerge manager
511511
EmergeManager *m_emerge;

0 commit comments

Comments
 (0)
Please sign in to comment.