Don't apply player movement cheat detection in singleplayer
parent
8ecfd88d92
commit
491287c0af
|
@ -748,7 +748,7 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end)
|
||||||
// No prototype, PlayerSAO does not need to be deserialized
|
// No prototype, PlayerSAO does not need to be deserialized
|
||||||
|
|
||||||
PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
|
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)),
|
ServerActiveObject(env_, v3f(0,0,0)),
|
||||||
m_player(player_),
|
m_player(player_),
|
||||||
m_peer_id(peer_id_),
|
m_peer_id(peer_id_),
|
||||||
|
@ -761,6 +761,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
|
||||||
m_armor_groups_sent(false),
|
m_armor_groups_sent(false),
|
||||||
m_properties_sent(true),
|
m_properties_sent(true),
|
||||||
m_privs(privs),
|
m_privs(privs),
|
||||||
|
m_is_singleplayer(is_singleplayer),
|
||||||
// public
|
// public
|
||||||
m_teleported(false),
|
m_teleported(false),
|
||||||
m_inventory_not_sent(false),
|
m_inventory_not_sent(false),
|
||||||
|
@ -866,50 +867,53 @@ void PlayerSAO::step(float dtime, bool send_recommended)
|
||||||
|
|
||||||
m_time_from_last_punch += dtime;
|
m_time_from_last_punch += dtime;
|
||||||
|
|
||||||
/*
|
if(!m_is_singleplayer)
|
||||||
Check player movements
|
{
|
||||||
|
/*
|
||||||
|
Check player movements
|
||||||
|
|
||||||
NOTE: Actually the server should handle player physics like the
|
NOTE: Actually the server should handle player physics like the
|
||||||
client does and compare player's position to what is calculated
|
client does and compare player's position to what is calculated
|
||||||
on our side. This is required when eg. players fly due to an
|
on our side. This is required when eg. players fly due to an
|
||||||
explosion.
|
explosion.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
float player_max_speed = 0;
|
float player_max_speed = 0;
|
||||||
float player_max_speed_up = 0;
|
float player_max_speed_up = 0;
|
||||||
if(m_privs.count("fast") != 0){
|
if(m_privs.count("fast") != 0){
|
||||||
// Fast speed
|
// Fast speed
|
||||||
player_max_speed = BS * 20;
|
player_max_speed = BS * 20;
|
||||||
player_max_speed_up = 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();
|
|
||||||
} else {
|
} else {
|
||||||
actionstream<<"Player "<<m_player->getName()
|
// Normal speed
|
||||||
<<" moved too fast; resetting position"
|
player_max_speed = BS * 4.0;
|
||||||
<<std::endl;
|
player_max_speed_up = BS * 4.0;
|
||||||
m_player->setPosition(m_last_good_position);
|
}
|
||||||
m_teleported = true;
|
// 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)
|
if(send_recommended == false)
|
||||||
|
|
|
@ -106,7 +106,7 @@ class PlayerSAO : public ServerActiveObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
|
PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
|
||||||
const std::set<std::string> &privs);
|
const std::set<std::string> &privs, bool is_singleplayer);
|
||||||
~PlayerSAO();
|
~PlayerSAO();
|
||||||
u8 getType() const
|
u8 getType() const
|
||||||
{ return ACTIVEOBJECT_TYPE_PLAYER; }
|
{ return ACTIVEOBJECT_TYPE_PLAYER; }
|
||||||
|
@ -183,9 +183,11 @@ public:
|
||||||
m_time_from_last_punch = 0.0;
|
m_time_from_last_punch = 0.0;
|
||||||
return r;
|
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_privs = privs;
|
||||||
|
m_is_singleplayer = is_singleplayer;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -205,6 +207,7 @@ private:
|
||||||
struct ObjectProperties m_prop;
|
struct ObjectProperties m_prop;
|
||||||
// Cached privileges for enforcement
|
// Cached privileges for enforcement
|
||||||
std::set<std::string> m_privs;
|
std::set<std::string> m_privs;
|
||||||
|
bool m_is_singleplayer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// Some flags used by Server
|
// Some flags used by Server
|
||||||
|
|
|
@ -4323,7 +4323,8 @@ void Server::reportPrivsModified(const std::string &name)
|
||||||
return;
|
return;
|
||||||
SendPlayerPrivileges(player->peer_id);
|
SendPlayerPrivileges(player->peer_id);
|
||||||
player->getPlayerSAO()->updatePrivileges(
|
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
|
Create a new player active object
|
||||||
*/
|
*/
|
||||||
PlayerSAO *playersao = new PlayerSAO(m_env, player, peer_id,
|
PlayerSAO *playersao = new PlayerSAO(m_env, player, peer_id,
|
||||||
getPlayerEffectivePrivs(player->getName()));
|
getPlayerEffectivePrivs(player->getName()),
|
||||||
|
isSingleplayer());
|
||||||
|
|
||||||
/* Add object to environment */
|
/* Add object to environment */
|
||||||
m_env->addActiveObject(playersao);
|
m_env->addActiveObject(playersao);
|
||||||
|
|
Loading…
Reference in New Issue