diff options
author | CoderForTheBetter <marcumjp@gmail.com> | 2018-11-28 03:38:50 -0500 |
---|---|---|
committer | Loïc Blot <nerzhul@users.noreply.github.com> | 2018-11-28 09:38:50 +0100 |
commit | faa358e797128ab07bb5644ce305a832d59e5596 (patch) | |
tree | dcf05ef0611b839503c4845fd89ad9519ee1c4bb /src/content_sao.cpp | |
parent | 9519d57017cfa28eb4f2fbf3c780f826017bbb00 (diff) | |
download | minetest-faa358e797128ab07bb5644ce305a832d59e5596.tar.gz minetest-faa358e797128ab07bb5644ce305a832d59e5596.tar.bz2 minetest-faa358e797128ab07bb5644ce305a832d59e5596.zip |
Add Lua methods 'set_rotation()' and 'get_rotation()' (#7395)
* Adds Lua methods 'set_rotation()' and 'get_rotation'. Also changed some method names to be more clear. Instead of an f32 being sent over network for yaw, now a v3f is sent for rotation on xyz axes. Perserved Lua method set_yaw/setyaw so that old mods still work, other wise to set yaw they would need to switch to set_rotation(0, yaw, 0).
Diffstat (limited to 'src/content_sao.cpp')
-rw-r--r-- | src/content_sao.cpp | 52 |
1 files changed, 29 insertions, 23 deletions
diff --git a/src/content_sao.cpp b/src/content_sao.cpp index f32294191..0b69e7bff 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -349,7 +349,7 @@ ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos, std::string state; s16 hp = 1; v3f velocity; - float yaw = 0; + v3f rotation; if (!data.empty()) { std::istringstream is(data, std::ios::binary); // read version @@ -364,7 +364,7 @@ ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos, state = deSerializeLongString(is); hp = readS16(is); velocity = readV3F1000(is); - yaw = readF1000(is); + rotation = readV3F1000(is); } } // create object @@ -373,7 +373,7 @@ ServerActiveObject* LuaEntitySAO::create(ServerEnvironment *env, v3f pos, LuaEntitySAO *sao = new LuaEntitySAO(env, pos, name, state); sao->m_hp = hp; sao->m_velocity = velocity; - sao->m_yaw = yaw; + sao->m_rotation = rotation; return sao; } @@ -443,8 +443,8 @@ void LuaEntitySAO::step(float dtime, bool send_recommended) float max_rotation_delta = dtime * m_prop.automatic_face_movement_max_rotation_per_sec; - m_yaw = wrapDegrees_0_360(m_yaw); - wrappedApproachShortest(m_yaw, target_yaw, max_rotation_delta, 360.f); + m_rotation.Y = wrapDegrees_0_360(m_rotation.Y); + wrappedApproachShortest(m_rotation.Y, target_yaw, max_rotation_delta, 360.f); } } @@ -468,7 +468,10 @@ void LuaEntitySAO::step(float dtime, bool send_recommended) move_d += m_last_sent_move_precision; float vel_d = m_velocity.getDistanceFrom(m_last_sent_velocity); if (move_d > minchange || vel_d > minchange || - std::fabs(m_yaw - m_last_sent_yaw) > 1.0) { + std::fabs(m_rotation.X - m_last_sent_rotation.X) > 1.0f || + std::fabs(m_rotation.Y - m_last_sent_rotation.Y) > 1.0f || + std::fabs(m_rotation.Z - m_last_sent_rotation.Z) > 1.0f) { + sendPosition(true, false); } } @@ -530,7 +533,7 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version) writeU8(os, 0); // is_player writeS16(os, getId()); //id writeV3F1000(os, m_base_position); - writeF1000(os, m_yaw); + writeV3F1000(os, m_rotation); writeS16(os, m_hp); std::ostringstream msg_os(std::ios::binary); @@ -585,8 +588,9 @@ void LuaEntitySAO::getStaticData(std::string *result) const writeS16(os, m_hp); // velocity writeV3F1000(os, m_velocity); - // yaw - writeF1000(os, m_yaw); + // rotation + writeV3F1000(os, m_rotation); + *result = os.str(); } @@ -767,10 +771,10 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end) m_last_sent_move_precision = m_base_position.getDistanceFrom( m_last_sent_position); m_last_sent_position_timer = 0; - m_last_sent_yaw = m_yaw; m_last_sent_position = m_base_position; m_last_sent_velocity = m_velocity; //m_last_sent_acceleration = m_acceleration; + m_last_sent_rotation = m_rotation; float update_interval = m_env->getSendRecommendedInterval(); @@ -778,7 +782,7 @@ void LuaEntitySAO::sendPosition(bool do_interpolate, bool is_movement_end) m_base_position, m_velocity, m_acceleration, - m_yaw, + m_rotation, do_interpolate, is_movement_end, update_interval @@ -919,9 +923,9 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version) writeU8(os, 1); // version os << serializeString(m_player->getName()); // name writeU8(os, 1); // is_player - writeS16(os, getId()); //id + writeS16(os, getId()); // id writeV3F1000(os, m_base_position); - writeF1000(os, m_yaw); + writeV3F1000(os, m_rotation); writeS16(os, getHP()); std::ostringstream msg_os(std::ios::binary); @@ -1073,7 +1077,7 @@ void PlayerSAO::step(float dtime, bool send_recommended) return; // If the object is attached client-side, don't waste bandwidth sending its - // position to clients. + // position or rotation to clients. if (m_position_not_sent && !isAttached()) { m_position_not_sent = false; float update_interval = m_env->getSendRecommendedInterval(); @@ -1087,7 +1091,7 @@ void PlayerSAO::step(float dtime, bool send_recommended) pos, v3f(0.0f, 0.0f, 0.0f), v3f(0.0f, 0.0f, 0.0f), - m_yaw, + v3f(0.0f, 0.0f, 0.0f), true, false, update_interval @@ -1188,12 +1192,14 @@ void PlayerSAO::moveTo(v3f pos, bool continuous) m_env->getGameDef()->SendMovePlayer(m_peer_id); } -void PlayerSAO::setYaw(const float yaw) +void PlayerSAO::setPlayerYaw(const float yaw) { - if (m_player && yaw != m_yaw) + v3f rotation(0, yaw, 0); + if (m_player && yaw != m_rotation.Y) m_player->setDirty(true); - UnitSAO::setYaw(yaw); + // Set player model yaw, not look view + UnitSAO::setRotation(rotation); } void PlayerSAO::setFov(const float fov) @@ -1212,13 +1218,13 @@ void PlayerSAO::setWantedRange(const s16 range) m_wanted_range = range; } -void PlayerSAO::setYawAndSend(const float yaw) +void PlayerSAO::setPlayerYawAndSend(const float yaw) { - setYaw(yaw); + setPlayerYaw(yaw); m_env->getGameDef()->SendMovePlayer(m_peer_id); } -void PlayerSAO::setPitch(const float pitch) +void PlayerSAO::setLookPitch(const float pitch) { if (m_player && pitch != m_pitch) m_player->setDirty(true); @@ -1226,9 +1232,9 @@ void PlayerSAO::setPitch(const float pitch) m_pitch = pitch; } -void PlayerSAO::setPitchAndSend(const float pitch) +void PlayerSAO::setLookPitchAndSend(const float pitch) { - setPitch(pitch); + setLookPitch(pitch); m_env->getGameDef()->SendMovePlayer(m_peer_id); } |