diff options
-rw-r--r-- | src/content_sao.cpp | 92 | ||||
-rw-r--r-- | src/content_sao.h | 7 | ||||
-rw-r--r-- | src/server.cpp | 6 |
3 files changed, 57 insertions, 48 deletions
diff --git a/src/content_sao.cpp b/src/content_sao.cpp index b05ad31d1..810bd5a7c 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -748,7 +748,7 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end) // No prototype, PlayerSAO does not need to be deserialized PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_, - const std::set<std::string> &privs): + const std::set<std::string> &privs, bool is_singleplayer): ServerActiveObject(env_, v3f(0,0,0)), m_player(player_), m_peer_id(peer_id_), @@ -761,6 +761,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_, m_armor_groups_sent(false), m_properties_sent(true), m_privs(privs), + m_is_singleplayer(is_singleplayer), // public m_teleported(false), m_inventory_not_sent(false), @@ -865,51 +866,54 @@ void PlayerSAO::step(float dtime, bool send_recommended) } m_time_from_last_punch += dtime; - - /* - Check player movements - - NOTE: Actually the server should handle player physics like the - client does and compare player's position to what is calculated - on our side. This is required when eg. players fly due to an - explosion. - */ - - float player_max_speed = 0; - float player_max_speed_up = 0; - if(m_privs.count("fast") != 0){ - // Fast speed - player_max_speed = BS * 20; - player_max_speed_up = BS * 20; - } else { - // Normal speed - player_max_speed = BS * 4.0; - player_max_speed_up = BS * 4.0; - } - // Tolerance - player_max_speed *= 2.5; - player_max_speed_up *= 2.5; - - m_last_good_position_age += dtime; - if(m_last_good_position_age >= 1.0){ - float age = m_last_good_position_age; - v3f diff = (m_player->getPosition() - m_last_good_position); - float d_vert = diff.Y; - diff.Y = 0; - float d_horiz = diff.getLength(); - /*infostream<<m_player->getName()<<"'s horizontal speed is " - <<(d_horiz/age)<<std::endl;*/ - if(d_horiz <= age * player_max_speed && - (d_vert < 0 || d_vert < age * player_max_speed_up)){ - m_last_good_position = m_player->getPosition(); + + if(!m_is_singleplayer) + { + /* + Check player movements + + NOTE: Actually the server should handle player physics like the + client does and compare player's position to what is calculated + on our side. This is required when eg. players fly due to an + explosion. + */ + + float player_max_speed = 0; + float player_max_speed_up = 0; + if(m_privs.count("fast") != 0){ + // Fast speed + player_max_speed = BS * 20; + player_max_speed_up = BS * 20; } else { - actionstream<<"Player "<<m_player->getName() - <<" moved too fast; resetting position" - <<std::endl; - m_player->setPosition(m_last_good_position); - m_teleported = true; + // Normal speed + player_max_speed = BS * 4.0; + player_max_speed_up = BS * 4.0; + } + // Tolerance + player_max_speed *= 2.5; + player_max_speed_up *= 2.5; + + m_last_good_position_age += dtime; + if(m_last_good_position_age >= 1.0){ + float age = m_last_good_position_age; + v3f diff = (m_player->getPosition() - m_last_good_position); + float d_vert = diff.Y; + diff.Y = 0; + float d_horiz = diff.getLength(); + /*infostream<<m_player->getName()<<"'s horizontal speed is " + <<(d_horiz/age)<<std::endl;*/ + if(d_horiz <= age * player_max_speed && + (d_vert < 0 || d_vert < age * player_max_speed_up)){ + m_last_good_position = m_player->getPosition(); + } else { + actionstream<<"Player "<<m_player->getName() + <<" moved too fast; resetting position" + <<std::endl; + m_player->setPosition(m_last_good_position); + m_teleported = true; + } + m_last_good_position_age = 0; } - m_last_good_position_age = 0; } if(send_recommended == false) diff --git a/src/content_sao.h b/src/content_sao.h index 55d0637ae..d336c5eea 100644 --- a/src/content_sao.h +++ b/src/content_sao.h @@ -106,7 +106,7 @@ class PlayerSAO : public ServerActiveObject { public: PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_, - const std::set<std::string> &privs); + const std::set<std::string> &privs, bool is_singleplayer); ~PlayerSAO(); u8 getType() const { return ACTIVEOBJECT_TYPE_PLAYER; } @@ -183,9 +183,11 @@ public: m_time_from_last_punch = 0.0; return r; } - void updatePrivileges(const std::set<std::string> &privs) + void updatePrivileges(const std::set<std::string> &privs, + bool is_singleplayer) { m_privs = privs; + m_is_singleplayer = is_singleplayer; } private: @@ -205,6 +207,7 @@ private: struct ObjectProperties m_prop; // Cached privileges for enforcement std::set<std::string> m_privs; + bool m_is_singleplayer; public: // Some flags used by Server diff --git a/src/server.cpp b/src/server.cpp index c06fcb0fd..b33e2477e 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -4323,7 +4323,8 @@ void Server::reportPrivsModified(const std::string &name) return; SendPlayerPrivileges(player->peer_id); player->getPlayerSAO()->updatePrivileges( - getPlayerEffectivePrivs(name)); + getPlayerEffectivePrivs(name), + isSingleplayer()); } } @@ -4527,7 +4528,8 @@ PlayerSAO* Server::emergePlayer(const char *name, u16 peer_id) Create a new player active object */ PlayerSAO *playersao = new PlayerSAO(m_env, player, peer_id, - getPlayerEffectivePrivs(player->getName())); + getPlayerEffectivePrivs(player->getName()), + isSingleplayer()); /* Add object to environment */ m_env->addActiveObject(playersao); |