- /*
- Sector object stuff
- */
-
- // An y-wise container of changed blocks
- core::map<s16, MapBlock*> changed_blocks_sector;
-
- /*
- Check if any sector's objects can be placed now.
- If so, place them.
- */
- core::map<v3s16, u8> *objects = sector->getObjects();
- core::list<v3s16> objects_to_remove;
- for(core::map<v3s16, u8>::Iterator i = objects->getIterator();
- i.atEnd() == false; i++)
- {
- v3s16 p = i.getNode()->getKey();
- v2s16 p2d(p.X,p.Z);
- u8 d = i.getNode()->getValue();
-
- // Ground level point (user for stuff that is on ground)
- v3s16 gp = p;
- bool ground_found = true;
-
- // Search real ground level
- try{
- for(;;)
- {
- MapNode n = sector->getNode(gp);
-
- // If not air, go one up and continue to placing the tree
- if(n.d != CONTENT_AIR)
- {
- gp += v3s16(0,1,0);
- break;
- }
-
- // If air, go one down
- gp += v3s16(0,-1,0);
- }
- }catch(InvalidPositionException &e)
- {
- // Ground not found.
- ground_found = false;
- // This is most close to ground
- gp += v3s16(0,1,0);
- }
-
- try
- {
-
- if(d == SECTOR_OBJECT_TEST)
- {
- if(sector->isValidArea(p + v3s16(0,0,0),
- p + v3s16(0,0,0), &changed_blocks_sector))
- {
- MapNode n;
- n.d = CONTENT_TORCH;
- sector->setNode(p, n);
- objects_to_remove.push_back(p);
- }
- }
- else if(d == SECTOR_OBJECT_TREE_1)
- {
- if(ground_found == false)
- continue;
-
- v3s16 p_min = gp + v3s16(-1,0,-1);
- v3s16 p_max = gp + v3s16(1,5,1);
- if(sector->isValidArea(p_min, p_max,
- &changed_blocks_sector))
- {
- MapNode n;
- n.d = CONTENT_TREE;
- sector->setNode(gp+v3s16(0,0,0), n);
- sector->setNode(gp+v3s16(0,1,0), n);
- sector->setNode(gp+v3s16(0,2,0), n);
- sector->setNode(gp+v3s16(0,3,0), n);
-
- n.d = CONTENT_LEAVES;
-
- if(myrand()%4!=0) sector->setNode(gp+v3s16(0,5,0), n);
-
- if(myrand()%3!=0) sector->setNode(gp+v3s16(-1,5,0), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(1,5,0), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(0,5,-1), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(0,5,1), n);
- /*if(myrand()%3!=0) sector->setNode(gp+v3s16(1,5,1), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(-1,5,1), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(-1,5,-1), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(1,5,-1), n);*/
-
- sector->setNode(gp+v3s16(0,4,0), n);
-
- sector->setNode(gp+v3s16(-1,4,0), n);
- sector->setNode(gp+v3s16(1,4,0), n);
- sector->setNode(gp+v3s16(0,4,-1), n);
- sector->setNode(gp+v3s16(0,4,1), n);
- sector->setNode(gp+v3s16(1,4,1), n);
- sector->setNode(gp+v3s16(-1,4,1), n);
- sector->setNode(gp+v3s16(-1,4,-1), n);
- sector->setNode(gp+v3s16(1,4,-1), n);
-
- sector->setNode(gp+v3s16(-1,3,0), n);
- sector->setNode(gp+v3s16(1,3,0), n);
- sector->setNode(gp+v3s16(0,3,-1), n);
- sector->setNode(gp+v3s16(0,3,1), n);
- sector->setNode(gp+v3s16(1,3,1), n);
- sector->setNode(gp+v3s16(-1,3,1), n);
- sector->setNode(gp+v3s16(-1,3,-1), n);
- sector->setNode(gp+v3s16(1,3,-1), n);
-
- if(myrand()%3!=0) sector->setNode(gp+v3s16(-1,2,0), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(1,2,0), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(0,2,-1), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(0,2,1), n);
- /*if(myrand()%3!=0) sector->setNode(gp+v3s16(1,2,1), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(-1,2,1), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(-1,2,-1), n);
- if(myrand()%3!=0) sector->setNode(gp+v3s16(1,2,-1), n);*/
-
- // Objects are identified by wanted position
- objects_to_remove.push_back(p);
-
- // Lighting has to be recalculated for this one.
- sector->getBlocksInArea(p_min, p_max,
- lighting_invalidated_blocks);
- }
- }
- else if(d == SECTOR_OBJECT_BUSH_1)
- {
- if(ground_found == false)
- continue;
-
- if(sector->isValidArea(gp + v3s16(0,0,0),
- gp + v3s16(0,0,0), &changed_blocks_sector))
- {
- MapNode n;
- n.d = CONTENT_LEAVES;
- sector->setNode(gp+v3s16(0,0,0), n);
-
- // Objects are identified by wanted position
- objects_to_remove.push_back(p);
- }
- }
- else if(d == SECTOR_OBJECT_RAVINE)
- {
- s16 maxdepth = -20;
- v3s16 p_min = p + v3s16(-6,maxdepth,-6);
- v3s16 p_max = p + v3s16(6,6,6);
- if(sector->isValidArea(p_min, p_max,
- &changed_blocks_sector))
- {
- MapNode n;
- n.d = CONTENT_STONE;
- MapNode n2;
- n2.d = CONTENT_AIR;
- s16 depth = maxdepth + (myrand()%10);
- s16 z = 0;
- s16 minz = -6 - (-2);
- s16 maxz = 6 -1;
- for(s16 x=-6; x<=6; x++)
- {
- z += -1 + (myrand()%3);
- if(z < minz)
- z = minz;
- if(z > maxz)
- z = maxz;
- for(s16 y=depth+(myrand()%2); y<=6; y++)
- {
- /*std::cout<<"("<<p2.X<<","<<p2.Y<<","<<p2.Z<<")"
- <<std::endl;*/
- {
- v3s16 p2 = p + v3s16(x,y,z-2);
- //if(is_ground_content(sector->getNode(p2).d))
- if(content_features(sector->getNode(p2).d).walkable)
- sector->setNode(p2, n);
- }
- {
- v3s16 p2 = p + v3s16(x,y,z-1);
- if(content_features(sector->getNode(p2).d).walkable)
- sector->setNode(p2, n2);
- }
- {
- v3s16 p2 = p + v3s16(x,y,z+0);
- if(content_features(sector->getNode(p2).d).walkable)
- sector->setNode(p2, n2);
- }
- {
- v3s16 p2 = p + v3s16(x,y,z+1);
- if(content_features(sector->getNode(p2).d).walkable)
- sector->setNode(p2, n);
- }
-
- //if(sector->getNode(p+v3s16(x,y,z+1)).solidness()==2)
- //if(p.Y+y <= sector->getGroundHeight(p2d+v2s16(x,z-2))+0.5)
- }
- }
-
- objects_to_remove.push_back(p);
-
- // Lighting has to be recalculated for this one.
- sector->getBlocksInArea(p_min, p_max,
- lighting_invalidated_blocks);
- }
- }
- else
- {
- dstream<<"ServerMap::generateBlock(): "
- "Invalid heightmap object"
- <<std::endl;
- }
-
- }//try
- catch(InvalidPositionException &e)
- {
- dstream<<"WARNING: "<<__FUNCTION_NAME
- <<": while inserting object "<<(int)d
- <<" to ("<<p.X<<","<<p.Y<<","<<p.Z<<"):"
- <<" InvalidPositionException.what()="
- <<e.what()<<std::endl;
- // This is not too fatal and seems to happen sometimes.
- assert(0);
- }
- }
-
- for(core::list<v3s16>::Iterator i = objects_to_remove.begin();
- i != objects_to_remove.end(); i++)
- {
- objects->remove(*i);
- }
-
- /*
- Translate sector's changed blocks to global changed blocks
- */
-
- for(core::map<s16, MapBlock*>::Iterator
- i = changed_blocks_sector.getIterator();
- i.atEnd() == false; i++)
- {
- MapBlock *block = i.getNode()->getValue();
-
- changed_blocks.insert(block->getPos(), block);
- }
-