aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/content_sao.cpp19
-rw-r--r--src/content_sao.h9
2 files changed, 24 insertions, 4 deletions
diff --git a/src/content_sao.cpp b/src/content_sao.cpp
index 7a1171eb7..f87977f80 100644
--- a/src/content_sao.cpp
+++ b/src/content_sao.cpp
@@ -785,6 +785,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, u16 peer_id_, bool is_singleplayer
m_inventory(NULL),
m_damage(0),
m_last_good_position(0,0,0),
+ m_time_from_last_teleport(0),
m_time_from_last_punch(0),
m_nocheat_dig_pos(32767, 32767, 32767),
m_nocheat_dig_time(0),
@@ -1000,6 +1001,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
// Increment cheat prevention timers
m_dig_pool.add(dtime);
m_move_pool.add(dtime);
+ m_time_from_last_teleport += dtime;
m_time_from_last_punch += dtime;
m_nocheat_dig_time += dtime;
@@ -1106,6 +1108,8 @@ void PlayerSAO::setPos(const v3f &pos)
setBasePosition(pos);
// Movement caused by this command is always valid
m_last_good_position = pos;
+ m_move_pool.empty();
+ m_time_from_last_teleport = 0.0;
m_env->getGameDef()->SendMovePlayer(m_peer_id);
}
@@ -1117,6 +1121,8 @@ void PlayerSAO::moveTo(v3f pos, bool continuous)
setBasePosition(pos);
// Movement caused by this command is always valid
m_last_good_position = pos;
+ m_move_pool.empty();
+ m_time_from_last_teleport = 0.0;
m_env->getGameDef()->SendMovePlayer(m_peer_id);
}
@@ -1405,11 +1411,16 @@ bool PlayerSAO::checkMovementCheat()
if (m_move_pool.grab(required_time)) {
m_last_good_position = m_base_position;
} else {
- actionstream << "Player " << m_player->getName()
- << " moved too fast; resetting position"
- << std::endl;
+ const float LAG_POOL_MIN = 5.0;
+ float lag_pool_max = m_env->getMaxLagEstimate() * 2.0;
+ lag_pool_max = MYMAX(lag_pool_max, LAG_POOL_MIN);
+ if (m_time_from_last_teleport > lag_pool_max) {
+ actionstream << "Player " << m_player->getName()
+ << " moved too fast; resetting position"
+ << std::endl;
+ cheated = true;
+ }
setBasePosition(m_last_good_position);
- cheated = true;
}
return cheated;
}
diff --git a/src/content_sao.h b/src/content_sao.h
index bbf244742..1ccea0d78 100644
--- a/src/content_sao.h
+++ b/src/content_sao.h
@@ -157,18 +157,26 @@ class LagPool
public:
LagPool(): m_pool(15), m_max(15)
{}
+
void setMax(float new_max)
{
m_max = new_max;
if(m_pool > new_max)
m_pool = new_max;
}
+
void add(float dtime)
{
m_pool -= dtime;
if(m_pool < 0)
m_pool = 0;
}
+
+ void empty()
+ {
+ m_pool = m_max;
+ }
+
bool grab(float dtime)
{
if(dtime <= 0)
@@ -358,6 +366,7 @@ private:
LagPool m_dig_pool;
LagPool m_move_pool;
v3f m_last_good_position;
+ float m_time_from_last_teleport;
float m_time_from_last_punch;
v3s16 m_nocheat_dig_pos;
float m_nocheat_dig_time;