diff options
author | hecktest <42101236+hecktest@users.noreply.github.com> | 2020-06-09 19:36:47 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-09 19:36:47 +0200 |
commit | 09e285f38cd96b4278b921ab82c5266082bb1a0d (patch) | |
tree | b81da3084e3b38812c9c5afd66e1d5ba742b0798 /src/client | |
parent | b9f618746c0f673ea1f851bb2473fb3ca9410093 (diff) | |
download | minetest-09e285f38cd96b4278b921ab82c5266082bb1a0d.tar.gz minetest-09e285f38cd96b4278b921ab82c5266082bb1a0d.tar.bz2 minetest-09e285f38cd96b4278b921ab82c5266082bb1a0d.zip |
Fix player-to-object attachment teleport bug (#10008)
Fixes two bugs:
* The camera offset was not applied to an object while detaching, briefly placing the irrlicht matrixnode in world space.
* When attaching, the matrixnode's absolute position was evaluated without evaluating the parent first, resulting in zeroed positions.
Diffstat (limited to 'src/client')
-rw-r--r-- | src/client/content_cao.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index a6ce06d20..79ecccb6f 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -921,7 +921,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) m_animated_meshnode->animateJoints(); updateBonePosition(); } - + // Handle model animations and update positions instantly to prevent lags if (m_is_local_player) { LocalPlayer *player = m_env->getLocalPlayer(); @@ -1403,7 +1403,7 @@ void GenericCAO::updateBonePosition() bone->setRotation(it.second.Y); } } - + // search through bones to find mistakenly rotated bones due to bug in Irrlicht for (u32 i = 0; i < m_animated_meshnode->getJointCount(); ++i) { irr::scene::IBoneSceneNode *bone = m_animated_meshnode->getJointNode(i); @@ -1427,7 +1427,7 @@ void GenericCAO::updateBonePosition() // and update the bones transformation. v3f bone_rot = bone->getRelativeTransformation().getRotationDegrees(); float offset = fabsf(bone_rot.X - bone->getRotation().X); - if (offset > 179.9f && offset < 180.1f) { + if (offset > 179.9f && offset < 180.1f) { bone->setRotation(bone_rot); bone->updateAbsolutePosition(); } @@ -1454,15 +1454,17 @@ void GenericCAO::updateAttachments() if (!parent) { // Detach or don't attach if (m_matrixnode) { + v3s16 camera_offset = m_env->getCameraOffset(); v3f old_pos = getPosition(); m_matrixnode->setParent(m_smgr->getRootSceneNode()); - getPosRotMatrix().setTranslation(old_pos); + getPosRotMatrix().setTranslation(old_pos - intToFloat(camera_offset, BS)); m_matrixnode->updateAbsolutePosition(); } } else // Attach { + parent->updateAttachments(); scene::ISceneNode *parent_node = parent->getSceneNode(); scene::IAnimatedMeshSceneNode *parent_animated_mesh_node = parent->getAnimatedMeshSceneNode(); @@ -1472,6 +1474,7 @@ void GenericCAO::updateAttachments() if (m_matrixnode && parent_node) { m_matrixnode->setParent(parent_node); + parent_node->updateAbsolutePosition(); getPosRotMatrix().setTranslation(m_attachment_position); //setPitchYawRoll(getPosRotMatrix(), m_attachment_rotation); // use Irrlicht eulers instead |