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>
This commit is contained in:
ANAND 2020-05-17 01:12:31 +05:30 committed by GitHub
parent ab745685c7
commit c1ce4be756
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 8 deletions

@ -6555,6 +6555,7 @@ Player properties need to be saved manually.
automatic_rotate = 0, automatic_rotate = 0,
-- Set constant rotation in radians per second, positive or negative. -- 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. -- Set to 0 to disable constant rotation.
stepheight = 0, stepheight = 0,

@ -1077,10 +1077,13 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
updateTextures(m_previous_texture_modifier); updateTextures(m_previous_texture_modifier);
} }
} }
if (!getParent() && std::fabs(m_prop.automatic_rotate) > 0.001) { if (!getParent() && std::fabs(m_prop.automatic_rotate) > 0.001) {
m_rotation.Y += dtime * m_prop.automatic_rotate * 180 / M_PI; // This is the child node's rotation. It is only used for automatic_rotate.
rot_translator.val_current = m_rotation; v3f local_rot = node->getRotation();
updateNodePos(); 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 && if (!getParent() && m_prop.automatic_face_movement_dir &&
@ -1501,11 +1504,7 @@ void GenericCAO::processMessage(const std::string &data)
m_position = readV3F32(is); m_position = readV3F32(is);
m_velocity = readV3F32(is); m_velocity = readV3F32(is);
m_acceleration = readV3F32(is); m_acceleration = readV3F32(is);
m_rotation = readV3F32(is);
if (std::fabs(m_prop.automatic_rotate) < 0.001f)
m_rotation = readV3F32(is);
else
readV3F32(is);
m_rotation = wrapDegrees_0_360_v3f(m_rotation); m_rotation = wrapDegrees_0_360_v3f(m_rotation);
bool do_interpolate = readU8(is); bool do_interpolate = readU8(is);