Tooltips: Unify the tooltip[] and list[] description tooltip display functions (...
[oweals/minetest.git] / src / content_cao.cpp
index a4c0bf14d8bb71f9a01d8cee3b297846391cbfb0..d15c53e7a36185ed60f53dc00b3c11dbe5a316e9 100644 (file)
@@ -26,7 +26,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "content_cao.h"
 #include "util/numeric.h" // For IntervalLimiter
 #include "util/serialize.h"
-#include "util/mathconstants.h"
 #include "util/basic_macros.h"
 #include "client/tile.h"
 #include "environment.h"
@@ -45,6 +44,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "camera.h" // CameraModes
 #include "wieldmesh.h"
 #include "log.h"
+#include <algorithm>
 
 class Settings;
 struct ToolCapabilities;
@@ -159,7 +159,7 @@ public:
 
        void processMessage(const std::string &data);
 
-       bool getCollisionBox(aabb3f *toset) { return false; }
+       bool getCollisionBox(aabb3f *toset) const { return false; }
 private:
        scene::IMeshSceneNode *m_node;
        v3f m_position;
@@ -316,7 +316,7 @@ public:
        std::string infoText()
                {return m_infotext;}
 
-       bool getCollisionBox(aabb3f *toset) { return false; }
+       bool getCollisionBox(aabb3f *toset) const { return false; }
 private:
        aabb3f m_selection_box;
        scene::IMeshSceneNode *m_node;
@@ -575,6 +575,8 @@ GenericCAO::GenericCAO(Client *client, ClientEnvironment *env):
                m_anim_framelength(0.2),
                m_anim_timer(0),
                m_reset_textures_timer(-1),
+               m_previous_texture_modifier(""),
+               m_current_texture_modifier(""),
                m_visuals_expired(false),
                m_step_distance_counter(0),
                m_last_light(255),
@@ -587,7 +589,7 @@ GenericCAO::GenericCAO(Client *client, ClientEnvironment *env):
        }
 }
 
-bool GenericCAO::getCollisionBox(aabb3f *toset)
+bool GenericCAO::getCollisionBox(aabb3f *toset) const
 {
        if (m_prop.physical)
        {
@@ -604,7 +606,7 @@ bool GenericCAO::getCollisionBox(aabb3f *toset)
        return false;
 }
 
-bool GenericCAO::collideWithObjects()
+bool GenericCAO::collideWithObjects() const
 {
        return m_prop.collideWithObjects;
 }
@@ -704,26 +706,11 @@ scene::ISceneNode* GenericCAO::getSceneNode()
        return NULL;
 }
 
-scene::IMeshSceneNode* GenericCAO::getMeshSceneNode()
-{
-       return m_meshnode;
-}
-
 scene::IAnimatedMeshSceneNode* GenericCAO::getAnimatedMeshSceneNode()
 {
        return m_animated_meshnode;
 }
 
