diff options
author | ANAND <ClobberXD@gmail.com> | 2020-05-17 01:12:31 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-16 21:42:31 +0200 |
commit | c1ce4be756e2554051a27f244303377c0a7d69a6 (patch) | |
tree | e55eb5c2a2cc85122de0d1a1a5571d39cb550b61 | |
parent | ab745685c79cd7b0fa8f74b96e190c528d620608 (diff) | |
download | hax-minetest-server-c1ce4be756e2554051a27f244303377c0a7d69a6.tar.gz hax-minetest-server-c1ce4be756e2554051a27f244303377c0a7d69a6.zip |
Make automatic_rotate relative, allow setting rotation (#8468)
automatic_rotate does not make sense if it is absolute. Make it relative.
To avoid bouncing, set_rotation did not update the client when automatic_rotate was set. That's no longer necessary because the new spinning method applies the rotation on top of the current one, and the updates are necessary for set_rotation to actually transform the object.
Co-authored-by: ANAND <ClobberXD@gmail.com>
Co-authored-by: Pedro Gimeno <pgimeno@users.noreply.notabug.org>
Diffstat (limited to '')
-rw-r--r-- | doc/lua_api.txt | 1 | ||||
-rw-r--r-- | src/client/content_cao.cpp | 15 |
2 files changed, 8 insertions, 8 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 9685e8307..07758c237 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -6555,6 +6555,7 @@ Player properties need to be saved manually. automatic_rotate = 0, -- Set constant rotation in radians per second, positive or negative. + -- Object rotates along the local Y-axis, and works with set_rotation. -- Set to 0 to disable constant rotation. stepheight = 0, diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index eb1dad22b..867bbf2c8 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -1077,10 +1077,13 @@ void GenericCAO::step(float dtime, ClientEnvironment *env) updateTextures(m_previous_texture_modifier); } } + if (!getParent() && std::fabs(m_prop.automatic_rotate) > 0.001) { - m_rotation.Y += dtime * m_prop.automatic_rotate * 180 / M_PI; - rot_translator.val_current = m_rotation; - updateNodePos(); + // This is the child node's rotation. It is only used for automatic_rotate. + v3f local_rot = node->getRotation(); + local_rot.Y = modulo360f(local_rot.Y - dtime * core::RADTODEG * + m_prop.automatic_rotate); + node->setRotation(local_rot); } if (!getParent() && m_prop.automatic_face_movement_dir && @@ -1501,11 +1504,7 @@ void GenericCAO::processMessage(const std::string &data) m_position = readV3F32(is); m_velocity = readV3F32(is); m_acceleration = readV3F32(is); - - if (std::fabs(m_prop.automatic_rotate) < 0.001f) - m_rotation = readV3F32(is); - else - readV3F32(is); + m_rotation = readV3F32(is); m_rotation = wrapDegrees_0_360_v3f(m_rotation); bool do_interpolate = readU8(is); |