summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLoic Blot <loic.blot@unix-experience.fr>2015-04-03 09:04:02 +0200
committerLoic Blot <loic.blot@unix-experience.fr>2015-04-03 09:44:36 +0200
commit470de10de3a4d864ce2808bb3778cf9abfbc560e (patch)
tree8580c79e5ea44f2bc59bf299cc6030b3193cfd0a /src
parentaa340fd857c151384873f2b29a9bad76e49e852a (diff)
downloadminetest-470de10de3a4d864ce2808bb3778cf9abfbc560e.tar.gz
minetest-470de10de3a4d864ce2808bb3778cf9abfbc560e.tar.bz2
minetest-470de10de3a4d864ce2808bb3778cf9abfbc560e.zip
Fix players spawned at (0,0,0) in some rare cases instead of static_spawnpoint, if set
Approved by: @kwoelkr
Diffstat (limited to 'src')
-rw-r--r--src/server.cpp35
-rw-r--r--src/server.h7
2 files changed, 17 insertions, 25 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
diff --git a/src/server.h b/src/server.h
index a584cbe5a..da506acf1 100644
--- a/src/server.h
+++ b/src/server.h
@@ -63,11 +63,6 @@ enum ClientDeletionReason {
CDR_DENY
};
-/*
- Some random functions
-*/
-v3f findSpawnPos(ServerMap &map);
-
class MapEditEventIgnorer
{
public:
@@ -474,6 +469,8 @@ private:
void DeleteClient(u16 peer_id, ClientDeletionReason reason);
void UpdateCrafting(Player *player);
+ v3f findSpawnPos();
+
// When called, connection mutex should be locked
RemoteClient* getClient(u16 peer_id,ClientState state_min=CS_Active);
RemoteClient* getClientNoEx(u16 peer_id,ClientState state_min=CS_Active);