-WieldMeshSceneNode* GenericCAO::getWieldMeshSceneNode()
-{
-       return m_wield_meshnode;
-}
-
-scene::IBillboardSceneNode* GenericCAO::getSpriteSceneNode()
-{
-       return m_spritenode;
-}
-
 void GenericCAO::setChildrenVisible(bool toset)
 {
        for (std::vector<u16>::size_type i = 0; i < m_children.size(); i++) {
@@ -932,28 +919,38 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr,
                        errorstream<<"GenericCAO::addToScene(): Could not load mesh "<<m_prop.mesh<<std::endl;
        }
        else if(m_prop.visual == "wielditem") {
-               infostream<<"GenericCAO::addToScene(): wielditem"<<std::endl;
-               infostream<<"textures: "<<m_prop.textures.size()<<std::endl;
-               if(m_prop.textures.size() >= 1){
-                       infostream<<"textures[0]: "<<m_prop.textures[0]<<std::endl;
-                       IItemDefManager *idef = m_client->idef();
-                       ItemStack item(m_prop.textures[0], 1, 0, "", idef);
-
-                       m_wield_meshnode = new WieldMeshSceneNode(
-                                       smgr->getRootSceneNode(), smgr, -1);
-                       m_wield_meshnode->setItem(item, m_client);
-
-                       m_wield_meshnode->setScale(v3f(m_prop.visual_size.X/2,
-                                       m_prop.visual_size.Y/2,
-                                       m_prop.visual_size.X/2));
-                       u8 li = m_last_light;
-                       m_wield_meshnode->setColor(video::SColor(255,li,li,li));
+               ItemStack item;
+               infostream << "GenericCAO::addToScene(): wielditem" << std::endl;
+               if (m_prop.wield_item == "") {
+                       // Old format, only textures are specified.
+                       infostream << "textures: " << m_prop.textures.size() << std::endl;
+                       if (m_prop.textures.size() >= 1) {
+                               infostream << "textures[0]: " << m_prop.textures[0]
+                                       << std::endl;
+                               IItemDefManager *idef = m_client->idef();
+                               item = ItemStack(m_prop.textures[0], 1, 0, idef);
+                       }
+               } else {
+                       infostream << "serialized form: " << m_prop.wield_item << std::endl;
+                       item.deSerialize(m_prop.wield_item, m_client->idef());
                }
+               m_wield_meshnode = new WieldMeshSceneNode(smgr->getRootSceneNode(),
+                       smgr, -1);
+               m_wield_meshnode->setItem(item, m_client);
+
+               m_wield_meshnode->setScale(
+                       v3f(m_prop.visual_size.X / 2, m_prop.visual_size.Y / 2,
+                               m_prop.visual_size.X / 2));
+               u8 li = m_last_light;
+               m_wield_meshnode->setColor(video::SColor(255, li, li, li));
        } else {
                infostream<<"GenericCAO::addToScene(): \""<<m_prop.visual
                                <<"\" not supported"<<std::endl;
        }
-       updateTextures("");
+
+       /* don't update while punch texture modifier is active */
+       if (m_reset_textures_timer < 0)
+               updateTextures(m_current_texture_modifier);
 
        scene::ISceneNode *node = getSceneNode();
        if (node && m_prop.nametag != "" && !m_is_local_player) {
@@ -1030,12 +1027,9 @@ void GenericCAO::updateNodePos()
 void GenericCAO::step(float dtime, ClientEnvironment *env)
 {
        // Handel model of local player instantly to prevent lags
-       if(m_is_local_player)
-       {
+       if (m_is_local_player) {
                LocalPlayer *player = m_env->getLocalPlayer();
-
-               if (m_is_visible)
-               {
+               if (m_is_visible) {
                        int old_anim = player->last_animation;
                        float old_anim_speed = player->last_animation_speed;
                        m_position = player->getPosition() + v3f(0,BS,0);
@@ -1043,7 +1037,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
                        m_acceleration = v3f(0,0,0);
                        pos_translator.vect_show = m_position;
                        m_yaw = player->getYaw();
-                       PlayerControl controls = player->getPlayerControl();
+                       const PlayerControl &controls = player->getPlayerControl();
 
                        bool walking = false;
                        if (controls.up || controls.down || controls.left || controls.right ||
@@ -1064,11 +1058,10 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
                                        m_client->checkLocalPrivilege("fly"))))
                                        new_speed *= 1.5;
                        // slowdown speed if sneeking
-                       if(controls.sneak && walking)
+                       if (controls.sneak && walking)
                                new_speed /= 2;
 
-                       if(walking && (controls.LMB || controls.RMB))
-                       {
+                       if (walking && (controls.LMB || controls.RMB)) {
                                new_anim = player->local_animations[3];
                                player->last_animation = WD_ANIM;
                        } else if(walking) {
@@ -1081,8 +1074,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
 
                        // Apply animations if input detected and not attached
                        // or set idle animation
-                       if ((new_anim.X + new_anim.Y) > 0 && !player->isAttached)
-                       {
+                       if ((new_anim.X + new_anim.Y) > 0 && !player->isAttached) {
                                allow_update = true;
                                m_animation_range = new_anim;
                                m_animation_speed = new_speed;
@@ -1090,8 +1082,7 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
                        } else {
                                player->last_animation = NO_ANIM;
 
-                               if (old_anim != NO_ANIM)
-                               {
+                               if (old_anim != NO_ANIM) {
                                        m_animation_range = player->local_animations[0];
                                        updateAnimation();
                                }
@@ -1222,9 +1213,9 @@ void GenericCAO::step(float dtime, ClientEnvironment *env)
        if(m_reset_textures_timer >= 0)
        {
                m_reset_textures_timer -= dtime;
-               if(m_reset_textures_timer <= 0){
+               if(m_reset_textures_timer <= 0) {
                        m_reset_textures_timer = -1;
-                       updateTextures("");
+                       updateTextures(m_previous_texture_modifier);
                }
        }
        if(getParent() == NULL && fabs(m_prop.automatic_rotate) > 0.001)
@@ -1302,7 +1293,7 @@ void GenericCAO::updateTexturePos()
        }
 }
 
-void GenericCAO::updateTextures(const std::string &mod)
+void GenericCAO::updateTextures(std::string mod)
 {
        ITextureSource *tsrc = m_client->tsrc();
 
@@ -1310,6 +1301,9 @@ void GenericCAO::updateTextures(const std::string &mod)
        bool use_bilinear_filter = g_settings->getBool("bilinear_filter");
        bool use_anisotropic_filter = g_settings->getBool("anisotropic_filter");
 
+       m_previous_texture_modifier = m_current_texture_modifier;
+       m_current_texture_modifier = mod;
+
        if(m_spritenode)
        {
                if(m_prop.visual == "sprite")
@@ -1575,6 +1569,10 @@ void GenericCAO::processMessage(const std::string &data)
                        m_initial_tx_basepos_set = true;
                        m_tx_basepos = m_prop.initial_sprite_basepos;
                }
+               if (m_is_local_player) {
+                       LocalPlayer *player = m_env->getLocalPlayer();
+                       player->makes_footstep_sound = m_prop.makes_footstep_sound;
+               }
 
                if ((m_is_player && !m_is_local_player) && m_prop.nametag == "")
                        m_prop.nametag = m_name;
@@ -1612,6 +1610,12 @@ void GenericCAO::processMessage(const std::string &data)
                updateNodePos();
        } else if (cmd == GENERIC_CMD_SET_TEXTURE_MOD) {
                std::string mod = deSerializeString(is);
+
+               // immediatly reset a engine issued texture modifier if a mod sends a different one
+               if (m_reset_textures_timer > 0) {
+                       m_reset_textures_timer = -1;
+                       updateTextures(m_previous_texture_modifier);
+               }
                updateTextures(mod);
        } else if (cmd == GENERIC_CMD_SET_SPRITE) {
                v2s16 p = readV2S16(is);
@@ -1632,6 +1636,7 @@ void GenericCAO::processMessage(const std::string &data)
                // these are sent inverted so we get true when the server sends nothing
                bool sneak = !readU8(is);
                bool sneak_glitch = !readU8(is);
+               bool new_move = !readU8(is);
 
 
                if(m_is_local_player)
@@ -1642,6 +1647,7 @@ void GenericCAO::processMessage(const std::string &data)
                        player->physics_override_gravity = override_gravity;
                        player->physics_override_sneak = sneak;
                        player->physics_override_sneak_glitch = sneak_glitch;
+                       player->physics_override_new_move = new_move;
                }
        } else if (cmd == GENERIC_CMD_SET_ANIMATION) {
                // TODO: change frames send as v2s32 value
@@ -1729,13 +1735,13 @@ void GenericCAO::processMessage(const std::string &data)
                                                m_smgr, m_env, m_position,
                                                m_prop.visual_size * BS);
                                m_env->addSimpleObject(simple);
-                       } else {
+                       } else if (m_reset_textures_timer < 0) {
                                // TODO: Execute defined fast response
                                // Flashing shall suffice as there is no definition
                                m_reset_textures_timer = 0.05;
                                if(damage >= 2)
                                        m_reset_textures_timer += 0.05 * damage;
-                               updateTextures("^[brighten");
+                               updateTextures(m_current_texture_modifier + "^[brighten");
                        }
                }
        } else if (cmd == GENERIC_CMD_UPDATE_ARMOR_GROUPS) {
@@ -1766,7 +1772,7 @@ void GenericCAO::processMessage(const std::string &data)
        } else {
                warningstream << FUNCTION_NAME
                        << ": unknown command or outdated client \""
-                       << cmd << std::endl;
+                       << +cmd << "\"" << std::endl;
        }
 }
 
@@ -1800,10 +1806,12 @@ bool GenericCAO::directReportPunch(v3f dir, const ItemStack *punchitem,
                }
                // TODO: Execute defined fast response
                // Flashing shall suffice as there is no definition
-               m_reset_textures_timer = 0.05;
-               if(result.damage >= 2)
-                       m_reset_textures_timer += 0.05 * result.damage;
-               updateTextures("^[brighten");
+               if (m_reset_textures_timer < 0) {
+                       m_reset_textures_timer = 0.05;
+                       if (result.damage >= 2)
+                               m_reset_textures_timer += 0.05 * result.damage;
+                       updateTextures(m_current_texture_modifier + "^[brighten");
+               }
        }
 
        return false;