]> git.lizzy.rs Git - minetest.git/blobdiff - src/content_sao.cpp
Set acceleration only once in falling node
[minetest.git] / src / content_sao.cpp
index 984d2ffa3468dbe610c7fce27b22fc135226d798..53bf3154f593fb39c429876e850fe9280c141da9 100644 (file)
@@ -23,7 +23,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "collision.h"
 #include "environment.h"
 #include "settings.h"
-#include "profiler.h"
 #include "serialization.h" // For compressZlib
 #include "tool.h" // For ToolCapabilities
 #include "gamedef.h"
@@ -136,6 +135,7 @@ LuaEntitySAO::LuaEntitySAO(ServerEnvironment *env, v3f pos,
        m_armor_groups_sent(false),
        m_animation_speed(0),
        m_animation_blend(0),
+       m_animation_loop(true),
        m_animation_sent(false),
        m_bone_position_sent(false),
        m_attachment_parent_id(0),
@@ -259,7 +259,7 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
        else
        {
                if(m_prop.physical){
-                       core::aabbox3d<f32> box = m_prop.collisionbox;
+                       aabb3f box = m_prop.collisionbox;
                        box.MinEdge *= BS;
                        box.MaxEdge *= BS;
                        collisionMoveResult moveresult;
@@ -269,7 +269,7 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
                        v3f p_acceleration = m_acceleration;
                        moveresult = collisionMoveSimple(m_env,m_env->getGameDef(),
                                        pos_max_d, box, m_prop.stepheight, dtime,
-                                       p_pos, p_velocity, p_acceleration,
+                                       &p_pos, &p_velocity, p_acceleration,
                                        this, m_prop.collideWithObjects);
 
                        // Apply results
@@ -283,8 +283,20 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
                }
 
                if((m_prop.automatic_face_movement_dir) &&
-                               (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001)){
-                       m_yaw = atan2(m_velocity.Z,m_velocity.X) * 180 / M_PI + m_prop.automatic_face_movement_dir_offset;
+                               (fabs(m_velocity.Z) > 0.001 || fabs(m_velocity.X) > 0.001))
+               {
+                       float optimal_yaw = atan2(m_velocity.Z,m_velocity.X) * 180 / M_PI
+                                       + m_prop.automatic_face_movement_dir_offset;
+                       float max_rotation_delta =
+                                       dtime * m_prop.automatic_face_movement_max_rotation_per_sec;
+
+                       if ((m_prop.automatic_face_movement_max_rotation_per_sec > 0) &&
+                               (fabs(m_yaw - optimal_yaw) > max_rotation_delta)) {
+
+                               m_yaw = optimal_yaw < m_yaw ? m_yaw - max_rotation_delta : m_yaw + max_rotation_delta;
+                       } else {
+                               m_yaw = optimal_yaw;
+                       }
                }
        }
 
@@ -324,7 +336,8 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
 
        if(m_animation_sent == false){
                m_animation_sent = true;
-               std::string str = gob_cmd_update_animation(m_animation_range, m_animation_speed, m_animation_blend);
+               std::string str = gob_cmd_update_animation(
+                       m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop);
                // create message and add to list
                ActiveObjectMessage aom(getId(), true, str);
                m_messages_out.push(aom);
@@ -366,7 +379,8 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version)
                writeU8(os, 4 + m_bone_position.size()); // number of messages stuffed in here
                os<<serializeLongString(getPropertyPacket()); // message 1
                os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
-               os<<serializeLongString(gob_cmd_update_animation(m_animation_range, m_animation_speed, m_animation_blend)); // 3
+               os<<serializeLongString(gob_cmd_update_animation(
+                       m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
                for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
                        os<<serializeLongString(gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
                }
@@ -391,7 +405,7 @@ std::string LuaEntitySAO::getClientInitializationData(u16 protocol_version)
 
 std::string LuaEntitySAO::getStaticData()
 {
-       verbosestream<<__FUNCTION_NAME<<std::endl;
+       verbosestream<<FUNCTION_NAME<<std::endl;
        std::ostringstream os(std::ios::binary);
        // version
        writeU8(os, 1);
@@ -533,19 +547,21 @@ ItemGroupList LuaEntitySAO::getArmorGroups()
        return m_armor_groups;
 }
 
-void LuaEntitySAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend)
+void LuaEntitySAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop)
 {
        m_animation_range = frame_range;
        m_animation_speed = frame_speed;
        m_animation_blend = frame_blend;
+       m_animation_loop = frame_loop;
        m_animation_sent = false;
 }
 
-void LuaEntitySAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend)
+void LuaEntitySAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop)
 {
        *frame_range = m_animation_range;
        *frame_speed = m_animation_speed;
        *frame_blend = m_animation_blend;
+       *frame_loop = m_animation_loop;
 }
 
 void LuaEntitySAO::setBonePosition(const std::string &bone, v3f position, v3f rotation)
