summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2011-11-13 03:17:42 +0200
committerPerttu Ahola <celeron55@gmail.com>2011-11-13 03:17:42 +0200
commit7372282a725cc9633eba3bb7bae8f4055e3235bb (patch)
treebedfbb269e943e2a18e523f2b4a46783992e8f59 /src
parentbc0e5c0063d2af107f81853c5ff555c57d1a9e3a (diff)
downloadminetest-7372282a725cc9633eba3bb7bae8f4055e3235bb.tar.gz
minetest-7372282a725cc9633eba3bb7bae8f4055e3235bb.tar.bz2
minetest-7372282a725cc9633eba3bb7bae8f4055e3235bb.zip
Better spawn position finding and checking
Diffstat (limited to 'src')
-rw-r--r--src/server.cpp48
1 files changed, 28 insertions, 20 deletions
diff --git a/src/server.cpp b/src/server.cpp
index 52e9dc879..330388727 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -4136,8 +4136,7 @@ v3f findSpawnPos(ServerMap &map)
{
//return v3f(50,50,50)*BS;
- v2s16 nodepos;
- s16 groundheight = 0;
+ v3s16 nodepos;
#if 0
nodepos = v2s16(0,0);
@@ -4150,13 +4149,11 @@ v3f findSpawnPos(ServerMap &map)
{
s32 range = 1 + i;
// We're going to try to throw the player to this position
- nodepos = v2s16(-range + (myrand()%(range*2)),
+ v2s16 nodepos2d = v2s16(-range + (myrand()%(range*2)),
-range + (myrand()%(range*2)));
- v2s16 sectorpos = getNodeSectorPos(nodepos);
- // Get sector (NOTE: Don't get because it's slow)
- //m_env.getMap().emergeSector(sectorpos);
+ //v2s16 sectorpos = getNodeSectorPos(nodepos2d);
// Get ground height at point (fallbacks to heightmap function)
- groundheight = map.findGroundLevel(nodepos);
+ s16 groundheight = map.findGroundLevel(nodepos2d);
// Don't go underwater
if(groundheight < WATER_LEVEL)
{
@@ -4169,22 +4166,33 @@ v3f findSpawnPos(ServerMap &map)
//infostream<<"-> Underwater"<<std::endl;
continue;
}
-
- // Found a good place
- //infostream<<"Searched through "<<i<<" places."<<std::endl;
- break;
+
+ nodepos = v3s16(nodepos2d.X, groundheight-2, nodepos2d.Y);
+ bool is_good = false;
+ s32 air_count = 0;
+ for(s32 i=0; i<10; i++){
+ v3s16 blockpos = getNodeBlockPos(nodepos);
+ map.emergeBlock(blockpos, true);
+ MapNode n = map.getNodeNoEx(nodepos);
+ if(n.getContent() == CONTENT_AIR){
+ air_count++;
+ if(air_count >= 2){
+ is_good = true;
+ nodepos.Y -= 1;
+ break;
+ }
+ }
+ nodepos.Y++;
+ }
+ if(is_good){
+ // Found a good place
+ //infostream<<"Searched through "<<i<<" places."<<std::endl;
+ break;
+ }
}
#endif
- // If no suitable place was not found, go above water at least.
- if(groundheight < WATER_LEVEL)
- groundheight = WATER_LEVEL;
-
- return intToFloat(v3s16(
- nodepos.X,
- groundheight + 3,
- nodepos.Y
- ), BS);
+ return intToFloat(nodepos, BS);
}
Player *Server::emergePlayer(const char *name, const char *password, u16 peer_id)