Server-side authority for attached players (#10952)

The server must have authority about attachments. This commit ignores any player movement packets as long they're attached.
This commit is contained in:
SmallJoker 2021-02-15 20:41:19 +01:00 committed by GitHub
parent f018737b06
commit 7832b6843e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 35 deletions

@ -488,8 +488,12 @@ void Server::process_PlayerPos(RemotePlayer *player, PlayerSAO *playersao,
pitch = modulo360f(pitch); pitch = modulo360f(pitch);
yaw = wrapDegrees_0_360(yaw); yaw = wrapDegrees_0_360(yaw);
playersao->setBasePosition(position); if (!playersao->isAttached()) {
player->setSpeed(speed); // Only update player positions when moving freely
// to not interfere with attachment handling
playersao->setBasePosition(position);
player->setSpeed(speed);
}
playersao->setLookPitch(pitch); playersao->setLookPitch(pitch);
playersao->setPlayerYaw(yaw); playersao->setPlayerYaw(yaw);
playersao->setFov(fov); playersao->setFov(fov);

@ -146,15 +146,11 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
// Each frame, parent position is copied if the object is attached, otherwise it's calculated normally // Each frame, parent position is copied if the object is attached, otherwise it's calculated normally
// If the object gets detached this comes into effect automatically from the last known origin // If the object gets detached this comes into effect automatically from the last known origin
if(isAttached()) if (auto *parent = getParent()) {
{ m_base_position = parent->getBasePosition();
v3f pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition();
m_base_position = pos;
m_velocity = v3f(0,0,0); m_velocity = v3f(0,0,0);
m_acceleration = v3f(0,0,0); m_acceleration = v3f(0,0,0);
} } else {
else
{
if(m_prop.physical){ if(m_prop.physical){
aabb3f box = m_prop.collisionbox; aabb3f box = m_prop.collisionbox;
box.MinEdge *= BS; box.MinEdge *= BS;

@ -260,10 +260,13 @@ void PlayerSAO::step(float dtime, bool send_recommended)
// otherwise it's calculated normally. // otherwise it's calculated normally.
// If the object gets detached this comes into effect automatically from // If the object gets detached this comes into effect automatically from
// the last known origin. // the last known origin.
if (isAttached()) { if (auto *parent = getParent()) {
v3f pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition(); v3f pos = parent->getBasePosition();
m_last_good_position = pos; m_last_good_position = pos;
setBasePosition(pos); setBasePosition(pos);
if (m_player)
m_player->setSpeed(v3f());
} }
if (!send_recommended) if (!send_recommended)
@ -570,34 +573,11 @@ void PlayerSAO::setMaxSpeedOverride(const v3f &vel)
bool PlayerSAO::checkMovementCheat() bool PlayerSAO::checkMovementCheat()
{ {
if (m_is_singleplayer || if (m_is_singleplayer ||
isAttached() ||
g_settings->getBool("disable_anticheat")) { g_settings->getBool("disable_anticheat")) {
m_last_good_position = m_base_position; m_last_good_position = m_base_position;
return false; return false;
} }
if (UnitSAO *parent = dynamic_cast<UnitSAO *>(getParent())) {
v3f attachment_pos;
{
int parent_id;
std::string bone;
v3f attachment_rot;
bool force_visible;
getAttachment(&parent_id, &bone, &attachment_pos, &attachment_rot, &force_visible);
}
v3f parent_pos = parent->getBasePosition();
f32 diff = m_base_position.getDistanceFromSQ(parent_pos) - attachment_pos.getLengthSQ();
const f32 maxdiff = 4.0f * BS; // fair trade-off value for various latencies
if (diff > maxdiff * maxdiff) {
setBasePosition(parent_pos);
actionstream << "Server: " << m_player->getName()
<< " moved away from parent; diff=" << sqrtf(diff) / BS
<< " resetting position." << std::endl;
return true;
}
// Player movement is locked to the entity. Skip further checks
return false;
}
bool cheated = false; bool cheated = false;
/* /*