aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhecktest <42101236+hecktest@users.noreply.github.com>2020-06-09 19:36:47 +0200
committerGitHub <noreply@github.com>2020-06-09 19:36:47 +0200
commit09e285f38cd96b4278b921ab82c5266082bb1a0d (patch)
treeb81da3084e3b38812c9c5afd66e1d5ba742b0798 /src
parentb9f618746c0f673ea1f851bb2473fb3ca9410093 (diff)
downloadminetest-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')
-rw-r--r--src/client/content_cao.cpp11
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