diff options
Diffstat (limited to 'src/server.cpp')
-rw-r--r-- | src/server.cpp | 35 |
1 files changed, 15 insertions, 20 deletions
diff --git a/src/server.cpp b/src/server.cpp index a57d1f1aa..1969a5946 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -2522,7 +2522,7 @@ void Server::RespawnPlayer(u16 peer_id) bool repositioned = m_script->on_respawnplayer(playersao); if(!repositioned){ - v3f pos = findSpawnPos(m_env->getServerMap()); + v3f pos = findSpawnPos(); // setPos will send the new position to client playersao->setPos(pos); } @@ -3179,23 +3179,24 @@ std::string Server::getBuiltinLuaPath() return porting::path_share + DIR_DELIM + "builtin"; } -v3f findSpawnPos(ServerMap &map) +v3f Server::findSpawnPos() { - //return v3f(50,50,50)*BS; + ServerMap &map = m_env->getServerMap(); + v3f nodeposf; + if (g_settings->getV3FNoEx("static_spawnpoint", nodeposf)) { + return nodeposf * BS; + } - v3s16 nodepos; + // Default position is static_spawnpoint + // We will return it if we don't found a good place + v3s16 nodepos(nodeposf.X, nodeposf.Y, nodeposf.Z); -#if 0 - nodepos = v2s16(0,0); - groundheight = 20; -#endif - -#if 1 s16 water_level = map.getWaterLevel(); + bool is_good = false; + // Try to find a good place a few times - for(s32 i=0; i<1000; i++) - { + for(s32 i = 0; i < 1000 && !is_good; i++) { s32 range = 1 + i; // We're going to try to throw the player to this position v2s16 nodepos2d = v2s16( @@ -3210,7 +3211,7 @@ v3f findSpawnPos(ServerMap &map) continue; nodepos = v3s16(nodepos2d.X, groundheight, nodepos2d.Y); - bool is_good = false; + s32 air_count = 0; for (s32 i = 0; i < 10; i++) { v3s16 blockpos = getNodeBlockPos(nodepos); @@ -3225,13 +3226,7 @@ v3f findSpawnPos(ServerMap &map) } nodepos.Y++; } - if(is_good){ - // Found a good place - //infostream<<"Searched through "<<i<<" places."<<std::endl; - break; - } } -#endif return intToFloat(nodepos, BS); } @@ -3274,7 +3269,7 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id) // Set player position infostream<<"Server: Finding spawn place for player \"" <<name<<"\""<<std::endl; - v3f pos = findSpawnPos(m_env->getServerMap()); + v3f pos = findSpawnPos(); player->setPosition(pos); // Make sure the player is saved |