Add Entity get_texture_mod() to Lua API
[oweals/minetest.git] / src / content_cao.cpp
index 93ac1f785fc0f33f5483c88f5e953268b2e17f69..e829fc7614dd85d8dfaa863c33e900bc224364f5 100644 (file)
@@ -574,6 +574,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),
@@ -952,7 +954,10 @@ void GenericCAO::addToScene(scene::ISceneManager *smgr,
                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) {
@@ -1221,9 +1226,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)
@@ -1301,7 +1306,7 @@ void GenericCAO::updateTexturePos()
        }
 }
 
-void GenericCAO::updateTextures(const std::string &mod)
+void GenericCAO::updateTextures(const std::string mod)
 {
        ITextureSource *tsrc = m_client->tsrc();
 
@@ -1309,6 +1314,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")
@@ -1611,6 +1619,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);
@@ -1734,7 +1748,7 @@ void GenericCAO::processMessage(const std::string &data)
                                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) {
@@ -1802,7 +1816,7 @@ bool GenericCAO::directReportPunch(v3f dir, const ItemStack *punchitem,
                m_reset_textures_timer = 0.05;
                if(result.damage >= 2)
                        m_reset_textures_timer += 0.05 * result.damage;
-               updateTextures("^[brighten");
+               updateTextures(m_current_texture_modifier + "^[brighten");
        }
 
        return false;