diff options
author | Elias Fleckenstein <eliasfleckenstein@web.de> | 2020-11-04 16:19:54 +0100 |
---|---|---|
committer | Elias Fleckenstein <eliasfleckenstein@web.de> | 2020-11-04 16:19:54 +0100 |
commit | ad148587dcf5244c2d2011dba339786c765c54c4 (patch) | |
tree | bdd914121cd326da2ed26679838878e3edffc841 /src/map.cpp | |
parent | 1145b05ea0bda87dc0827821385810eced08f774 (diff) | |
download | dragonfireclient-ad148587dcf5244c2d2011dba339786c765c54c4.tar.xz |
Make Lint Happy
Diffstat (limited to 'src/map.cpp')
-rw-r--r-- | src/map.cpp | 1044 |
1 files changed, 529 insertions, 515 deletions
diff --git a/src/map.cpp b/src/map.cpp index b9ab7c066..fc284dcee 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -57,15 +57,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "database/database-postgresql.h" #endif - /* Map */ -Map::Map(std::ostream &dout, IGameDef *gamedef): - m_dout(dout), - m_gamedef(gamedef), - m_nodedef(gamedef->ndef()) +Map::Map(std::ostream &dout, IGameDef *gamedef) : + m_dout(dout), m_gamedef(gamedef), m_nodedef(gamedef->ndef()) { } @@ -96,14 +93,14 @@ void Map::dispatchEvent(const MapEditEvent &event) } } -MapSector * Map::getSectorNoGenerateNoLock(v2s16 p) +MapSector *Map::getSectorNoGenerateNoLock(v2s16 p) { - if(m_sector_cache != NULL && p == m_sector_cache_p){ - MapSector * sector = m_sector_cache; + if (m_sector_cache != NULL && p == m_sector_cache_p) { + MapSector *sector = m_sector_cache; return sector; } - std::map<v2s16, MapSector*>::iterator n = m_sectors.find(p); + std::map<v2s16, MapSector *>::iterator n = m_sectors.find(p); if (n == m_sectors.end()) return NULL; @@ -117,25 +114,25 @@ MapSector * Map::getSectorNoGenerateNoLock(v2s16 p) return sector; } -MapSector * Map::getSectorNoGenerate(v2s16 p) +MapSector *Map::getSectorNoGenerate(v2s16 p) { return getSectorNoGenerateNoLock(p); } -MapBlock * Map::getBlockNoCreateNoEx(v3s16 p3d) +MapBlock *Map::getBlockNoCreateNoEx(v3s16 p3d) { v2s16 p2d(p3d.X, p3d.Z); - MapSector * sector = getSectorNoGenerate(p2d); - if(sector == NULL) + MapSector *sector = getSectorNoGenerate(p2d); + if (sector == NULL) return NULL; MapBlock *block = sector->getBlockNoCreateNoEx(p3d.Y); return block; } -MapBlock * Map::getBlockNoCreate(v3s16 p3d) +MapBlock *Map::getBlockNoCreate(v3s16 p3d) { MapBlock *block = getBlockNoCreateNoEx(p3d); - if(block == NULL) + if (block == NULL) throw InvalidPositionException(); return block; } @@ -165,7 +162,7 @@ MapNode Map::getNode(v3s16 p, bool *is_valid_position) return {CONTENT_IGNORE}; } - v3s16 relpos = p - blockpos*MAP_BLOCKSIZE; + v3s16 relpos = p - blockpos * MAP_BLOCKSIZE; bool is_valid_p; MapNode node = block->getNodeNoCheck(relpos, &is_valid_p); if (is_valid_position != NULL) @@ -174,26 +171,27 @@ MapNode Map::getNode(v3s16 p, bool *is_valid_position) } // throws InvalidPositionException if not found -void Map::setNode(v3s16 p, MapNode & n) +void Map::setNode(v3s16 p, MapNode &n) { v3s16 blockpos = getNodeBlockPos(p); MapBlock *block = getBlockNoCreate(blockpos); - v3s16 relpos = p - blockpos*MAP_BLOCKSIZE; + v3s16 relpos = p - blockpos * MAP_BLOCKSIZE; // Never allow placing CONTENT_IGNORE, it causes problems - if(n.getContent() == CONTENT_IGNORE){ + if (n.getContent() == CONTENT_IGNORE) { bool temp_bool; - errorstream<<"Map::setNode(): Not allowing to place CONTENT_IGNORE" - <<" while trying to replace \"" - <<m_nodedef->get(block->getNodeNoCheck(relpos, &temp_bool)).name - <<"\" at "<<PP(p)<<" (block "<<PP(blockpos)<<")"<<std::endl; + errorstream << "Map::setNode(): Not allowing to place CONTENT_IGNORE" + << " while trying to replace \"" + << m_nodedef->get(block->getNodeNoCheck(relpos, &temp_bool)) + .name + << "\" at " << PP(p) << " (block " << PP(blockpos) << ")" + << std::endl; return; } block->setNodeNoCheck(relpos, n); } void Map::addNodeAndUpdate(v3s16 p, MapNode n, - std::map<v3s16, MapBlock*> &modified_blocks, - bool remove_metadata) + std::map<v3s16, MapBlock *> &modified_blocks, bool remove_metadata) { // Collect old node for rollback RollbackNode rollback_oldnode(this, p, m_gamedef); @@ -213,7 +211,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, setNode(p, n); // Update lighting - std::vector<std::pair<v3s16, MapNode> > oldnodes; + std::vector<std::pair<v3s16, MapNode>> oldnodes; oldnodes.emplace_back(p, oldnode); voxalgo::update_lighting_nodes(this, oldnodes, modified_blocks); @@ -222,8 +220,7 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, } // Report for rollback - if(m_gamedef->rollback()) - { + if (m_gamedef->rollback()) { RollbackNode rollback_newnode(this, p, m_gamedef); RollbackAction action; action.setSetNode(p, rollback_oldnode, rollback_newnode); @@ -240,15 +237,13 @@ void Map::addNodeAndUpdate(v3s16 p, MapNode n, bool is_valid_position; MapNode n2 = getNode(p2, &is_valid_position); - if(is_valid_position && - (m_nodedef->get(n2).isLiquid() || - n2.getContent() == CONTENT_AIR)) + if (is_valid_position && (m_nodedef->get(n2).isLiquid() || + n2.getContent() == CONTENT_AIR)) m_transforming_liquid.push_back(p2); } } -void Map::removeNodeAndUpdate(v3s16 p, - std::map<v3s16, MapBlock*> &modified_blocks) +void Map::removeNodeAndUpdate(v3s16 p, std::map<v3s16, MapBlock *> &modified_blocks) { addNodeAndUpdate(p, MapNode(CONTENT_AIR), modified_blocks, true); } @@ -261,16 +256,15 @@ bool Map::addNodeWithEvent(v3s16 p, MapNode n, bool remove_metadata) event.n = n; bool succeeded = true; - try{ - std::map<v3s16, MapBlock*> modified_blocks; + try { + std::map<v3s16, MapBlock *> modified_blocks; addNodeAndUpdate(p, n, modified_blocks, remove_metadata); // Copy modified_blocks to event for (auto &modified_block : modified_blocks) { event.modified_blocks.insert(modified_block.first); } - } - catch(InvalidPositionException &e){ + } catch (InvalidPositionException &e) { succeeded = false; } @@ -286,16 +280,15 @@ bool Map::removeNodeWithEvent(v3s16 p) event.p = p; bool succeeded = true; - try{ - std::map<v3s16, MapBlock*> modified_blocks; + try { + std::map<v3s16, MapBlock *> modified_blocks; removeNodeAndUpdate(p, modified_blocks); // Copy modified_blocks to event for (auto &modified_block : modified_blocks) { event.modified_blocks.insert(modified_block.first); } - } - catch(InvalidPositionException &e){ + } catch (InvalidPositionException &e) { succeeded = false; } @@ -304,14 +297,14 @@ bool Map::removeNodeWithEvent(v3s16 p) return succeeded; } -struct TimeOrderedMapBlock { +struct TimeOrderedMapBlock +{ MapSector *sect; MapBlock *block; - TimeOrderedMapBlock(MapSector *sect, MapBlock *block) : - sect(sect), - block(block) - {} + TimeOrderedMapBlock(MapSector *sect, MapBlock *block) : sect(sect), block(block) + { + } bool operator<(const TimeOrderedMapBlock &b) const { @@ -350,14 +343,15 @@ void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, for (MapBlock *block : blocks) { block->incrementUsageTimer(dtime); - if (block->refGet() == 0 - && block->getUsageTimer() > unload_timeout) { + if (block->refGet() == 0 && + block->getUsageTimer() > unload_timeout) { v3s16 p = block->getPos(); // Save if modified - if (block->getModified() != MOD_STATE_CLEAN - && save_before_unloading) { - modprofiler.add(block->getModifiedReasonString(), 1); + if (block->getModified() != MOD_STATE_CLEAN && + save_before_unloading) { + modprofiler.add(block->getModifiedReasonString(), + 1); if (!saveBlock(block)) continue; saved_blocks_count++; @@ -395,8 +389,10 @@ void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, } block_count_all = mapblock_queue.size(); // Delete old blocks, and blocks over the limit from the memory - while (!mapblock_queue.empty() && (mapblock_queue.size() > max_loaded_blocks - || mapblock_queue.top().block->getUsageTimer() > unload_timeout)) { + while (!mapblock_queue.empty() && + (mapblock_queue.size() > max_loaded_blocks || + mapblock_queue.top().block->getUsageTimer() > + unload_timeout)) { TimeOrderedMapBlock b = mapblock_queue.top(); mapblock_queue.pop(); @@ -408,7 +404,8 @@ void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, v3s16 p = block->getPos(); // Save if modified - if (block->getModified() != MOD_STATE_CLEAN && save_before_unloading) { + if (block->getModified() != MOD_STATE_CLEAN && + save_before_unloading) { modprofiler.add(block->getModifiedReasonString(), 1); if (!saveBlock(block)) continue; @@ -436,18 +433,18 @@ void Map::timerUpdate(float dtime, float unload_timeout, u32 max_loaded_blocks, // Finally delete the empty sectors deleteSectors(sector_deletion_queue); - if(deleted_blocks_count != 0) - { + if (deleted_blocks_count != 0) { PrintInfo(infostream); // ServerMap/ClientMap: - infostream<<"Unloaded "<<deleted_blocks_count - <<" blocks from memory"; - if(save_before_unloading) - infostream<<", of which "<<saved_blocks_count<<" were written"; - infostream<<", "<<block_count_all<<" blocks in memory"; - infostream<<"."<<std::endl; - if(saved_blocks_count != 0){ + infostream << "Unloaded " << deleted_blocks_count + << " blocks from memory"; + if (save_before_unloading) + infostream << ", of which " << saved_blocks_count + << " were written"; + infostream << ", " << block_count_all << " blocks in memory"; + infostream << "." << std::endl; + if (saved_blocks_count != 0) { PrintInfo(infostream); // ServerMap/ClientMap: - infostream<<"Blocks modified by: "<<std::endl; + infostream << "Blocks modified by: " << std::endl; modprofiler.print(infostream); } } @@ -463,7 +460,7 @@ void Map::deleteSectors(std::vector<v2s16> §orList) for (v2s16 j : sectorList) { MapSector *sector = m_sectors[j]; // If sector is in sector cache, remove it from there - if(m_sector_cache == sector) + if (m_sector_cache == sector) m_sector_cache = NULL; // Remove from map and delete m_sectors.erase(j); @@ -473,60 +470,56 @@ void Map::deleteSectors(std::vector<v2s16> §orList) void Map::PrintInfo(std::ostream &out) { - out<<"Map: "; + out << "Map: "; } #define WATER_DROP_BOOST 4 const static v3s16 liquid_6dirs[6] = { - // order: upper before same level before lower - v3s16( 0, 1, 0), - v3s16( 0, 0, 1), - v3s16( 1, 0, 0), - v3s16( 0, 0,-1), - v3s16(-1, 0, 0), - v3s16( 0,-1, 0) -}; + // order: upper before same level before lower + v3s16(0, 1, 0), v3s16(0, 0, 1), v3s16(1, 0, 0), v3s16(0, 0, -1), + v3s16(-1, 0, 0), v3s16(0, -1, 0)}; -enum NeighborType : u8 { +enum NeighborType : u8 +{ NEIGHBOR_UPPER, NEIGHBOR_SAME_LEVEL, NEIGHBOR_LOWER }; -struct NodeNeighbor { +struct NodeNeighbor +{ MapNode n; NeighborType t; v3s16 p; - NodeNeighbor() - : n(CONTENT_AIR), t(NEIGHBOR_SAME_LEVEL) - { } + NodeNeighbor() : n(CONTENT_AIR), t(NEIGHBOR_SAME_LEVEL) {} - NodeNeighbor(const MapNode &node, NeighborType n_type, const v3s16 &pos) - : n(node), - t(n_type), - p(pos) - { } + NodeNeighbor(const MapNode &node, NeighborType n_type, const v3s16 &pos) : + n(node), t(n_type), p(pos) + { + } }; -void Map::transforming_liquid_add(v3s16 p) { - m_transforming_liquid.push_back(p); +void Map::transforming_liquid_add(v3s16 p) +{ + m_transforming_liquid.push_back(p); } -void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, - ServerEnvironment *env) +void Map::transformLiquids( + std::map<v3s16, MapBlock *> &modified_blocks, ServerEnvironment *env) { u32 loopcount = 0; u32 initial_size = m_transforming_liquid.size(); /*if(initial_size != 0) - infostream<<"transformLiquids(): initial_size="<<initial_size<<std::endl;*/ + infostream<<"transformLiquids(): + initial_size="<<initial_size<<std::endl;*/ // list of nodes that due to viscosity have not reached their max level height std::deque<v3s16> must_reflow; - std::vector<std::pair<v3s16, MapNode> > changed_nodes; + std::vector<std::pair<v3s16, MapNode>> changed_nodes; u32 liquid_loop_max = g_settings->getS32("liquid_loop_max"); u32 loop_max = liquid_loop_max; @@ -548,8 +541,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, loop_max *= m_transforming_liquid_loop_count_multiplier; #endif - 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 >= loop_max) break; @@ -576,22 +568,22 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, const ContentFeatures &cf = m_nodedef->get(n0); LiquidType liquid_type = cf.liquid_type; switch (liquid_type) { - case LIQUID_SOURCE: - liquid_level = LIQUID_LEVEL_SOURCE; - liquid_kind = cf.liquid_alternative_flowing_id; - break; - case LIQUID_FLOWING: - liquid_level = (n0.param2 & LIQUID_LEVEL_MASK); - liquid_kind = n0.getContent(); - break; - case LIQUID_NONE: - // if this node is 'floodable', it *could* be transformed - // into a liquid, otherwise, continue with the next node. - if (!cf.floodable) - continue; - floodable_node = n0.getContent(); - liquid_kind = CONTENT_AIR; - break; + case LIQUID_SOURCE: + liquid_level = LIQUID_LEVEL_SOURCE; + liquid_kind = cf.liquid_alternative_flowing_id; + break; + case LIQUID_FLOWING: + liquid_level = (n0.param2 & LIQUID_LEVEL_MASK); + liquid_kind = n0.getContent(); + break; + case LIQUID_NONE: + // if this node is 'floodable', it *could* be transformed + // into a liquid, otherwise, continue with the next node. + if (!cf.floodable) + continue; + floodable_node = n0.getContent(); + liquid_kind = CONTENT_AIR; + break; } /* @@ -603,78 +595,88 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, int num_flows = 0; NodeNeighbor airs[6]; // surrounding air int num_airs = 0; - NodeNeighbor neutrals[6]; // nodes that are solid or another kind of liquid + NodeNeighbor neutrals[6]; // nodes that are solid or another kind of + // liquid int num_neutrals = 0; bool flowing_down = false; bool ignored_sources = false; for (u16 i = 0; i < 6; i++) { NeighborType nt = NEIGHBOR_SAME_LEVEL; switch (i) { - case 0: - nt = NEIGHBOR_UPPER; - break; - case 5: - nt = NEIGHBOR_LOWER; - break; - default: - break; + case 0: + nt = NEIGHBOR_UPPER; + break; + case 5: + nt = NEIGHBOR_LOWER; + break; + default: + break; } v3s16 npos = p0 + liquid_6dirs[i]; NodeNeighbor nb(getNode(npos), nt, npos); const ContentFeatures &cfnb = m_nodedef->get(nb.n); switch (m_nodedef->get(nb.n.getContent()).liquid_type) { - case LIQUID_NONE: - if (cfnb.floodable) { - airs[num_airs++] = nb; - // if the current node is a water source the neighbor - // should be enqueded for transformation regardless of whether the - // current node changes or not. - if (nb.t != NEIGHBOR_UPPER && liquid_type != LIQUID_NONE) - m_transforming_liquid.push_back(npos); - // if the current node happens to be a flowing node, it will start to flow down here. + case LIQUID_NONE: + if (cfnb.floodable) { + airs[num_airs++] = nb; + // if the current node is a water source the + // neighbor should be enqueded for transformation + // regardless of whether the current node changes + // or not. + if (nb.t != NEIGHBOR_UPPER && + liquid_type != LIQUID_NONE) + m_transforming_liquid.push_back(npos); + // if the current node happens to be a flowing + // node, it will start to flow down here. + if (nb.t == NEIGHBOR_LOWER) + flowing_down = true; + } else { + neutrals[num_neutrals++] = nb; + if (nb.n.getContent() == CONTENT_IGNORE) { + // If node below is ignore prevent water + // from spreading outwards and otherwise + // prevent from flowing away as ignore + // node might be the source if (nb.t == NEIGHBOR_LOWER) flowing_down = true; - } else { - neutrals[num_neutrals++] = nb; - if (nb.n.getContent() == CONTENT_IGNORE) { - // If node below is ignore prevent water from - // spreading outwards and otherwise prevent from - // flowing away as ignore node might be the source - if (nb.t == NEIGHBOR_LOWER) - flowing_down = true; - else - ignored_sources = true; - } + else + ignored_sources = true; } - break; - case LIQUID_SOURCE: - // if this node is not (yet) of a liquid type, choose the first liquid type we encounter + } + break; + case LIQUID_SOURCE: + // if this node is not (yet) of a liquid type, choose the + // first liquid type we encounter + if (liquid_kind == CONTENT_AIR) + liquid_kind = cfnb.liquid_alternative_flowing_id; + if (cfnb.liquid_alternative_flowing_id != liquid_kind) { + neutrals[num_neutrals++] = nb; + } else { + // Do not count bottom source, it will screw + // things up + if (nt != NEIGHBOR_LOWER) + sources[num_sources++] = nb; + } + break; + case LIQUID_FLOWING: + if (nb.t != NEIGHBOR_SAME_LEVEL || + (nb.n.param2 & LIQUID_FLOW_DOWN_MASK) != + LIQUID_FLOW_DOWN_MASK) { + // if this node is not (yet) of a liquid type, + // choose the first liquid type we encounter but + // exclude falling liquids on the same level, they + // cannot flow here anyway if (liquid_kind == CONTENT_AIR) liquid_kind = cfnb.liquid_alternative_flowing_id; - if (cfnb.liquid_alternative_flowing_id != liquid_kind) { - neutrals[num_neutrals++] = nb; - } else { - // Do not count bottom source, it will screw things up - if(nt != NEIGHBOR_LOWER) - sources[num_sources++] = nb; - } - break; - case LIQUID_FLOWING: - if (nb.t != NEIGHBOR_SAME_LEVEL || - (nb.n.param2 & LIQUID_FLOW_DOWN_MASK) != LIQUID_FLOW_DOWN_MASK) { - // if this node is not (yet) of a liquid type, choose the first liquid type we encounter - // but exclude falling liquids on the same level, they cannot flow here anyway - if (liquid_kind == CONTENT_AIR) - liquid_kind = cfnb.liquid_alternative_flowing_id; - } - if (cfnb.liquid_alternative_flowing_id != liquid_kind) { - neutrals[num_neutrals++] = nb; - } else { - flows[num_flows++] = nb; - if (nb.t == NEIGHBOR_LOWER) - flowing_down = true; - } - break; + } + if (cfnb.liquid_alternative_flowing_id != liquid_kind) { + neutrals[num_neutrals++] = nb; + } else { + flows[num_flows++] = nb; + if (nb.t == NEIGHBOR_LOWER) + flowing_down = true; + } + break; } } @@ -689,11 +691,15 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, if (range > LIQUID_LEVEL_MAX + 1) range = LIQUID_LEVEL_MAX + 1; - if ((num_sources >= 2 && m_nodedef->get(liquid_kind).liquid_renewable) || liquid_type == LIQUID_SOURCE) { - // liquid_kind will be set to either the flowing alternative of the node (if it's a liquid) - // or the flowing alternative of the first of the surrounding sources (if it's air), so - // it's perfectly safe to use liquid_kind here to determine the new node content. - new_node_content = m_nodedef->get(liquid_kind).liquid_alternative_source_id; + if ((num_sources >= 2 && m_nodedef->get(liquid_kind).liquid_renewable) || + liquid_type == LIQUID_SOURCE) { + // liquid_kind will be set to either the flowing alternative of + // the node (if it's a liquid) or the flowing alternative of the + // first of the surrounding sources (if it's air), so it's + // perfectly safe to use liquid_kind here to determine the new + // node content. + new_node_content = m_nodedef->get(liquid_kind) + .liquid_alternative_source_id; } else if (num_sources >= 1 && sources[0].t != NEIGHBOR_LOWER) { // liquid_kind is set properly, see above max_node_level = new_node_level = LIQUID_LEVEL_MAX; @@ -707,26 +713,34 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, new_node_level = liquid_level; new_node_content = liquid_kind; } else { - // no surrounding sources, so get the maximum level that can flow into this node + // no surrounding sources, so get the maximum level that can flow + // into this node for (u16 i = 0; i < num_flows; i++) { - u8 nb_liquid_level = (flows[i].n.param2 & LIQUID_LEVEL_MASK); + u8 nb_liquid_level = + (flows[i].n.param2 & LIQUID_LEVEL_MASK); switch (flows[i].t) { - case NEIGHBOR_UPPER: - if (nb_liquid_level + WATER_DROP_BOOST > max_node_level) { - max_node_level = LIQUID_LEVEL_MAX; - if (nb_liquid_level + WATER_DROP_BOOST < LIQUID_LEVEL_MAX) - max_node_level = nb_liquid_level + WATER_DROP_BOOST; - } else if (nb_liquid_level > max_node_level) { - max_node_level = nb_liquid_level; - } - break; - case NEIGHBOR_LOWER: - break; - case NEIGHBOR_SAME_LEVEL: - if ((flows[i].n.param2 & LIQUID_FLOW_DOWN_MASK) != LIQUID_FLOW_DOWN_MASK && - nb_liquid_level > 0 && nb_liquid_level - 1 > max_node_level) - max_node_level = nb_liquid_level - 1; - break; + case NEIGHBOR_UPPER: + if (nb_liquid_level + WATER_DROP_BOOST > + max_node_level) { + max_node_level = LIQUID_LEVEL_MAX; + if (nb_liquid_level + WATER_DROP_BOOST < + LIQUID_LEVEL_MAX) + max_node_level = nb_liquid_level + + WATER_DROP_BOOST; + } else if (nb_liquid_level > max_node_level) { + max_node_level = nb_liquid_level; + } + break; + case NEIGHBOR_LOWER: + break; + case NEIGHBOR_SAME_LEVEL: + if ((flows[i].n.param2 & LIQUID_FLOW_DOWN_MASK) != + LIQUID_FLOW_DOWN_MASK && + nb_liquid_level > 0 && + nb_liquid_level - 1 > + max_node_level) + max_node_level = nb_liquid_level - 1; + break; } } @@ -736,7 +750,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, // must be at least 1 in absolute value s8 level_inc = max_node_level - liquid_level; if (level_inc < -viscosity || level_inc > viscosity) - new_node_level = liquid_level + level_inc/viscosity; + new_node_level = liquid_level + + level_inc / viscosity; else if (level_inc < 0) new_node_level = liquid_level - 1; else if (level_inc > 0) @@ -751,28 +766,32 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, new_node_content = liquid_kind; else new_node_content = floodable_node; - } /* - 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() && - (m_nodedef->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))) + (m_nodedef->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))) continue; - /* update the current node */ MapNode n00 = n0; - //bool flow_down_enabled = (flowing_down && ((n0.param2 & LIQUID_FLOW_DOWN_MASK) != LIQUID_FLOW_DOWN_MASK)); + // bool flow_down_enabled = (flowing_down && ((n0.param2 & + // LIQUID_FLOW_DOWN_MASK) != LIQUID_FLOW_DOWN_MASK)); if (m_nodedef->get(new_node_content).liquid_type == LIQUID_FLOWING) { // set level to last 3 bits, flowing down bit to 4th bit - n0.param2 = (flowing_down ? LIQUID_FLOW_DOWN_MASK : 0x00) | (new_node_level & LIQUID_LEVEL_MASK); + n0.param2 = (flowing_down ? LIQUID_FLOW_DOWN_MASK : 0x00) | + (new_node_level & LIQUID_LEVEL_MASK); } else { // set the liquid level and flow bits to 0 n0.param2 &= ~(LIQUID_LEVEL_MASK | LIQUID_FLOW_DOWN_MASK); @@ -798,7 +817,8 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, if (m_gamedef->rollback() && !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 @@ -816,7 +836,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, v3s16 blockpos = getNodeBlockPos(p0); MapBlock *block = getBlockNoCreateNoEx(blockpos); if (block != NULL) { - modified_blocks[blockpos] = block; + modified_blocks[blockpos] = block; changed_nodes.emplace_back(p0, n00); } @@ -824,31 +844,31 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, enqueue neighbors for update if neccessary */ switch (m_nodedef->get(n0.getContent()).liquid_type) { - case LIQUID_SOURCE: - case LIQUID_FLOWING: - // make sure source flows into all neighboring nodes - for (u16 i = 0; i < num_flows; i++) - if (flows[i].t != NEIGHBOR_UPPER) - m_transforming_liquid.push_back(flows[i].p); - for (u16 i = 0; i < num_airs; i++) - if (airs[i].t != NEIGHBOR_UPPER) - m_transforming_liquid.push_back(airs[i].p); - break; - case LIQUID_NONE: - // this flow has turned to air; neighboring flows might need to do the same - for (u16 i = 0; i < num_flows; i++) + case LIQUID_SOURCE: + case LIQUID_FLOWING: + // make sure source flows into all neighboring nodes + for (u16 i = 0; i < num_flows; i++) + if (flows[i].t != NEIGHBOR_UPPER) m_transforming_liquid.push_back(flows[i].p); - break; + for (u16 i = 0; i < num_airs; i++) + if (airs[i].t != NEIGHBOR_UPPER) + m_transforming_liquid.push_back(airs[i].p); + break; + case LIQUID_NONE: + // this flow has turned to air; neighboring flows might need to do + // the same + for (u16 i = 0; i < num_flows; i++) + m_transforming_liquid.push_back(flows[i].p); + break; } } - //infostream<<"Map::transformLiquids(): loopcount="<<loopcount<<std::endl; + // infostream<<"Map::transformLiquids(): loopcount="<<loopcount<<std::endl; for (auto &iter : must_reflow) m_transforming_liquid.push_back(iter); voxalgo::update_lighting_nodes(this, changed_nodes, modified_blocks); - /* ---------------------------------------------------------------------- * Manage the queue so that it does not grow indefinately */ @@ -857,7 +877,7 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, if (time_until_purge == 0) return; // Feature disabled - time_until_purge *= 1000; // seconds -> milliseconds + time_until_purge *= 1000; // seconds -> milliseconds u64 curr_time = porting::getTimeMs(); u32 prev_unprocessed = m_unprocessed_count; @@ -881,19 +901,20 @@ void Map::transformLiquids(std::map<v3s16, MapBlock*> &modified_blocks, * cannot keep up; dump the oldest blocks from the queue so that the queue * has liquid_loop_max items in it */ - if (m_queue_size_timer_started - && curr_time - m_inc_trending_up_start_time > time_until_purge - && m_unprocessed_count > liquid_loop_max) { + if (m_queue_size_timer_started && + curr_time - m_inc_trending_up_start_time > time_until_purge && + m_unprocessed_count > liquid_loop_max) { size_t dump_qty = m_unprocessed_count - liquid_loop_max; infostream << "transformLiquids(): DUMPING " << dump_qty - << " blocks from the queue" << std::endl; + << " blocks from the queue" << std::endl; while (dump_qty--) m_transforming_liquid.pop_front(); - m_queue_size_timer_started = false; // optimistically assume we can keep up now + m_queue_size_timer_started = + false; // optimistically assume we can keep up now m_unprocessed_count = m_transforming_liquid.size(); } } @@ -909,32 +930,35 @@ std::vector<v3s16> Map::findNodesWithMetadata(v3s16 p1, v3s16 p2) VoxelArea area(p1, p2); for (s16 z = bpmin.Z; z <= bpmax.Z; z++) - for (s16 y = bpmin.Y; y <= bpmax.Y; y++) - for (s16 x = bpmin.X; x <= bpmax.X; x++) { - v3s16 blockpos(x, y, z); - - MapBlock *block = getBlockNoCreateNoEx(blockpos); - if (!block) { - verbosestream << "Map::getNodeMetadata(): Need to emerge " - << PP(blockpos) << std::endl; - block = emergeBlock(blockpos, false); - } - if (!block) { - infostream << "WARNING: Map::getNodeMetadata(): Block not found" - << std::endl; - continue; - } + for (s16 y = bpmin.Y; y <= bpmax.Y; y++) + for (s16 x = bpmin.X; x <= bpmax.X; x++) { + v3s16 blockpos(x, y, z); + + MapBlock *block = getBlockNoCreateNoEx(blockpos); + if (!block) { + verbosestream << "Map::getNodeMetadata(): Need " + "to emerge " + << PP(blockpos) << std::endl; + block = emergeBlock(blockpos, false); + } + if (!block) { + infostream << "WARNING: Map::getNodeMetadata(): " + "Block not found" + << std::endl; + continue; + } - v3s16 p_base = blockpos * MAP_BLOCKSIZE; - std::vector<v3s16> keys = block->m_node_metadata.getAllKeys(); - for (size_t i = 0; i != keys.size(); i++) { - v3s16 p(keys[i] + p_base); - if (!area.contains(p)) - continue; + v3s16 p_base = blockpos * MAP_BLOCKSIZE; + std::vector<v3s16> keys = + block->m_node_metadata.getAllKeys(); + for (size_t i = 0; i != keys.size(); i++) { + v3s16 p(keys[i] + p_base); + if (!area.contains(p)) + continue; - positions_with_meta.push_back(p); - } - } + positions_with_meta.push_back(p); + } + } return positions_with_meta; } @@ -942,16 +966,15 @@ std::vector<v3s16> Map::findNodesWithMetadata(v3s16 p1, v3s16 p2) NodeMetadata *Map::getNodeMetadata(v3s16 p) { v3s16 blockpos = getNodeBlockPos(p); - v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE; + v3s16 p_rel = p - blockpos * MAP_BLOCKSIZE; MapBlock *block = getBlockNoCreateNoEx(blockpos); - if(!block){ - infostream<<"Map::getNodeMetadata(): Need to emerge " - <<PP(blockpos)<<std::endl; + if (!block) { + infostream << "Map::getNodeMetadata(): Need to emerge " << PP(blockpos) + << std::endl; block = emergeBlock(blockpos, false); } - if(!block){ - warningstream<<"Map::getNodeMetadata(): Block not found" - <<std::endl; + if (!block) { + warningstream << "Map::getNodeMetadata(): Block not found" << std::endl; return NULL; } NodeMetadata *meta = block->m_node_metadata.get(p_rel); @@ -961,16 +984,15 @@ NodeMetadata *Map::getNodeMetadata(v3s16 p) bool Map::setNodeMetadata(v3s16 p, NodeMetadata *meta) { v3s16 blockpos = getNodeBlockPos(p); - v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE; + v3s16 p_rel = p - blockpos * MAP_BLOCKSIZE; MapBlock *block = getBlockNoCreateNoEx(blockpos); - if(!block){ - infostream<<"Map::setNodeMetadata(): Need to emerge " - <<PP(blockpos)<<std::endl; + if (!block) { + infostream << "Map::setNodeMetadata(): Need to emerge " << PP(blockpos) + << std::endl; block = emergeBlock(blockpos, false); } - if(!block){ - warningstream<<"Map::setNodeMetadata(): Block not found" - <<std::endl; + if (!block) { + warningstream << "Map::setNodeMetadata(): Block not found" << std::endl; return false; } block->m_node_metadata.set(p_rel, meta); @@ -980,12 +1002,11 @@ bool Map::setNodeMetadata(v3s16 p, NodeMetadata *meta) void Map::removeNodeMetadata(v3s16 p) { v3s16 blockpos = getNodeBlockPos(p); - v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE; + v3s16 p_rel = p - blockpos * MAP_BLOCKSIZE; MapBlock *block = getBlockNoCreateNoEx(blockpos); - if(block == NULL) - { - warningstream<<"Map::removeNodeMetadata(): Block not found" - <<std::endl; + if (block == NULL) { + warningstream << "Map::removeNodeMetadata(): Block not found" + << std::endl; return; } block->m_node_metadata.remove(p_rel); @@ -994,16 +1015,15 @@ void Map::removeNodeMetadata(v3s16 p) NodeTimer Map::getNodeTimer(v3s16 p) { v3s16 blockpos = getNodeBlockPos(p); - v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE; + v3s16 p_rel = p - blockpos * MAP_BLOCKSIZE; MapBlock *block = getBlockNoCreateNoEx(blockpos); - if(!block){ - infostream<<"Map::getNodeTimer(): Need to emerge " - <<PP(blockpos)<<std::endl; + if (!block) { + infostream << "Map::getNodeTimer(): Need to emerge " << PP(blockpos) + << std::endl; block = emergeBlock(blockpos, false); } - if(!block){ - warningstream<<"Map::getNodeTimer(): Block not found" - <<std::endl; + if (!block) { + warningstream << "Map::getNodeTimer(): Block not found" << std::endl; return NodeTimer(); } NodeTimer t = block->m_node_timers.get(p_rel); @@ -1015,16 +1035,15 @@ void Map::setNodeTimer(const NodeTimer &t) { v3s16 p = t.position; v3s16 blockpos = getNodeBlockPos(p); - v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE; + v3s16 p_rel = p - blockpos * MAP_BLOCKSIZE; MapBlock *block = getBlockNoCreateNoEx(blockpos); - if(!block){ - infostream<<"Map::setNodeTimer(): Need to emerge " - <<PP(blockpos)<<std::endl; + if (!block) { + infostream << "Map::setNodeTimer(): Need to emerge " << PP(blockpos) + << std::endl; block = emergeBlock(blockpos, false); } - if(!block){ - warningstream<<"Map::setNodeTimer(): Block not found" - <<std::endl; + if (!block) { + warningstream << "Map::setNodeTimer(): Block not found" << std::endl; return; } NodeTimer nt(t.timeout, t.elapsed, p_rel); @@ -1034,19 +1053,17 @@ void Map::setNodeTimer(const NodeTimer &t) void Map::removeNodeTimer(v3s16 p) { v3s16 blockpos = getNodeBlockPos(p); - v3s16 p_rel = p - blockpos*MAP_BLOCKSIZE; + v3s16 p_rel = p - blockpos * MAP_BLOCKSIZE; MapBlock *block = getBlockNoCreateNoEx(blockpos); - if(block == NULL) - { - warningstream<<"Map::removeNodeTimer(): Block not found" - <<std::endl; + if (block == NULL) { + warningstream << "Map::removeNodeTimer(): Block not found" << std::endl; return; } block->m_node_timers.remove(p_rel); } bool Map::determineAdditionalOcclusionCheck(const v3s16 &pos_camera, - const core::aabbox3d<s16> &block_bounds, v3s16 &check) + const core::aabbox3d<s16> &block_bounds, v3s16 &check) { /* This functions determines the node inside the target block that is @@ -1058,9 +1075,9 @@ bool Map::determineAdditionalOcclusionCheck(const v3s16 &pos_camera, - the closest node is a corner, corners are checked anyway. - the camera is inside the target block, it will never be occluded. */ -#define CLOSEST_EDGE(pos, bounds, axis) \ - ((pos).axis <= (bounds).MinEdge.axis) ? (bounds).MinEdge.axis : \ - (bounds).MaxEdge.axis +#define CLOSEST_EDGE(pos, bounds, axis) \ + ((pos).axis <= (bounds).MinEdge.axis) ? (bounds).MinEdge.axis \ + : (bounds).MaxEdge.axis bool x_inside = (block_bounds.MinEdge.X <= pos_camera.X) && (pos_camera.X <= block_bounds.MaxEdge.X); @@ -1109,8 +1126,8 @@ bool Map::determineAdditionalOcclusionCheck(const v3s16 &pos_camera, return false; } -bool Map::isOccluded(const v3s16 &pos_camera, const v3s16 &pos_target, - float step, float stepfac, float offset, float end_offset, u32 needed_count) +bool Map::isOccluded(const v3s16 &pos_camera, const v3s16 &pos_target, float step, + float stepfac, float offset, float end_offset, u32 needed_count) { v3f direction = intToFloat(pos_target - pos_camera, BS); float distance = direction.getLength(); @@ -1129,8 +1146,7 @@ bool Map::isOccluded(const v3s16 &pos_camera, const v3s16 &pos_target, MapNode node = getNode(pos_node, &is_valid_position); - if (is_valid_position && - !m_nodedef->get(node).light_propagates) { + if (is_valid_position && !m_nodedef->get(node).light_propagates) { // Cannot see through light-blocking nodes --> occluded count++; if (count >= needed_count) @@ -1147,15 +1163,15 @@ bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes) // Overshoot a little for less flickering static const s16 bs2 = MAP_BLOCKSIZE / 2 + 1; static const v3s16 dir9[9] = { - v3s16( 0, 0, 0), - v3s16( 1, 1, 1) * bs2, - v3s16( 1, 1, -1) * bs2, - v3s16( 1, -1, 1) * bs2, - v3s16( 1, -1, -1) * bs2, - v3s16(-1, 1, 1) * bs2, - v3s16(-1, 1, -1) * bs2, - v3s16(-1, -1, 1) * bs2, - v3s16(-1, -1, -1) * bs2, + v3s16(0, 0, 0), + v3s16(1, 1, 1) * bs2, + v3s16(1, 1, -1) * bs2, + v3s16(1, -1, 1) * bs2, + v3s16(1, -1, -1) * bs2, + v3s16(-1, 1, 1) * bs2, + v3s16(-1, 1, -1) * bs2, + v3s16(-1, -1, 1) * bs2, + v3s16(-1, -1, -1) * bs2, }; v3s16 pos_blockcenter = block->getPosRelative() + (MAP_BLOCKSIZE / 2); @@ -1183,14 +1199,14 @@ bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes) v3s16 check; if (determineAdditionalOcclusionCheck(cam_pos_nodes, block->getBox(), check)) { // node is always on a side facing the camera, end_offset can be lower - if (!isOccluded(cam_pos_nodes, check, step, stepfac, start_offset, - -1.0f, needed_count)) + if (!isOccluded(cam_pos_nodes, check, step, stepfac, start_offset, -1.0f, + needed_count)) return false; } for (const v3s16 &dir : dir9) { if (!isOccluded(cam_pos_nodes, pos_blockcenter + dir, step, stepfac, - start_offset, end_offset, needed_count)) + start_offset, end_offset, needed_count)) return false; } return true; @@ -1199,13 +1215,13 @@ bool Map::isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes) /* ServerMap */ -ServerMap::ServerMap(const std::string &savedir, IGameDef *gamedef, - EmergeManager *emerge, MetricsBackend *mb): - Map(dout_server, gamedef), - settings_mgr(g_settings, savedir + DIR_DELIM + "map_meta.txt"), - m_emerge(emerge) +ServerMap::ServerMap(const std::string &savedir, IGameDef *gamedef, EmergeManager *emerge, + MetricsBackend *mb) : + Map(dout_server, gamedef), + settings_mgr(g_settings, savedir + DIR_DELIM + "map_meta.txt"), + m_emerge(emerge) { - verbosestream<<FUNCTION_NAME<<std::endl; + verbosestream << FUNCTION_NAME << std::endl; // Tell the EmergeManager about our MapSettingsManager emerge->map_settings_mgr = &settings_mgr; @@ -1226,35 +1242,40 @@ ServerMap::ServerMap(const std::string &savedir, IGameDef *gamedef, dbase = createDatabase(backend, savedir, conf); if (conf.exists("readonly_backend")) { std::string readonly_dir = savedir + DIR_DELIM + "readonly"; - dbase_ro = createDatabase(conf.get("readonly_backend"), readonly_dir, conf); + dbase_ro = createDatabase( + conf.get("readonly_backend"), readonly_dir, conf); } if (!conf.updateConfigFile(conf_path.c_str())) - errorstream << "ServerMap::ServerMap(): Failed to update world.mt!" << std::endl; + errorstream << "ServerMap::ServerMap(): Failed to update world.mt!" + << std::endl; m_savedir = savedir; m_map_saving_enabled = false; - m_save_time_counter = mb->addCounter("minetest_core_map_save_time", "Map save time (in nanoseconds)"); + m_save_time_counter = mb->addCounter( + "minetest_core_map_save_time", "Map save time (in nanoseconds)"); try { // If directory exists, check contents and load if possible if (fs::PathExists(m_savedir)) { // If directory is empty, it is safe to save into it. if (fs::GetDirListing(m_savedir).empty()) { - infostream<<"ServerMap: Empty save directory is valid." - <<std::endl; + infostream << "ServerMap: Empty save directory is valid." + << std::endl; m_map_saving_enabled = true; - } - else - { + } else { if (settings_mgr.loadMapMeta()) { infostream << "ServerMap: Metadata loaded from " - << savedir << std::endl; + << savedir << std::endl; } else { - infostream << "ServerMap: Metadata could not be loaded " - "from " << savedir << ", assuming valid save " - "directory." << std::endl; + infostream << "ServerMap: Metadata could not be " + "loaded " + "from " + << savedir + << ", assuming valid save " + "directory." + << std::endl; } m_map_saving_enabled = true; @@ -1263,37 +1284,33 @@ ServerMap::ServerMap(const std::string &savedir, IGameDef *gamedef, } } // If directory doesn't exist, it is safe to save to it - else{ + else { m_map_saving_enabled = true; } - } - catch(std::exception &e) - { - warningstream<<"ServerMap: Failed to load map from "<<savedir - <<", exception: "<<e.what()<<std::endl; - infostream<<"Please remove the map or fix it."<<std::endl; - warningstream<<"Map saving will be disabled."<<std::endl; + } catch (std::exception &e) { + warningstream << "ServerMap: Failed to load map from " << savedir + << ", exception: " << e.what() << std::endl; + infostream << "Please remove the map or fix it." << std::endl; + warningstream << "Map saving will be disabled." << std::endl; } } ServerMap::~ServerMap() { - verbosestream<<FUNCTION_NAME<<std::endl; + verbosestream << FUNCTION_NAME << std::endl; - try - { + try { if (m_map_saving_enabled) { // Save only changed parts save(MOD_STATE_WRITE_AT_UNLOAD); - infostream << "ServerMap: Saved map to " << m_savedir << std::endl; + infostream << "ServerMap: Saved map to " << m_savedir + << std::endl; } else { infostream << "ServerMap: Map not saved" << std::endl; } - } - catch(std::exception &e) - { - infostream<<"ServerMap: Failed to save map to "<<m_savedir - <<", exception: "<<e.what()<<std::endl; + } catch (std::exception &e) { + infostream << "ServerMap: Failed to save map to " << m_savedir + << ", exception: " << e.what() << std::endl; } /* @@ -1334,15 +1351,12 @@ s16 ServerMap::getWaterLevel() bool ServerMap::blockpos_over_mapgen_limit(v3s16 p) { - const s16 mapgen_limit_bp = rangelim( - getMapgenParams()->mapgen_limit, 0, MAX_MAP_GENERATION_LIMIT) / - MAP_BLOCKSIZE; - return p.X < -mapgen_limit_bp || - p.X > mapgen_limit_bp || - p.Y < -mapgen_limit_bp || - p.Y > mapgen_limit_bp || - p.Z < -mapgen_limit_bp || - p.Z > mapgen_limit_bp; + const s16 mapgen_limit_bp = rangelim(getMapgenParams()->mapgen_limit, 0, + MAX_MAP_GENERATION_LIMIT) / + MAP_BLOCKSIZE; + return p.X < -mapgen_limit_bp || p.X > mapgen_limit_bp || + p.Y < -mapgen_limit_bp || p.Y > mapgen_limit_bp || + p.Z < -mapgen_limit_bp || p.Z > mapgen_limit_bp; } bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) @@ -1373,26 +1387,26 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) Create the whole area of this and the neighboring blocks */ for (s16 x = full_bpmin.X; x <= full_bpmax.X; x++) - for (s16 z = full_bpmin.Z; z <= full_bpmax.Z; z++) { - v2s16 sectorpos(x, z); - // Sector metadata is loaded from disk if not already loaded. - MapSector *sector = createSector(sectorpos); - FATAL_ERROR_IF(sector == NULL, "createSector() failed"); - - for (s16 y = full_bpmin.Y; y <= full_bpmax.Y; y++) { - v3s16 p(x, y, z); - - MapBlock *block = emergeBlock(p, false); - if (block == NULL) { - block = createBlock(p); - - // Block gets sunlight if this is true. - // Refer to the map generator heuristics. - bool ug = m_emerge->isBlockUnderground(p); - block->setIsUnderground(ug); + for (s16 z = full_bpmin.Z; z <= full_bpmax.Z; z++) { + v2s16 sectorpos(x, z); + // Sector metadata is loaded from disk if not already loaded. + MapSector *sector = createSector(sectorpos); + FATAL_ERROR_IF(sector == NULL, "createSector() failed"); + + for (s16 y = full_bpmin.Y; y <= full_bpmax.Y; y++) { + v3s16 p(x, y, z); + + MapBlock *block = emergeBlock(p, false); + if (block == NULL) { + block = createBlock(p); + + // Block gets sunlight if this is true. + // Refer to the map generator heuristics. + bool ug = m_emerge->isBlockUnderground(p); + block->setIsUnderground(ug); + } } } - } /* Now we have a big empty area. @@ -1427,8 +1441,8 @@ bool ServerMap::initBlockMake(v3s16 blockpos, BlockMakeData *data) return true; } -void ServerMap::finishBlockMake(BlockMakeData *data, - std::map<v3s16, MapBlock*> *changed_blocks) +void ServerMap::finishBlockMake( + BlockMakeData *data, std::map<v3s16, MapBlock *> *changed_blocks) { v3s16 bpmin = data->blockpos_min; v3s16 bpmax = data->blockpos_max; @@ -1445,7 +1459,7 @@ void ServerMap::finishBlockMake(BlockMakeData *data, data->vmanip->blitBackAll(changed_blocks); EMERGE_DBG_OUT("finishBlockMake: changed_blocks.size()=" - << changed_blocks->size()); + << changed_blocks->size()); /* Copy transforming liquid information @@ -1466,28 +1480,28 @@ void ServerMap::finishBlockMake(BlockMakeData *data, /* Set block as modified */ - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_EXPIRE_DAYNIGHTDIFF); + block->raiseModified( + MOD_STATE_WRITE_NEEDED, MOD_REASON_EXPIRE_DAYNIGHTDIFF); } /* Set central blocks as generated */ for (s16 x = bpmin.X; x <= bpmax.X; x++) - for (s16 z = bpmin.Z; z <= bpmax.Z; z++) - for (s16 y = bpmin.Y; y <= bpmax.Y; y++) { - MapBlock *block = getBlockNoCreateNoEx(v3s16(x, y, z)); - if (!block) - continue; + for (s16 z = bpmin.Z; z <= bpmax.Z; z++) + for (s16 y = bpmin.Y; y <= bpmax.Y; y++) { + MapBlock *block = getBlockNoCreateNoEx(v3s16(x, y, z)); + if (!block) + continue; - block->setGenerated(true); - } + block->setGenerated(true); + } /* Save changed parts of map NOTE: Will be saved later. */ - //save(MOD_STATE_WRITE_AT_UNLOAD); + // save(MOD_STATE_WRITE_AT_UNLOAD); } MapSector *ServerMap::createSector(v2s16 p2d) @@ -1503,11 +1517,10 @@ MapSector *ServerMap::createSector(v2s16 p2d) Do not create over max mapgen limit */ const s16 max_limit_bp = MAX_MAP_GENERATION_LIMIT / MAP_BLOCKSIZE; - if (p2d.X < -max_limit_bp || - p2d.X > max_limit_bp || - p2d.Y < -max_limit_bp || - p2d.Y > max_limit_bp) - throw InvalidPositionException("createSector(): pos. over max mapgen limit"); + if (p2d.X < -max_limit_bp || p2d.X > max_limit_bp || p2d.Y < -max_limit_bp || + p2d.Y > max_limit_bp) + throw InvalidPositionException( + "createSector(): pos. over max mapgen limit"); /* Generate blank sector @@ -1516,7 +1529,7 @@ MapSector *ServerMap::createSector(v2s16 p2d) sector = new MapSector(this, p2d, m_gamedef); // Sector position on map in nodes - //v2s16 nodepos2d = p2d * MAP_BLOCKSIZE; + // v2s16 nodepos2d = p2d * MAP_BLOCKSIZE; /* Insert to container @@ -1636,13 +1649,14 @@ MapBlock * ServerMap::generateBlock( } #endif -MapBlock * ServerMap::createBlock(v3s16 p) +MapBlock *ServerMap::createBlock(v3s16 p) { /* Do not create over max mapgen limit */ if (blockpos_over_max_limit(p)) - throw InvalidPositionException("createBlock(): pos. over max mapgen limit"); + throw InvalidPositionException( + "createBlock(): pos. over max mapgen limit"); v2s16 p2d(p.X, p.Z); s16 block_y = p.Y; @@ -1657,7 +1671,7 @@ MapBlock * ServerMap::createBlock(v3s16 p) try { sector = createSector(p2d); } catch (InvalidPositionException &e) { - infostream<<"createBlock: createSector() failed"<<std::endl; + infostream << "createBlock: createSector() failed" << std::endl; throw e; } @@ -1667,7 +1681,7 @@ MapBlock * ServerMap::createBlock(v3s16 p) MapBlock *block = sector->getBlockNoCreateNoEx(block_y); if (block) { - if(block->isDummy()) + if (block->isDummy()) block->unDummify(); return block; } @@ -1677,7 +1691,7 @@ MapBlock * ServerMap::createBlock(v3s16 p) return block; } -MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank) +MapBlock *ServerMap::emergeBlock(v3s16 p, bool create_blank) { { MapBlock *block = getBlockNoCreateNoEx(p); @@ -1687,7 +1701,7 @@ MapBlock * ServerMap::emergeBlock(v3s16 p, bool create_blank) { MapBlock *block = loadBlock(p); - if(block) + if (block) return block; } @@ -1772,15 +1786,15 @@ plan_b: s16 level = m_emerge->getGroundLevelAtPoint(p2d); return level; - //double level = base_rock_level_2d(m_seed, p2d) + AVERAGE_MUD_AMOUNT; - //return (s16)level; + // double level = base_rock_level_2d(m_seed, p2d) + AVERAGE_MUD_AMOUNT; + // return (s16)level; } void ServerMap::createDirs(const std::string &path) { if (!fs::CreateAllDirs(path)) { - m_dout<<"ServerMap: Failed to create directory " - <<"\""<<path<<"\""<<std::endl; + m_dout << "ServerMap: Failed to create directory " + << "\"" << path << "\"" << std::endl; throw BaseException("ServerMap failed to create directory"); } } @@ -1788,15 +1802,15 @@ void ServerMap::createDirs(const std::string &path) void ServerMap::save(ModifiedState save_level) { if (!m_map_saving_enabled) { - warningstream<<"Not saving map, saving disabled."<<std::endl; + warningstream << "Not saving map, saving disabled." << std::endl; return; } u64 start_time = porting::getTimeNs(); - if(save_level == MOD_STATE_CLEAN) - infostream<<"ServerMap: Saving whole map, this can take time." - <<std::endl; + if (save_level == MOD_STATE_CLEAN) + infostream << "ServerMap: Saving whole map, this can take time." + << std::endl; if (m_map_metadata_changed || save_level == MOD_STATE_CLEAN) { if (settings_mgr.saveMapMeta()) @@ -1821,9 +1835,9 @@ void ServerMap::save(ModifiedState save_level) for (MapBlock *block : blocks) { block_count_all++; - if(block->getModified() >= (u32)save_level) { + if (block->getModified() >= (u32)save_level) { // Lazy beginSave() - if(!save_started) { + if (!save_started) { beginSave(); save_started = true; } @@ -1836,20 +1850,18 @@ void ServerMap::save(ModifiedState save_level) } } - if(save_started) + if (save_started) endSave(); /* Only print if something happened or saved whole map */ - if(save_level == MOD_STATE_CLEAN - || block_count != 0) { - infostream << "ServerMap: Written: " - << block_count << " blocks" - << ", " << block_count_all << " blocks in memory." - << std::endl; + if (save_level == MOD_STATE_CLEAN || block_count != 0) { + infostream << "ServerMap: Written: " << block_count << " blocks" + << ", " << block_count_all << " blocks in memory." + << std::endl; PrintInfo(infostream); // ServerMap/ClientMap: - infostream<<"Blocks modified by: "<<std::endl; + infostream << "Blocks modified by: " << std::endl; modprofiler.print(infostream); } @@ -1880,29 +1892,27 @@ void ServerMap::listAllLoadedBlocks(std::vector<v3s16> &dst) } MapDatabase *ServerMap::createDatabase( - const std::string &name, - const std::string &savedir, - Settings &conf) + const std::string &name, const std::string &savedir, Settings &conf) { if (name == "sqlite3") return new MapDatabaseSQLite3(savedir); if (name == "dummy") return new Database_Dummy(); - #if USE_LEVELDB +#if USE_LEVELDB if (name == "leveldb") return new Database_LevelDB(savedir); - #endif - #if USE_REDIS +#endif +#if USE_REDIS if (name == "redis") return new Database_Redis(conf); - #endif - #if USE_POSTGRESQL +#endif +#if USE_POSTGRESQL if (name == "postgresql") { std::string connect_string; conf.getNoEx("pgsql_connection", connect_string); return new MapDatabasePostgreSQL(connect_string); } - #endif +#endif throw BaseException(std::string("Database backend ") + name + " not supported."); } @@ -1928,8 +1938,8 @@ bool ServerMap::saveBlock(MapBlock *block, MapDatabase *db) // Dummy blocks are not written if (block->isDummy()) { - warningstream << "saveBlock: Not writing dummy block " - << PP(p3d) << std::endl; + warningstream << "saveBlock: Not writing dummy block " << PP(p3d) + << std::endl; return true; } @@ -1941,7 +1951,7 @@ bool ServerMap::saveBlock(MapBlock *block, MapDatabase *db) [1] data */ std::ostringstream o(std::ios_base::binary); - o.write((char*) &version, 1); + o.write((char *)&version, 1); block->serialize(o, version, true); bool ret = db->saveBlock(p3d, o.str()); @@ -1952,23 +1962,23 @@ bool ServerMap::saveBlock(MapBlock *block, MapDatabase *db) return ret; } -void ServerMap::loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool save_after_load) +void ServerMap::loadBlock( + std::string *blob, v3s16 p3d, MapSector *sector, bool save_after_load) { try { std::istringstream is(*blob, std::ios_base::binary); u8 version = SER_FMT_VER_INVALID; - is.read((char*)&version, 1); + is.read((char *)&version, 1); - if(is.fail()) + if (is.fail()) throw SerializationError("ServerMap::loadBlock(): Failed" - " to read MapBlock version"); + " to read MapBlock version"); MapBlock *block = NULL; bool created_new = false; block = sector->getBlockNoCreateNoEx(p3d.Y); - if(block == NULL) - { + if (block == NULL) { block = sector->createBlankBlockNoInsert(p3d.Y); created_new = true; } @@ -1987,33 +1997,31 @@ void ServerMap::loadBlock(std::string *blob, v3s16 p3d, MapSector *sector, bool Save blocks loaded in old format in new format */ - //if(version < SER_FMT_VER_HIGHEST_READ || save_after_load) + // if(version < SER_FMT_VER_HIGHEST_READ || save_after_load) // Only save if asked to; no need to update version - if(save_after_load) + if (save_after_load) saveBlock(block); // We just loaded it from, so it's up-to-date. block->resetModified(); - } - catch(SerializationError &e) - { - errorstream<<"Invalid block data in database" - <<" ("<<p3d.X<<","<<p3d.Y<<","<<p3d.Z<<")" - <<" (SerializationError): "<<e.what()<<std::endl; + } catch (SerializationError &e) { + errorstream << "Invalid block data in database" + << " (" << p3d.X << "," << p3d.Y << "," << p3d.Z << ")" + << " (SerializationError): " << e.what() << std::endl; // TODO: Block should be marked as invalid in memory so that it is // not touched but the game can run - if(g_settings->getBool("ignore_world_load_errors")){ - errorstream<<"Ignoring block load error. Duck and cover! " - <<"(ignore_world_load_errors)"<<std::endl; + if (g_settings->getBool("ignore_world_load_errors")) { + errorstream << "Ignoring block load error. Duck and cover! " + << "(ignore_world_load_errors)" << std::endl; } else { throw SerializationError("Invalid block data in database"); } } } -MapBlock* ServerMap::loadBlock(v3s16 blockpos) +MapBlock *ServerMap::loadBlock(v3s16 blockpos) { bool created_new = (getBlockNoCreateNoEx(blockpos) == NULL); @@ -2034,16 +2042,16 @@ MapBlock* ServerMap::loadBlock(v3s16 blockpos) MapBlock *block = getBlockNoCreateNoEx(blockpos); if (created_new && (block != NULL)) { - std::map<v3s16, MapBlock*> modified_blocks; + std::map<v3s16, MapBlock *> modified_blocks; // Fix lighting if necessary voxalgo::update_block_border_lighting(this, block, modified_blocks); if (!modified_blocks.empty()) { - //Modified lighting, send event + // Modified lighting, send event MapEditEvent event; event.type = MEET_OTHER; std::map<v3s16, MapBlock *>::iterator it; - for (it = modified_blocks.begin(); - it != modified_blocks.end(); ++it) + for (it = modified_blocks.begin(); it != modified_blocks.end(); + ++it) event.modified_blocks.insert(it->first); dispatchEvent(event); } @@ -2070,11 +2078,11 @@ bool ServerMap::deleteBlock(v3s16 blockpos) void ServerMap::PrintInfo(std::ostream &out) { - out<<"ServerMap: "; + out << "ServerMap: "; } -bool ServerMap::repairBlockLight(v3s16 blockpos, - std::map<v3s16, MapBlock *> *modified_blocks) +bool ServerMap::repairBlockLight( + v3s16 blockpos, std::map<v3s16, MapBlock *> *modified_blocks) { MapBlock *block = emergeBlock(blockpos, false); if (!block || !block->isGenerated()) @@ -2083,14 +2091,12 @@ bool ServerMap::repairBlockLight(v3s16 blockpos, return true; } -MMVManip::MMVManip(Map *map): - VoxelManipulator(), - m_map(map) +MMVManip::MMVManip(Map *map) : VoxelManipulator(), m_map(map) { } -void MMVManip::initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max, - bool load_if_inexistent) +void MMVManip::initialEmerge( + v3s16 blockpos_min, v3s16 blockpos_max, bool load_if_inexistent) { TimeTaker timer1("initialEmerge", &emerge_time); @@ -2098,84 +2104,92 @@ void MMVManip::initialEmerge(v3s16 blockpos_min, v3s16 blockpos_max, v3s16 p_min = blockpos_min; v3s16 p_max = blockpos_max; - VoxelArea block_area_nodes - (p_min*MAP_BLOCKSIZE, (p_max+1)*MAP_BLOCKSIZE-v3s16(1,1,1)); + VoxelArea block_area_nodes(p_min * MAP_BLOCKSIZE, + (p_max + 1) * MAP_BLOCKSIZE - v3s16(1, 1, 1)); - u32 size_MB = block_area_nodes.getVolume()*4/1000000; - if(size_MB >= 1) - { - infostream<<"initialEmerge: area: "; + u32 size_MB = block_area_nodes.getVolume() * 4 / 1000000; + if (size_MB >= 1) { + infostream << "initialEmerge: area: "; block_area_nodes.print(infostream); - infostream<<" ("<<size_MB<<"MB)"; - infostream<<std::endl; + infostream << " (" << size_MB << "MB)"; + infostream << std::endl; } addArea(block_area_nodes); - for(s32 z=p_min.Z; z<=p_max.Z; z++) - for(s32 y=p_min.Y; y<=p_max.Y; y++) - for(s32 x=p_min.X; x<=p_max.X; x++) - { - u8 flags = 0; - MapBlock *block; - v3s16 p(x,y,z); - std::map<v3s16, u8>::iterator n; - n = m_loaded_blocks.find(p); - if(n != m_loaded_blocks.end()) - continue; - - bool block_data_inexistent = false; - { - TimeTaker timer2("emerge load", &emerge_load_time); + for (s32 z = p_min.Z; z <= p_max.Z; z++) + for (s32 y = p_min.Y; y <= p_max.Y; y++) + for (s32 x = p_min.X; x <= p_max.X; x++) { + u8 flags = 0; + MapBlock *block; + v3s16 p(x, y, z); + std::map<v3s16, u8>::iterator n; + n = m_loaded_blocks.find(p); + if (n != m_loaded_blocks.end()) + continue; - block = m_map->getBlockNoCreateNoEx(p); - if (!block || block->isDummy()) - block_data_inexistent = true; - else - block->copyTo(*this); - } + bool block_data_inexistent = false; + { + TimeTaker timer2( + "emerge load", &emerge_load_time); + + block = m_map->getBlockNoCreateNoEx(p); + if (!block || block->isDummy()) + block_data_inexistent = true; + else + block->copyTo(*this); + } - if(block_data_inexistent) - { + if (block_data_inexistent) { - if (load_if_inexistent && !blockpos_over_max_limit(p)) { - ServerMap *svrmap = (ServerMap *)m_map; - block = svrmap->emergeBlock(p, false); - if (block == NULL) - block = svrmap->createBlock(p); - block->copyTo(*this); - } else { - flags |= VMANIP_BLOCK_DATA_INEXIST; - - /* - Mark area inexistent - */ - VoxelArea a(p*MAP_BLOCKSIZE, (p+1)*MAP_BLOCKSIZE-v3s16(1,1,1)); - // Fill with VOXELFLAG_NO_DATA - for(s32 z=a.MinEdge.Z; z<=a.MaxEdge.Z; z++) - for(s32 y=a.MinEdge.Y; y<=a.MaxEdge.Y; y++) - { - s32 i = m_area.index(a.MinEdge.X,y,z); - memset(&m_flags[i], VOXELFLAG_NO_DATA, MAP_BLOCKSIZE); + if (load_if_inexistent && + !blockpos_over_max_limit(p)) { + ServerMap *svrmap = (ServerMap *)m_map; + block = svrmap->emergeBlock(p, false); + if (block == NULL) + block = svrmap->createBlock(p); + block->copyTo(*this); + } else { + flags |= VMANIP_BLOCK_DATA_INEXIST; + + /* + Mark area inexistent + */ + VoxelArea a(p * MAP_BLOCKSIZE, + (p + 1) * MAP_BLOCKSIZE - + v3s16(1, 1, 1)); + // Fill with VOXELFLAG_NO_DATA + for (s32 z = a.MinEdge.Z; + z <= a.MaxEdge.Z; z++) + for (s32 y = a.MinEdge.Y; + y <= a.MaxEdge.Y; + y++) { + s32 i = m_area.index( + a.MinEdge.X, + y, z); + memset(&m_flags[i], + VOXELFLAG_NO_DATA, + MAP_BLOCKSIZE); + } + } } - } - } - /*else if (block->getNode(0, 0, 0).getContent() == CONTENT_IGNORE) - { - // Mark that block was loaded as blank - flags |= VMANIP_BLOCK_CONTAINS_CIGNORE; - }*/ + /*else if (block->getNode(0, 0, 0).getContent() == + CONTENT_IGNORE) + { + // Mark that block was loaded as blank + flags |= VMANIP_BLOCK_CONTAINS_CIGNORE; + }*/ - m_loaded_blocks[p] = flags; - } + m_loaded_blocks[p] = flags; + } m_is_dirty = false; } -void MMVManip::blitBackAll(std::map<v3s16, MapBlock*> *modified_blocks, - bool overwrite_generated) +void MMVManip::blitBackAll( + std::map<v3s16, MapBlock *> *modified_blocks, bool overwrite_generated) { - if(m_area.getExtent() == v3s16(0,0,0)) + if (m_area.getExtent() == v3s16(0, 0, 0)) return; /* @@ -2186,15 +2200,15 @@ void MMVManip::blitBackAll(std::map<v3s16, MapBlock*> *modified_blocks, MapBlock *block = m_map->getBlockNoCreateNoEx(p); bool existed = !(loaded_block.second & VMANIP_BLOCK_DATA_INEXIST); if (!existed || (block == NULL) || - (!overwrite_generated && block->isGenerated())) + (!overwrite_generated && block->isGenerated())) continue; block->copyFrom(*this); block->raiseModified(MOD_STATE_WRITE_NEEDED, MOD_REASON_VMANIP); - if(modified_blocks) + if (modified_blocks) (*modified_blocks)[p] = block; } } -//END +// END |