Skip to content
Permalink
Browse files

Add NodeResolver and clean up node name -> content ID resolution system

  • Loading branch information
kwolekr committed Oct 27, 2014
1 parent b49e5cf commit d274cbfce6ed39f5b7ad41261ede8c0fad7e980a
Showing with 446 additions and 343 deletions.
  1. +16 −68 src/biome.cpp
  2. +3 −1 src/biome.h
  3. +4 −14 src/emerge.cpp
  4. +53 −117 src/mapgen.cpp
  5. +13 −24 src/mapgen.h
  6. +166 −1 src/nodedef.cpp
  7. +39 −1 src/nodedef.h
  8. +30 −0 src/script/common/c_converter.cpp
  9. +23 −19 src/script/common/c_converter.h
  10. +96 −98 src/script/lua_api/l_mapgen.cpp
  11. +3 −0 src/server.cpp
@@ -30,38 +30,30 @@ NoiseParams nparams_biome_def_heat(50, 50, v3f(500.0, 500.0, 500.0), 5349, 3, 0.
NoiseParams nparams_biome_def_humidity(50, 50, v3f(500.0, 500.0, 500.0), 842, 3, 0.55);


BiomeDefManager::BiomeDefManager() {
BiomeDefManager::BiomeDefManager(NodeResolver *resolver) {
biome_registration_finished = false;
np_heat = &nparams_biome_def_heat;
np_humidity = &nparams_biome_def_humidity;

// Create default biome to be used in case none exist
Biome *b = new Biome;

b->id = 0;
b->name = "Default";
b->flags = 0;

b->depth_top = 0;
b->depth_filler = 0;

b->nname_top = "air";
b->nname_filler = "air";
b->nname_water = "mapgen_water_source";
b->nname_dust = "air";
b->nname_dust_water = "mapgen_water_source";

b->c_top = CONTENT_IGNORE;
b->c_filler = CONTENT_IGNORE;
b->c_water = CONTENT_IGNORE;
b->c_dust = CONTENT_IGNORE;
b->c_dust_water = CONTENT_IGNORE;

b->id = 0;
b->name = "Default";
b->flags = 0;
b->depth_top = 0;
b->depth_filler = 0;
b->height_min = -MAP_GENERATION_LIMIT;
b->height_max = MAP_GENERATION_LIMIT;
b->heat_point = 0.0;
b->humidity_point = 0.0;

resolver->addNode("air", "", CONTENT_AIR, &b->c_top);
resolver->addNode("air", "", CONTENT_AIR, &b->c_filler);
resolver->addNode("mapgen_water_source", "", CONTENT_AIR, &b->c_water);
resolver->addNode("air", "", CONTENT_AIR, &b->c_dust);
resolver->addNode("mapgen_water_source", "", CONTENT_AIR, &b->c_dust_water);

biomes.push_back(b);
}

@@ -106,62 +98,18 @@ void BiomeDefManager::calcBiomes(BiomeNoiseInput *input, u8 *biomeid_map) {
}


void BiomeDefManager::resolveNodeNames(INodeDefManager *ndef) {
Biome *b;

biome_registration_finished = true;

for (size_t i = 0; i < biomes.size(); i++) {
b = biomes[i];

b->c_top = ndef->getId(b->nname_top);
if (b->c_top == CONTENT_IGNORE) {
errorstream << "BiomeDefManager::resolveNodeNames: node '"
<< b->nname_top << "' not defined" << std::endl;
b->c_top = CONTENT_AIR;
b->depth_top = 0;
}

b->c_filler = ndef->getId(b->nname_filler);
if (b->c_filler == CONTENT_IGNORE) {
errorstream << "BiomeDefManager::resolveNodeNames: node '"
<< b->nname_filler << "' not defined" << std::endl;
b->c_filler = CONTENT_AIR;
b->depth_filler = 0;
}

b->c_water = ndef->getId(b->nname_water);
if (b->c_water == CONTENT_IGNORE) {
errorstream << "BiomeDefManager::resolveNodeNames: node '"
<< b->nname_water << "' not defined" << std::endl;
b->c_water = CONTENT_AIR;
}

b->c_dust = ndef->getId(b->nname_dust);
if (b->c_dust == CONTENT_IGNORE) {
errorstream << "BiomeDefManager::resolveNodeNames: node '"
<< b->nname_dust << "' not defined" << std::endl;
}

b->c_dust_water = ndef->getId(b->nname_dust_water);
if (b->c_dust_water == CONTENT_IGNORE) {
errorstream << "BiomeDefManager::resolveNodeNames: node '"
<< b->nname_dust_water << "' not defined" << std::endl;
}
}
}


void BiomeDefManager::addBiome(Biome *b) {
if (biome_registration_finished) {
errorstream << "BIomeDefManager: biome registration already finished, dropping " << b->name <<std::endl;
errorstream << "BIomeDefManager: biome registration already "
"finished, dropping " << b->name << std::endl;
delete b;
return;
}

size_t nbiomes = biomes.size();
if (nbiomes >= 0xFF) {
errorstream << "BiomeDefManager: too many biomes, dropping " << b->name << std::endl;
errorstream << "BiomeDefManager: too many biomes, dropping "
<< b->name << std::endl;
delete b;
return;
}
@@ -45,11 +45,13 @@ class Biome {
std::string name;
u32 flags;

/*
std::string nname_top;
std::string nname_filler;
std::string nname_water;
std::string nname_dust;
std::string nname_dust_water;
*/

content_t c_top;
content_t c_filler;
@@ -81,7 +83,7 @@ class BiomeDefManager {
NoiseParams *np_heat;
NoiseParams *np_humidity;

BiomeDefManager();
BiomeDefManager(NodeResolver *resolver);
~BiomeDefManager();

Biome *createBiome(BiomeTerrainType btt);
@@ -85,7 +85,7 @@ EmergeManager::EmergeManager(IGameDef *gamedef) {
registerMapgen("singlenode", new MapgenFactorySinglenode());

this->ndef = gamedef->getNodeDefManager();
this->biomedef = new BiomeDefManager();
this->biomedef = new BiomeDefManager(gamedef->getNodeDefManager()->getResolver());
this->gennotify = 0;

// Note that accesses to this variable are not synchronized.
@@ -145,9 +145,9 @@ EmergeManager::~EmergeManager() {
delete decorations[i];
decorations.clear();

for (std::map<std::string, MapgenFactory *>::iterator iter = mglist.begin();
iter != mglist.end(); iter ++) {
delete iter->second;
for (std::map<std::string, MapgenFactory *>::iterator it = mglist.begin();
it != mglist.end(); ++it) {
delete it->second;
}
mglist.clear();

@@ -176,16 +176,6 @@ void EmergeManager::initMapgens() {
if (mapgen.size())
return;

// Resolve names of nodes for things that were registered
// (at this point, the registration period is over)
biomedef->resolveNodeNames(ndef);

for (size_t i = 0; i != ores.size(); i++)
ores[i]->resolveNodeNames(ndef);

for (size_t i = 0; i != decorations.size(); i++)
decorations[i]->resolveNodeNames(ndef);

if (!params.sparams) {
params.sparams = createMapgenParams(params.mg_name);
if (!params.sparams) {

0 comments on commit d274cbf

Please sign in to comment.