@@ -586,6 +602,21 @@ void LuaEntitySAO::getAttachment(int *parent_id, std::string *bone, v3f *positio
        *rotation = m_attachment_rotation;
 }
 
+void LuaEntitySAO::addAttachmentChild(int child_id)
+{
+       m_attachment_child_ids.insert(child_id);
+}
+
+void LuaEntitySAO::removeAttachmentChild(int child_id)
+{
+       m_attachment_child_ids.erase(child_id);
+}
+
+std::set<int> LuaEntitySAO::getAttachmentChildIds()
+{
+       return m_attachment_child_ids;
+}
+
 ObjectProperties* LuaEntitySAO::accessObjectProperties()
 {
        return &m_prop;
@@ -733,12 +764,11 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
        m_is_singleplayer(is_singleplayer),
        m_animation_speed(0),
        m_animation_blend(0),
+       m_animation_loop(true),
        m_animation_sent(false),
        m_bone_position_sent(false),
        m_attachment_parent_id(0),
        m_attachment_sent(false),
-       m_nametag_color(video::SColor(255, 255, 255, 255)),
-       m_nametag_sent(false),
        // public
        m_physics_override_speed(1),
        m_physics_override_jump(1),
@@ -756,7 +786,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
        m_prop.hp_max = PLAYER_MAX_HP;
        m_prop.physical = false;
        m_prop.weight = 75;
-       m_prop.collisionbox = core::aabbox3d<f32>(-1/3.,-1.0,-1/3., 1/3.,1.0,1/3.);
+       m_prop.collisionbox = aabb3f(-1/3.,-1.0,-1/3., 1/3.,1.0,1/3.);
        // start of default appearance, this should be overwritten by LUA
        m_prop.visual = "upright_sprite";
        m_prop.visual_size = v2f(1, 2);
@@ -801,8 +831,8 @@ void PlayerSAO::removingFromEnvironment()
        {
                m_player->setPlayerSAO(NULL);
                m_player->peer_id = 0;
-               m_env->savePlayer(m_player->getName());
-               m_env->removePlayer(m_player->getName());
+               m_env->savePlayer((RemotePlayer*)m_player);
+               m_env->removePlayer(m_player);
        }
 }
 
@@ -828,7 +858,8 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
                writeU8(os, 6 + m_bone_position.size()); // number of messages stuffed in here
                os<<serializeLongString(getPropertyPacket()); // message 1
                os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
