]> git.lizzy.rs Git - minetest.git/blobdiff - src/content_cao.cpp
Hardware coloring for itemstacks
[minetest.git] / src / content_cao.cpp
index 83756c96390303364daa01f7ee0beb7d93e5a344..84f198b75f1d0c917de6daf7ebc6329965358fa0 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"
@@ -575,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),
@@ -932,28 +933,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) {
@@ -1222,9 +1233,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 +1313,7 @@ void GenericCAO::updateTexturePos()
        }
 }
 
-void GenericCAO::updateTextures(const std::string &mod)
+void GenericCAO::updateTextures(const std::string mod)
 {
        ITextureSource *tsrc = m_client->tsrc();
 
@@ -1310,6 +1321,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")
@@ -1612,6 +1626,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);
@@ -1735,7 +1755,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) {
@@ -1766,7 +1786,7 @@ void GenericCAO::processMessage(const std::string &data)
        } else {
                warningstream << FUNCTION_NAME
                        << ": unknown command or outdated client \""
-                       << cmd << std::endl;
+                       << +cmd << "\"" << std::endl;
        }
 }
 
@@ -1803,7 +1823,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;