diff options
author | Weblate <42@minetest.ru> | 2013-03-30 19:49:52 +0100 |
---|---|---|
committer | Weblate <42@minetest.ru> | 2013-03-30 19:49:52 +0100 |
commit | a0566270d9fa075afa36a7e3e68c690b1b23ba90 (patch) | |
tree | 6bc88127ee67b7bf4d6a2d6f9d0a9e5f997d1dd1 /src/map.cpp | |
parent | 0d83bdc3aa9f1077836aacb833ac4ad9bbb9a4f4 (diff) | |
parent | 1aa50b13622c1e264044839ecdf0152670dae6ce (diff) | |
download | minetest-a0566270d9fa075afa36a7e3e68c690b1b23ba90.tar.gz minetest-a0566270d9fa075afa36a7e3e68c690b1b23ba90.tar.bz2 minetest-a0566270d9fa075afa36a7e3e68c690b1b23ba90.zip |
Merge remote branch 'origin/master'
Diffstat (limited to 'src/map.cpp')
-rw-r--r-- | src/map.cpp | 452 |
1 files changed, 235 insertions, 217 deletions
diff --git a/src/map.cpp b/src/map.cpp index 4be094326..5d6b79fb0 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -35,6 +35,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "rollback_interface.h" #include "emerge.h" #include "mapgen_v6.h" +#include "mapgen_indev.h" #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")" @@ -73,34 +74,30 @@ Map::~Map() /* Free all MapSectors */ - core::map<v2s16, MapSector*>::Iterator i = m_sectors.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map<v2s16, MapSector*>::iterator i = m_sectors.begin(); + i != m_sectors.end(); ++i) { - MapSector *sector = i.getNode()->getValue(); - delete sector; + delete i->second; } } void Map::addEventReceiver(MapEventReceiver *event_receiver) { - m_event_receivers.insert(event_receiver, false); + m_event_receivers.insert(event_receiver); } void Map::removeEventReceiver(MapEventReceiver *event_receiver) { - if(m_event_receivers.find(event_receiver) == NULL) - return; - m_event_receivers.remove(event_receiver); + m_event_receivers.erase(event_receiver); } void Map::dispatchEvent(MapEditEvent *event) { - for(core::map<MapEventReceiver*, bool>::Iterator - i = m_event_receivers.getIterator(); - i.atEnd()==false; i++) + for(std::set<MapEventReceiver*>::iterator + i = m_event_receivers.begin(); + i != m_event_receivers.end(); ++i) { - MapEventReceiver* event_receiver = i.getNode()->getKey(); - event_receiver->onMapEditEvent(event); + (*i)->onMapEditEvent(event); } } @@ -111,12 +108,12 @@ MapSector * Map::getSectorNoGenerateNoExNoLock(v2s16 p) return sector; } - core::map<v2s16, MapSector*>::Node *n = m_sectors.find(p); + std::map<v2s16, MapSector*>::iterator n = m_sectors.find(p); - if(n == NULL) + if(n == m_sectors.end()) return NULL; - MapSector *sector = n->getValue(); + MapSector *sector = n->second; // Cache the last result m_sector_cache_p = p; @@ -236,9 +233,9 @@ void Map::setNode(v3s16 p, MapNode & n) values of from_nodes are lighting values. */ void Map::unspreadLight(enum LightBank bank, - core::map<v3s16, u8> & from_nodes, - core::map<v3s16, bool> & light_sources, - core::map<v3s16, MapBlock*> & modified_blocks) + std::map<v3s16, u8> & from_nodes, + std::set<v3s16> & light_sources, + std::map<v3s16, MapBlock*> & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -256,9 +253,7 @@ void Map::unspreadLight(enum LightBank bank, u32 blockchangecount = 0; - core::map<v3s16, u8> unlighted_nodes; - core::map<v3s16, u8>::Iterator j; - j = from_nodes.getIterator(); + std::map<v3s16, u8> unlighted_nodes; /* Initialize block cache @@ -268,9 +263,10 @@ void Map::unspreadLight(enum LightBank bank, // Cache this a bit, too bool block_checked_in_modified = false; - for(; j.atEnd() == false; j++) + for(std::map<v3s16, u8>::iterator j = from_nodes.begin(); + j != from_nodes.end(); ++j) { - v3s16 pos = j.getNode()->getKey(); + v3s16 pos = j->first; v3s16 blockpos = getNodeBlockPos(pos); // Only fetch a new block if the block position has changed @@ -297,7 +293,7 @@ void Map::unspreadLight(enum LightBank bank, // Get node straight from the block MapNode n = block->getNode(relpos); - u8 oldlight = j.getNode()->getValue(); + u8 oldlight = j->second; // Loop through 6 neighbors for(u16 i=0; i<6; i++) @@ -354,7 +350,7 @@ void Map::unspreadLight(enum LightBank bank, n2.setLight(bank, 0, nodemgr); block->setNode(relpos, n2); - unlighted_nodes.insert(n2pos, current_light); + unlighted_nodes[n2pos] = current_light; changed = true; /* @@ -373,16 +369,16 @@ void Map::unspreadLight(enum LightBank bank, light_sources.remove(n2pos);*/ } else{ - light_sources.insert(n2pos, true); + light_sources.insert(n2pos); } // Add to modified_blocks if(changed == true && block_checked_in_modified == false) { // If the block is not found in modified_blocks, add. - if(modified_blocks.find(blockpos) == NULL) + if(modified_blocks.find(blockpos) == modified_blocks.end()) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; } block_checked_in_modified = true; } @@ -408,11 +404,11 @@ void Map::unspreadLight(enum LightBank bank, */ void Map::unLightNeighbors(enum LightBank bank, v3s16 pos, u8 lightwas, - core::map<v3s16, bool> & light_sources, - core::map<v3s16, MapBlock*> & modified_blocks) + std::set<v3s16> & light_sources, + std::map<v3s16, MapBlock*> & modified_blocks) { - core::map<v3s16, u8> from_nodes; - from_nodes.insert(pos, lightwas); + std::map<v3s16, u8> from_nodes; + from_nodes[pos] = lightwas; unspreadLight(bank, from_nodes, light_sources, modified_blocks); } @@ -422,8 +418,8 @@ void Map::unLightNeighbors(enum LightBank bank, goes on recursively. */ void Map::spreadLight(enum LightBank bank, - core::map<v3s16, bool> & from_nodes, - core::map<v3s16, MapBlock*> & modified_blocks) + std::set<v3s16> & from_nodes, + std::map<v3s16, MapBlock*> & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -441,9 +437,7 @@ void Map::spreadLight(enum LightBank bank, u32 blockchangecount = 0; - core::map<v3s16, bool> lighted_nodes; - core::map<v3s16, bool>::Iterator j; - j = from_nodes.getIterator(); + std::set<v3s16> lighted_nodes; /* Initialize block cache @@ -453,12 +447,10 @@ void Map::spreadLight(enum LightBank bank, // Cache this a bit, too bool block_checked_in_modified = false; - for(; j.atEnd() == false; j++) - //for(; j != from_nodes.end(); j++) + for(std::set<v3s16>::iterator j = from_nodes.begin(); + j != from_nodes.end(); ++j) { - v3s16 pos = j.getNode()->getKey(); - //v3s16 pos = *j; - //infostream<<"pos=("<<pos.X<<","<<pos.Y<<","<<pos.Z<<")"<<std::endl; + v3s16 pos = *j; v3s16 blockpos = getNodeBlockPos(pos); // Only fetch a new block if the block position has changed @@ -525,8 +517,7 @@ void Map::spreadLight(enum LightBank bank, */ if(n2.getLight(bank, nodemgr) > undiminish_light(oldlight)) { - lighted_nodes.insert(n2pos, true); - //lighted_nodes.push_back(n2pos); + lighted_nodes.insert(n2pos); changed = true; } /* @@ -539,8 +530,7 @@ void Map::spreadLight(enum LightBank bank, { n2.setLight(bank, newlight, nodemgr); block->setNode(relpos, n2); - lighted_nodes.insert(n2pos, true); - //lighted_nodes.push_back(n2pos); + lighted_nodes.insert(n2pos); changed = true; } } @@ -549,9 +539,9 @@ void Map::spreadLight(enum LightBank bank, if(changed == true && block_checked_in_modified == false) { // If the block is not found in modified_blocks, add. - if(modified_blocks.find(blockpos) == NULL) + if(modified_blocks.find(blockpos) == modified_blocks.end()) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; } block_checked_in_modified = true; } @@ -577,10 +567,10 @@ void Map::spreadLight(enum LightBank bank, */ void Map::lightNeighbors(enum LightBank bank, v3s16 pos, - core::map<v3s16, MapBlock*> & modified_blocks) + std::map<v3s16, MapBlock*> & modified_blocks) { - core::map<v3s16, bool> from_nodes; - from_nodes.insert(pos, true); + std::set<v3s16> from_nodes; + from_nodes.insert(pos); spreadLight(bank, from_nodes, modified_blocks); } @@ -635,7 +625,7 @@ v3s16 Map::getBrightestNeighbour(enum LightBank bank, v3s16 p) Mud is turned into grass in where the sunlight stops. */ s16 Map::propagateSunlight(v3s16 start, - core::map<v3s16, MapBlock*> & modified_blocks) + std::map<v3s16, MapBlock*> & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -662,7 +652,7 @@ s16 Map::propagateSunlight(v3s16 start, n.setLight(LIGHTBANK_DAY, LIGHT_SUN, nodemgr); block->setNode(relpos, n); - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; } else { @@ -674,8 +664,8 @@ s16 Map::propagateSunlight(v3s16 start, } void Map::updateLighting(enum LightBank bank, - core::map<v3s16, MapBlock*> & a_blocks, - core::map<v3s16, MapBlock*> & modified_blocks) + std::map<v3s16, MapBlock*> & a_blocks, + std::map<v3s16, MapBlock*> & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -688,22 +678,21 @@ void Map::updateLighting(enum LightBank bank, //bool debug=true; //u32 count_was = modified_blocks.size(); - core::map<v3s16, MapBlock*> blocks_to_update; + std::map<v3s16, MapBlock*> blocks_to_update; - core::map<v3s16, bool> light_sources; + std::set<v3s16> light_sources; - core::map<v3s16, u8> unlight_from; + std::map<v3s16, u8> unlight_from; int num_bottom_invalid = 0; { //TimeTaker t("first stuff"); - core::map<v3s16, MapBlock*>::Iterator i; - i = a_blocks.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map<v3s16, MapBlock*>::iterator i = a_blocks.begin(); + i != a_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; for(;;) { @@ -713,9 +702,8 @@ void Map::updateLighting(enum LightBank bank, v3s16 pos = block->getPos(); v3s16 posnodes = block->getPosRelative(); - modified_blocks.insert(pos, block); - - blocks_to_update.insert(pos, block); + modified_blocks[pos] = block; + blocks_to_update[pos] = block; /* Clear all light from block @@ -735,7 +723,7 @@ void Map::updateLighting(enum LightBank bank, // If node sources light, add to list u8 source = nodemgr->get(n).light_source; if(source != 0) - light_sources[p + posnodes] = true; + light_sources.insert(p + posnodes); // Collect borders for unlighting if((x==0 || x == MAP_BLOCKSIZE-1 @@ -744,7 +732,7 @@ void Map::updateLighting(enum LightBank bank, && oldlight != 0) { v3s16 p_map = p + posnodes; - unlight_from.insert(p_map, oldlight); + unlight_from[p_map] = oldlight; } } catch(InvalidPositionException &e) @@ -912,8 +900,8 @@ void Map::updateLighting(enum LightBank bank, //m_dout<<"Done ("<<getTimestamp()<<")"<<std::endl; } -void Map::updateLighting(core::map<v3s16, MapBlock*> & a_blocks, - core::map<v3s16, MapBlock*> & modified_blocks) +void Map::updateLighting(std::map<v3s16, MapBlock*> & a_blocks, + std::map<v3s16, MapBlock*> & modified_blocks) { updateLighting(LIGHTBANK_DAY, a_blocks, modified_blocks); updateLighting(LIGHTBANK_NIGHT, a_blocks, modified_blocks); @@ -921,11 +909,11 @@ void Map::updateLighting(core::map<v3s16, MapBlock*> & a_blocks, /* Update information about whether day and night light differ */ - for(core::map<v3s16, MapBlock*>::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map<v3s16, MapBlock*>::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; block->expireDayNightDiff(); } } @@ -933,7 +921,7 @@ void Map::updateLighting(core::map<v3s16, MapBlock*> & a_blocks, /* */ void Map::addNodeAndUpdate(v3s16 p, MapNode n, - core::map<v3s16, MapBlock*> &modified_blocks) + std::map<v3s16, MapBlock*> &modified_blocks) { INodeDefManager *ndef = m_gamedef->ndef(); @@ -952,7 +940,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, v3s16 bottompos = p + v3s16(0,-1,0); bool node_under_sunlight = true; - core::map<v3s16, bool> light_sources; + std::set<v3s16> light_sources; /* Collect old node for rollback @@ -994,7 +982,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, v3s16 blockpos = getNodeBlockPos(p); MapBlock * block = getBlockNoCreate(blockpos); assert(block != NULL); - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; assert(isValidPosition(p)); @@ -1078,12 +1066,11 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, /* Update information about whether day and night light differ */ - for(core::map<v3s16, MapBlock*>::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map<v3s16, MapBlock*>::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); - block->expireDayNightDiff(); + i->second->expireDayNightDiff(); } /* @@ -1132,7 +1119,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, /* */ void Map::removeNodeAndUpdate(v3s16 p, - core::map<v3s16, MapBlock*> &modified_blocks) + std::map<v3s16, MapBlock*> &modified_blocks) { INodeDefManager *ndef = m_gamedef->ndef(); @@ -1166,7 +1153,7 @@ void Map::removeNodeAndUpdate(v3s16 p, { } - core::map<v3s16, bool> light_sources; + std::set<v3s16> light_sources; enum LightBank banks[] = { @@ -1214,7 +1201,7 @@ void Map::removeNodeAndUpdate(v3s16 p, v3s16 blockpos = getNodeBlockPos(p); MapBlock * block = getBlockNoCreate(blockpos); assert(block != NULL); - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; /* If the removed node was under sunlight, propagate the @@ -1270,12 +1257,11 @@ void Map::removeNodeAndUpdate(v3s16 p, /* Update information about whether day and night light differ */ - for(core::map<v3s16, MapBlock*>::Iterator - i = modified_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map<v3s16, MapBlock*>::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); - block->expireDayNightDiff(); + i->second->expireDayNightDiff(); } /* @@ -1330,15 +1316,15 @@ bool Map::addNodeWithEvent(v3s16 p, MapNode n) bool succeeded = true; try{ - core::map<v3s16, MapBlock*> modified_blocks; + std::map<v3s16, MapBlock*> modified_blocks; addNodeAndUpdate(p, n, modified_blocks); // Copy modified_blocks to event - for(core::map<v3s16, MapBlock*>::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::map<v3s16, MapBlock*>::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - event.modified_blocks.insert(i.getNode()->getKey(), false); + event.modified_blocks.insert(i->first); } } catch(InvalidPositionException &e){ @@ -1358,15 +1344,15 @@ bool Map::removeNodeWithEvent(v3s16 p) bool succeeded = true; try{ - core::map<v3s16, MapBlock*> modified_blocks; + std::map<v3s16, MapBlock*> modified_blocks; removeNodeAndUpdate(p, modified_blocks); // Copy modified_blocks to event - for(core::map<v3s16, MapBlock*>::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::map<v3s16, MapBlock*>::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - event.modified_blocks.insert(i.getNode()->getKey(), false); + event.modified_blocks.insert(i->first); } } catch(InvalidPositionException &e){ @@ -1439,33 +1425,31 @@ bool Map::getDayNightDiff(v3s16 blockpos) Updates usage timers */ void Map::timerUpdate(float dtime, float unload_timeout, - core::list<v3s16> *unloaded_blocks) + std::list<v3s16> *unloaded_blocks) { bool save_before_unloading = (mapType() == MAPTYPE_SERVER); // Profile modified reasons Profiler modprofiler; - core::list<v2s16> sector_deletion_queue; + std::list<v2s16> sector_deletion_queue; u32 deleted_blocks_count = 0; u32 saved_blocks_count = 0; u32 block_count_all = 0; - core::map<v2s16, MapSector*>::Iterator si; - beginSave(); - si = m_sectors.getIterator(); - for(; si.atEnd() == false; si++) + for(std::map<v2s16, MapSector*>::iterator si = m_sectors.begin(); + si != m_sectors.end(); ++si) { - MapSector *sector = si.getNode()->getValue(); + MapSector *sector = si->second; bool all_blocks_deleted = true; - core::list<MapBlock*> blocks; + std::list<MapBlock*> blocks; sector->getBlocks(blocks); - for(core::list<MapBlock*>::Iterator i = blocks.begin(); - i != blocks.end(); i++) + for(std::list<MapBlock*>::iterator i = blocks.begin(); + i != blocks.end(); ++i) { MapBlock *block = (*i); @@ -1501,7 +1485,7 @@ void Map::timerUpdate(float dtime, float unload_timeout, if(all_blocks_deleted) { - sector_deletion_queue.push_back(si.getNode()->getKey()); + sector_deletion_queue.push_back(si->first); } } endSave(); @@ -1526,17 +1510,17 @@ void Map::timerUpdate(float dtime, float unload_timeout, } } -void Map::deleteSectors(core::list<v2s16> &list) +void Map::deleteSectors(std::list<v2s16> &list) { - core::list<v2s16>::Iterator j; - for(j=list.begin(); j!=list.end(); j++) + for(std::list<v2s16>::iterator j = list.begin(); + j != list.end(); ++j) { MapSector *sector = m_sectors[*j]; // If sector is in sector cache, remove it from there if(m_sector_cache == sector) m_sector_cache = NULL; // Remove from map and delete - m_sectors.remove(*j); + m_sectors.erase(*j); delete sector; } } @@ -1642,7 +1626,7 @@ const v3s16 g_7dirs[7] = #define D_TOP 6 #define D_SELF 1 -void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) +void Map::transformLiquidsFinite(std::map<v3s16, MapBlock*> & modified_blocks) { INodeDefManager *nodemgr = m_gamedef->ndef(); @@ -1656,19 +1640,16 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) bool fast_flood = g_settings->getS16("liquid_fast_flood"); int water_level = g_settings->getS16("water_level"); - /*if(initial_size != 0) - infostream<<"transformLiquids(): initial_size="<<initial_size<<std::endl;*/ - // list of nodes that due to viscosity have not reached their max level height UniqueQueue<v3s16> must_reflow, must_reflow_second; // List of MapBlocks that will require a lighting update (due to lava) - core::map<v3s16, MapBlock*> lighting_modified_blocks; + std::map<v3s16, MapBlock*> lighting_modified_blocks; - while(m_transforming_liquid.size() > 0) + while (m_transforming_liquid.size() > 0) { // This should be done here so that it is done when continue is used - if(loopcount >= initial_size || loopcount >= 1000) + if (loopcount >= initial_size || loopcount >= 1000) break; loopcount++; /* @@ -1676,9 +1657,12 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) */ v3s16 p0 = m_transforming_liquid.pop_front(); u16 total_level = 0; - NodeNeighbor neighbors[7]; // surrounding flowing liquid nodes - s8 liquid_levels[7] = {-1, -1, -1, -1, -1, -1, -1}; // current level of every block - s8 liquid_levels_want[7] = {-1, -1, -1, -1, -1, -1, -1}; // target levels + // surrounding flowing liquid nodes + NodeNeighbor neighbors[7]; + // current level of every block + s8 liquid_levels[7] = {-1, -1, -1, -1, -1, -1, -1}; + // target levels + s8 liquid_levels_want[7] = {-1, -1, -1, -1, -1, -1, -1}; s8 can_liquid_same_level = 0; content_t liquid_kind = CONTENT_IGNORE; content_t liquid_kind_flowing = CONTENT_IGNORE; @@ -1713,9 +1697,11 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) } break; case LIQUID_SOURCE: - // if this node is not (yet) of a liquid type, choose the first liquid type we encounter + // if this node is not (yet) of a liquid type, + // choose the first liquid type we encounter if (liquid_kind_flowing == CONTENT_IGNORE) - liquid_kind_flowing = nodemgr->getId(nodemgr->get(nb.n).liquid_alternative_flowing); + liquid_kind_flowing = nodemgr->getId( + nodemgr->get(nb.n).liquid_alternative_flowing); if (liquid_kind == CONTENT_IGNORE) liquid_kind = nb.n.getContent(); if (nb.n.getContent() == liquid_kind) { @@ -1725,37 +1711,55 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) } break; case LIQUID_FLOWING: - // if this node is not (yet) of a liquid type, choose the first liquid type we encounter + // if this node is not (yet) of a liquid type, + // choose the first liquid type we encounter if (liquid_kind_flowing == CONTENT_IGNORE) liquid_kind_flowing = nb.n.getContent(); if (liquid_kind == CONTENT_IGNORE) - liquid_kind = nodemgr->getId(nodemgr->get(nb.n).liquid_alternative_source); + liquid_kind = nodemgr->getId( + nodemgr->get(nb.n).liquid_alternative_source); if (nb.n.getContent() == liquid_kind_flowing) { liquid_levels[i] = (nb.n.param2 & LIQUID_LEVEL_MASK); nb.l = 1; } break; } - if (nb.l && nb.t == NEIGHBOR_SAME_LEVEL) ++can_liquid_same_level; - if (liquid_levels[i] > 0) total_level += liquid_levels[i]; + + if (nb.l && nb.t == NEIGHBOR_SAME_LEVEL) + ++can_liquid_same_level; + if (liquid_levels[i] > 0) + total_level += liquid_levels[i]; /* - infostream << "get node i=" <<(int)i<<" " << PP(npos) << " c="<<nb.n.getContent() <<" p0="<< (int)nb.n.param0 <<" p1="<< (int)nb.n.param1 <<" p2="<< (int)nb.n.param2 << " lt="<<nodemgr->get(nb.n.getContent()).liquid_type + infostream << "get node i=" <<(int)i<<" " << PP(npos) << " c=" + << nb.n.getContent() <<" p0="<< (int)nb.n.param0 <<" p1=" + << (int)nb.n.param1 <<" p2="<< (int)nb.n.param2 << " lt=" + << nodemgr->get(nb.n.getContent()).liquid_type //<< " lk=" << liquid_kind << " lkf=" << liquid_kind_flowing - << " l="<< nb.l << " inf="<< nb.i << " nlevel=" << (int)liquid_levels[i] << " tlevel=" << (int)total_level << " cansame="<<(int)can_liquid_same_level<<std::endl; + << " l="<< nb.l << " inf="<< nb.i << " nlevel=" << (int)liquid_levels[i] + << " tlevel=" << (int)total_level << " cansame=" + << (int)can_liquid_same_level << std::endl; */ } - if (liquid_kind == CONTENT_IGNORE || !neighbors[D_SELF].l || total_level <= 0) + if (liquid_kind == CONTENT_IGNORE || + !neighbors[D_SELF].l || + total_level <= 0) continue; // fill bottom block if (neighbors[D_BOTTOM].l) { - liquid_levels_want[D_BOTTOM] = total_level > LIQUID_LEVEL_SOURCE ? LIQUID_LEVEL_SOURCE : total_level; + liquid_levels_want[D_BOTTOM] = total_level > LIQUID_LEVEL_SOURCE ? + LIQUID_LEVEL_SOURCE : total_level; total_level -= liquid_levels_want[D_BOTTOM]; } - if (relax && p0.Y <= water_level && liquid_levels[D_TOP] == 0 && total_level >= LIQUID_LEVEL_SOURCE * can_liquid_same_level - can_liquid_same_level + 2 && can_liquid_same_level >= relax + 1) { //relax up + //relax up + if (relax && p0.Y <= water_level && liquid_levels[D_TOP] == 0 && + liquid_levels[D_BOTTOM] == LIQUID_LEVEL_SOURCE && + total_level >= LIQUID_LEVEL_SOURCE * can_liquid_same_level- + (can_liquid_same_level - relax) && + can_liquid_same_level >= relax + 1) { total_level = LIQUID_LEVEL_SOURCE * can_liquid_same_level; } @@ -1766,7 +1770,11 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) : total_level / can_liquid_same_level; total_level -= want_level * can_liquid_same_level; - if (relax && p0.Y > water_level && liquid_levels[D_TOP] == 0 && liquid_levels[D_BOTTOM] == LIQUID_LEVEL_SOURCE && want_level == 0 && total_level <= can_liquid_same_level - 2 && can_liquid_same_level >= relax + 1) { //relax down + //relax down + if (relax && p0.Y == water_level + 1 && liquid_levels[D_TOP] == 0 && + liquid_levels[D_BOTTOM] == LIQUID_LEVEL_SOURCE && want_level == 0 && + total_level <= (can_liquid_same_level - relax) && + can_liquid_same_level >= relax + 1) { total_level = 0; } @@ -1784,7 +1792,8 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) for (u16 ii = 0; ii < 7; ++ii) { if (total_level < 1) break; - if (liquid_levels_want[ii] >= 0 && liquid_levels_want[ii] < LIQUID_LEVEL_SOURCE) { + if (liquid_levels_want[ii] >= 0 && + liquid_levels_want[ii] < LIQUID_LEVEL_SOURCE) { ++liquid_levels_want[ii]; --total_level; } @@ -1792,7 +1801,8 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) // fill top block if can if (neighbors[D_TOP].l) { - liquid_levels_want[D_TOP] = total_level > LIQUID_LEVEL_SOURCE ? LIQUID_LEVEL_SOURCE : total_level ; + liquid_levels_want[D_TOP] = total_level > LIQUID_LEVEL_SOURCE ? + LIQUID_LEVEL_SOURCE : total_level; total_level -= liquid_levels_want[D_TOP]; } @@ -1807,7 +1817,15 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) && liquid_levels[D_TOP] >= LIQUID_LEVEL_SOURCE)))) liquid_levels_want[ii] = LIQUID_LEVEL_SOURCE; - //if (total_level > 0 /*|| flowed != volume*/) infostream <<" AFTER level=" << (int)total_level /*<< " flowed="<<flowed<< " volume=" <<volume*/<< " wantsame="<<(int)want_level<< " top="<< (int)liquid_levels_want[D_TOP]<< " topwas="<< (int)liquid_levels[D_TOP]<< " bot="<< (int)liquid_levels_want[D_BOTTOM]<<std::endl; + /* + if (total_level > 0) //|| flowed != volume) + infostream <<" AFTER level=" << (int)total_level + //<< " flowed="<<flowed<< " volume=" << volume + << " wantsame="<<(int)want_level<< " top=" + << (int)liquid_levels_want[D_TOP]<< " topwas=" + << (int)liquid_levels[D_TOP]<< " bot=" + << (int)liquid_levels_want[D_BOTTOM]<<std::endl; + */ u8 changed = 0; for (u16 i = 0; i < 7; i++) { @@ -1831,8 +1849,10 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) new_node_level = liquid_levels[i] - 1; else if (level_inc > 0) new_node_level = liquid_levels[i] + 1; - } else + } else { new_node_level = liquid_levels_want[i]; + } + if (new_node_level >= LIQUID_LEVEL_SOURCE) new_node_content = liquid_kind; else if (new_node_level > 0) @@ -1841,25 +1861,30 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) new_node_content = CONTENT_AIR; // last level must flow down on stairs - if (liquid_levels_want[i] != liquid_levels[i] && liquid_levels[D_TOP] <= 0 && !neighbors[D_BOTTOM].l && new_node_level >= 1 && new_node_level <= 2) //maybe == 1 // + if (liquid_levels_want[i] != liquid_levels[i] && + liquid_levels[D_TOP] <= 0 && !neighbors[D_BOTTOM].l && + new_node_level >= 1 && new_node_level <= 2) { for (u16 ii = D_SELF + 1; ii < D_TOP; ++ii) { // only same level - if (!neighbors[ii].l) - continue; - must_reflow_second.push_back(p0 + dirs[ii]); + if (neighbors[ii].l) + must_reflow_second.push_back(p0 + dirs[ii]); + } } /* - check if anything has changed. if not, just continue with the next node. + check if anything has changed. + if not, just continue with the next node. */ if ( new_node_content == n0.getContent() && (nodemgr->get(n0.getContent()).liquid_type != LIQUID_FLOWING || ((n0.param2 & LIQUID_LEVEL_MASK) == (u8)new_node_level - // &&((n0.param2 & LIQUID_FLOW_DOWN_MASK) == LIQUID_FLOW_DOWN_MASK)== flowing_down + //&& ((n0.param2 & LIQUID_FLOW_DOWN_MASK) == + //LIQUID_FLOW_DOWN_MASK) == flowing_down )) && (nodemgr->get(n0.getContent()).liquid_type != LIQUID_SOURCE || - (((n0.param2 & LIQUID_INFINITY_MASK) == LIQUID_INFINITY_MASK) == neighbors[i].i + (((n0.param2 & LIQUID_INFINITY_MASK) == + LIQUID_INFINITY_MASK) == neighbors[i].i )) ) { continue; @@ -1876,7 +1901,12 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) //n0.param2 = ~(LIQUID_LEVEL_MASK | LIQUID_FLOW_DOWN_MASK); n0.param2 = (neighbors[i].i ? LIQUID_INFINITY_MASK : 0x00); } - //infostream << "set node i=" <<(int)i<<" "<< PP(p0)<< " nc="<<new_node_content<< " p2="<<(int)n0.param2<< " nl="<<(int)new_node_level<<std::endl; + /* + infostream << "set node i=" <<(int)i<<" "<< PP(p0)<< " nc=" + <<new_node_content<< " p2="<<(int)n0.param2<< " nl=" + <<(int)new_node_level<<std::endl; + */ + n0.setContent(new_node_content); // Find out whether there is a suspect for this action std::string suspect; @@ -1886,7 +1916,8 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) if(!suspect.empty()){ // Blame suspect - RollbackScopeActor rollback_scope(m_gamedef->rollback(), suspect, true); + RollbackScopeActor rollback_scope(m_gamedef->rollback(), + suspect, true); // Get old node for rollback RollbackNode rollback_oldnode(this, p0, m_gamedef); // Set node @@ -1904,20 +1935,25 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) v3s16 blockpos = getNodeBlockPos(p0); MapBlock *block = getBlockNoCreateNoEx(blockpos); if(block != NULL) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; // If node emits light, MapBlock requires lighting update if(nodemgr->get(n0).light_source != 0) lighting_modified_blocks[block->getPos()] = block; } must_reflow.push_back(neighbors[i].p); } - /* //for better relax - if (changed) for (u16 ii = D_SELF + 1; ii < D_TOP; ++ii) { // only same level + /* //for better relax only same level + if (changed) for (u16 ii = D_SELF + 1; ii < D_TOP; ++ii) { if (!neighbors[ii].l) continue; must_reflow.push_back(p0 + dirs[ii]); }*/ } - //if (loopcount) infostream<<"Map::transformLiquids(): loopcount="<<loopcount<<" reflow="<<must_reflow.size()<<" queue="<< m_transforming_liquid.size()<<std::endl; + /* + if (loopcount) + infostream<<"Map::transformLiquids(): loopcount="<<loopcount + <<" reflow="<<must_reflow.size() + <<" queue="<< m_transforming_liquid.size()<<std::endl; + */ while (must_reflow.size() > 0) m_transforming_liquid.push_back(must_reflow.pop_front()); while (must_reflow_second.size() > 0) @@ -1925,11 +1961,12 @@ void Map::transformLiquidsFinite(core::map<v3s16, MapBlock*> & modified_blocks) updateLighting(lighting_modified_blocks, modified_blocks); } -void Map::transformLiquids(core::map<v3s16, MapBlock*> & modified_blocks) +void Map::transformLiquids(std::map<v3s16, MapBlock*> & modified_blocks) { - if (g_settings->getBool("liquid_finite")) return Map::transformLiquidsFinite(modified_blocks); - + if (g_settings->getBool("liquid_finite")) + return Map::transformLiquidsFinite(modified_blocks); + INodeDefManager *nodemgr = m_gamedef->ndef(); DSTACK(__FUNCTION_NAME); @@ -1945,7 +1982,7 @@ void Map::transformLiquids(core::map<v3s16, MapBlock*> & modified_blocks) UniqueQueue<v3s16> must_reflow; // List of MapBlocks that will require a lighting update (due to lava) - core::map<v3s16, MapBlock*> lighting_modified_blocks; + std::map<v3s16, MapBlock*> lighting_modified_blocks; while(m_transforming_liquid.size() != 0) { @@ -2165,7 +2202,7 @@ void Map::transformLiquids(core::map<v3s16, MapBlock*> & modified_blocks) v3s16 blockpos = getNodeBlockPos(p0); MapBlock *block = getBlockNoCreateNoEx(blockpos); if(block != NULL) { - modified_blocks.insert(blockpos, block); + modified_blocks[blockpos] = block; // If node emits light, MapBlock requires lighting update if(nodemgr->get(n0).light_source != 0) lighting_modified_blocks[block->getPos()] = block; @@ -2460,19 +2497,15 @@ bool ServerMap::initBlockMake(BlockMakeData *data, v3s16 blockpos) bool enable_mapgen_debug_info = m_emerge->mapgen_debug_info; EMERGE_DBG_OUT("initBlockMake(): " PP(blockpos) " - " PP(blockpos)); - //s16 chunksize = 3; - //v3s16 chunk_offset(-1,-1,-1); - //s16 chunksize = 4; - //v3s16 chunk_offset(-1,-1,-1); - s16 chunksize = 5; - v3s16 chunk_offset(-2,-2,-2); + s16 chunksize = m_mgparams->chunksize; + s16 coffset = -chunksize / 2; + v3s16 chunk_offset(coffset, coffset, coffset); v3s16 blockpos_div = getContainerPos(blockpos - chunk_offset, chunksize); v3s16 blockpos_min = blockpos_div * chunksize; v3s16 blockpos_max = blockpos_div * chunksize + v3s16(1,1,1)*(chunksize-1); blockpos_min += chunk_offset; blockpos_max += chunk_offset; - //v3s16 extra_borders(1,1,1); v3s16 extra_borders(1,1,1); // Do nothing if not inside limits (+-1 because of neighbors) @@ -2571,7 +2604,7 @@ bool ServerMap::initBlockMake(BlockMakeData *data, v3s16 blockpos) } MapBlock* ServerMap::finishBlockMake(BlockMakeData *data, - core::map<v3s16, MapBlock*> &changed_blocks) + std::map<v3s16, MapBlock*> &changed_blocks) { v3s16 blockpos_min = data->blockpos_min; v3s16 blockpos_max = data->blockpos_max; @@ -2676,10 +2709,10 @@ MapBlock* ServerMap::finishBlockMake(BlockMakeData *data, /* Go through changed blocks */ - for(core::map<v3s16, MapBlock*>::Iterator i = changed_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map<v3s16, MapBlock*>::iterator i = changed_blocks.begin(); + i != changed_blocks.end(); ++i) { - MapBlock *block = i.getNode()->getValue(); + MapBlock *block = i->second; assert(block); /* Update day/night difference cache of the MapBlocks @@ -2797,7 +2830,7 @@ ServerMapSector * ServerMap::createSector(v2s16 p2d) /* Insert to container */ - m_sectors.insert(p2d, sector); + m_sectors[p2d] = sector; return sector; } @@ -2808,7 +2841,7 @@ ServerMapSector * ServerMap::createSector(v2s16 p2d) */ MapBlock * ServerMap::generateBlock( v3s16 p, - core::map<v3s16, MapBlock*> &modified_blocks + std::map<v3s16, MapBlock*> &modified_blocks ) { DSTACKF("%s: p=(%d,%d,%d)", __FUNCTION_NAME, p.X, p.Y, p.Z); @@ -3008,7 +3041,7 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank) } /*if(allow_generate) { - core::map<v3s16, MapBlock*> modified_blocks; + std::map<v3s16, MapBlock*> modified_blocks; MapBlock *block = generateBlock(p, modified_blocks); if(block) { @@ -3017,11 +3050,11 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank) event.p = p; // Copy modified_blocks to event - for(core::map<v3s16, MapBlock*>::Iterator - i = modified_blocks.getIterator(); - i.atEnd()==false; i++) + for(std::map<v3s16, MapBlock*>::iterator + i = modified_blocks.begin(); + i != modified_blocks.end(); ++i) { - event.modified_blocks.insert(i.getNode()->getKey(), false); + event.modified_blocks.insert(i->first); } // Queue event @@ -3262,10 +3295,10 @@ void ServerMap::save(ModifiedState save_level) // Don't do anything with sqlite unless something is really saved bool save_started = false; - core::map<v2s16, MapSector*>::Iterator i = m_sectors.getIterator(); - for(; i.atEnd() == false; i++) + for(std::map<v2s16, MapSector*>::iterator i = m_sectors.begin(); + i != m_sectors.end(); ++i) { - ServerMapSector *sector = (ServerMapSector*)i.getNode()->getValue(); + ServerMapSector *sector = (ServerMapSector*)i->second; assert(sector->getId() == MAPSECTOR_SERVER); if(sector->differs_from_disk || save_level == MOD_STATE_CLEAN) @@ -3273,11 +3306,11 @@ void ServerMap::save(ModifiedState save_level) saveSectorMeta(sector); sector_meta_count++; } - core::list<MapBlock*> blocks; + std::list<MapBlock*> blocks; sector->getBlocks(blocks); - core::list<MapBlock*>::Iterator j; - for(j=blocks.begin(); j!=blocks.end(); j++) + for(std::list<MapBlock*>::iterator j = blocks.begin(); + j != blocks.end(); ++j) { MapBlock *block = *j; @@ -3350,7 +3383,7 @@ v3s16 ServerMap::getIntegerAsBlock(sqlite3_int64 i) return v3s16(x,y,z); } -void ServerMap::listAllLoadableBlocks(core::list<v3s16> &dst) +void ServerMap::listAllLoadableBlocks(std::list<v3s16> &dst) { if(loadFromFolders()){ errorstream<<"Map::listAllLoadableBlocks(): Result will be missing " @@ -3487,7 +3520,7 @@ MapSector* ServerMap::loadSectorMeta(std::string sectordir, bool save_after_load <<" Continuing with a sector with no metadata." <<std::endl;*/ sector = new ServerMapSector(this, p2d, m_gamedef); - m_sectors.insert(p2d, sector); + m_sectors[p2d] = sector; } else { @@ -3987,9 +4020,9 @@ void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id) u8 flags = 0; MapBlock *block; v3s16 p(x,y,z); - core::map<v3s16, u8>::Node *n; + std::map<v3s16, u8>::iterator n; n = m_loaded_blocks.find(p); - if(n != NULL) + if(n != m_loaded_blocks.end()) continue; bool block_data_inexistent = false; @@ -4017,7 +4050,7 @@ void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id) if(block_data_inexistent) { flags |= VMANIP_BLOCK_DATA_INEXIST; - + VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1)); // Fill with VOXELFLAG_INEXISTENT for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++) @@ -4033,7 +4066,7 @@ void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id) flags |= VMANIP_BLOCK_CONTAINS_CIGNORE; }*/ - m_loaded_blocks.insert(p, flags); + m_loaded_blocks[p] = flags; } //infostream<<"emerge done"<<std::endl; @@ -4045,7 +4078,7 @@ void MapVoxelManipulator::emerge(VoxelArea a, s32 caller_id) run on background. */ void MapVoxelManipulator::blitBack - (core::map<v3s16, MapBlock*> & modified_blocks) + (std::map<v3s16, MapBlock*> & modified_blocks) { if(m_area.getExtent() == v3s16(0,0,0)) return; @@ -4156,9 +4189,9 @@ void ManualMapVoxelManipulator::initialEmerge( u8 flags = 0; MapBlock *block; v3s16 p(x,y,z); - core::map<v3s16, u8>::Node *n; + std::map<v3s16, u8>::iterator n; n = m_loaded_blocks.find(p); - if(n != NULL) + if(n != m_loaded_blocks.end()) continue; bool block_data_inexistent = false; @@ -4199,12 +4232,12 @@ void ManualMapVoxelManipulator::initialEmerge( flags |= VMANIP_BLOCK_CONTAINS_CIGNORE; }*/ - m_loaded_blocks.insert(p, flags); + m_loaded_blocks[p] = flags; } } void ManualMapVoxelManipulator::blitBackAll( - core::map<v3s16, MapBlock*> * modified_blocks) + std::map<v3s16, MapBlock*> * modified_blocks) { if(m_area.getExtent() == v3s16(0,0,0)) return; @@ -4212,37 +4245,22 @@ void ManualMapVoxelManipulator::blitBackAll( /* Copy data of all blocks */ - for(core::map<v3s16, u8>::Iterator - i = m_loaded_blocks.getIterator(); - i.atEnd() == false; i++) + for(std::map<v3s16, u8>::iterator + i = m_loaded_blocks.begin(); + i != m_loaded_blocks.end(); ++i) { - v3s16 p = i.getNode()->getKey(); - u8 flags = i.getNode()->getValue(); - - bool existed = !(flags & VMANIP_BLOCK_DATA_INEXIST); - if(existed == false) - { - // The Great Bug was found using this - /*infostream<<"ManualMapVoxelManipulator::blitBackAll: " - <<"Inexistent ("<<p.X<<","<<p.Y<<","<<p.Z<<")" - <<std::endl;*/ - continue; - } - + v3s16 p = i->first; MapBlock *block = m_map->getBlockNoCreateNoEx(p); - if(block == NULL) + bool existed = !(i->second & VMANIP_BLOCK_DATA_INEXIST); + if(existed == false) { - infostream<<"WARNING: "<<__FUNCTION_NAME - <<": got NULL block " - <<"("<<p.X<<","<<p.Y<<","<<p.Z<<")" - <<std::endl; continue; } block->copyFrom(*this); - + if(modified_blocks) - modified_blocks->insert(p, block); + (*modified_blocks)[p] = block; } } |