-               os<<serializeLongString(gob_cmd_update_animation(m_animation_range, m_animation_speed, m_animation_blend)); // 3
+               os<<serializeLongString(gob_cmd_update_animation(
+                       m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop)); // 3
                for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_position.begin(); ii != m_bone_position.end(); ++ii){
                        os<<serializeLongString(gob_cmd_update_bone_position((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_bone_position.size
                }
@@ -836,7 +867,7 @@ std::string PlayerSAO::getClientInitializationData(u16 protocol_version)
                os<<serializeLongString(gob_cmd_update_physics_override(m_physics_override_speed,
                                m_physics_override_jump, m_physics_override_gravity, m_physics_override_sneak,
                                m_physics_override_sneak_glitch)); // 5
-               os << serializeLongString(gob_cmd_update_nametag_attributes(m_nametag_color)); // 6
+               os << serializeLongString(gob_cmd_update_nametag_attributes(m_prop.nametag_color)); // 6 (GENERIC_CMD_UPDATE_NAMETAG_ATTRIBUTES) : Deprecated, for backwards compatibility only.
        }
        else
        {
@@ -967,7 +998,8 @@ void PlayerSAO::step(float dtime, bool send_recommended)
 
        if(m_animation_sent == false){
                m_animation_sent = true;
-               std::string str = gob_cmd_update_animation(m_animation_range, m_animation_speed, m_animation_blend);
+               std::string str = gob_cmd_update_animation(
+                       m_animation_range, m_animation_speed, m_animation_blend, m_animation_loop);
                // create message and add to list
                ActiveObjectMessage aom(getId(), true, str);
                m_messages_out.push(aom);
@@ -990,14 +1022,6 @@ void PlayerSAO::step(float dtime, bool send_recommended)
                ActiveObjectMessage aom(getId(), true, str);
                m_messages_out.push(aom);
        }
-
-       if (m_nametag_sent == false) {
-               m_nametag_sent = true;
-               std::string str = gob_cmd_update_nametag_attributes(m_nametag_color);
-               // create message and add to list
-               ActiveObjectMessage aom(getId(), true, str);
-               m_messages_out.push(aom);
-       }
 }
 
 void PlayerSAO::setBasePosition(const v3f &position)
@@ -1166,20 +1190,22 @@ ItemGroupList PlayerSAO::getArmorGroups()
        return m_armor_groups;
 }
 
-void PlayerSAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend)
+void PlayerSAO::setAnimation(v2f frame_range, float frame_speed, float frame_blend, bool frame_loop)
 {
        // store these so they can be updated to clients
        m_animation_range = frame_range;
        m_animation_speed = frame_speed;
        m_animation_blend = frame_blend;
+       m_animation_loop = frame_loop;
        m_animation_sent = false;
 }
 
-void PlayerSAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend)
+void PlayerSAO::getAnimation(v2f *frame_range, float *frame_speed, float *frame_blend, bool *frame_loop)
 {
        *frame_range = m_animation_range;
        *frame_speed = m_animation_speed;
        *frame_blend = m_animation_blend;
+       *frame_loop = m_animation_loop;
 }
 
 void PlayerSAO::setBonePosition(const std::string &bone, v3f position, v3f rotation)
@@ -1221,25 +1247,29 @@ void PlayerSAO::getAttachment(int *parent_id, std::string *bone, v3f *position,
        *rotation = m_attachment_rotation;
 }
 
-ObjectProperties* PlayerSAO::accessObjectProperties()
+void PlayerSAO::addAttachmentChild(int child_id)
 {
-       return &m_prop;
+       m_attachment_child_ids.insert(child_id);
 }
 
-void PlayerSAO::notifyObjectPropertiesModified()
+void PlayerSAO::removeAttachmentChild(int child_id)
 {
-       m_properties_sent = false;
+       m_attachment_child_ids.erase(child_id);
 }
 
-void PlayerSAO::setNametagColor(video::SColor color)
+std::set<int> PlayerSAO::getAttachmentChildIds()
 {
-       m_nametag_color = color;
-       m_nametag_sent = false;
+       return m_attachment_child_ids;
 }
 
-video::SColor PlayerSAO::getNametagColor()
+ObjectProperties* PlayerSAO::accessObjectProperties()
 {
-       return m_nametag_color;
+       return &m_prop;
+}
+
+void PlayerSAO::notifyObjectPropertiesModified()
+{
+       m_properties_sent = false;
 }
 
 Inventory* PlayerSAO::getInventory()
@@ -1357,4 +1387,3 @@ bool PlayerSAO::getCollisionBox(aabb3f *toset) {
 bool PlayerSAO::collideWithObjects(){
        return true;
 }
-