]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/server/player_sao.cpp
Server-side authority for attached players (#10952)
[dragonfireclient.git] / src / server / player_sao.cpp
index 110d2010d20dd314dadc5fef56770a39ce645c25..0d31f2e0b549ba455f5bd2c62f4cb969ed3728b6 100644 (file)
@@ -260,10 +260,13 @@ void PlayerSAO::step(float dtime, bool send_recommended)
        // otherwise it's calculated normally.
        // If the object gets detached this comes into effect automatically from
        // the last known origin.
-       if (isAttached()) {
-               v3f pos = m_env->getActiveObject(m_attachment_parent_id)->getBasePosition();
+       if (auto *parent = getParent()) {
+               v3f pos = parent->getBasePosition();
                m_last_good_position = pos;
                setBasePosition(pos);
+
+               if (m_player)
+                       m_player->setSpeed(v3f());
        }
 
        if (!send_recommended)
@@ -570,34 +573,11 @@ void PlayerSAO::setMaxSpeedOverride(const v3f &vel)
 bool PlayerSAO::checkMovementCheat()
 {
        if (m_is_singleplayer ||
+                       isAttached() ||
                        g_settings->getBool("disable_anticheat")) {
                m_last_good_position = m_base_position;
                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;
        /*