]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/content_cao.cpp
Bump protocol version
[dragonfireclient.git] / src / content_cao.cpp
index 9c1171e1f8b6e1febb765a245f743b3b75e170e7..925855288f58ea025e6894fd51e40a56403c2d1b 100644 (file)
@@ -1,6 +1,6 @@
 /*
-Minetest-c55
-Copyright (C) 2010-2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU Lesser General Public License as published by
@@ -50,7 +50,7 @@ struct ToolCapabilities;
 
 #define PP(x) "("<<(x).X<<","<<(x).Y<<","<<(x).Z<<")"
 
-core::map<u16, ClientActiveObject::Factory> ClientActiveObject::m_types;
+std::map<u16, ClientActiveObject::Factory> ClientActiveObject::m_types;
 
 /*
        SmoothTranslator
@@ -174,6 +174,7 @@ class TestCAO : public ClientActiveObject
 
        void processMessage(const std::string &data);
 
+       bool getCollisionBox(aabb3f *toset) { return false; }
 private:
        scene::IMeshSceneNode *m_node;
        v3f m_position;
@@ -222,7 +223,7 @@ void TestCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc,
        // Set material
        buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
        buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
-       buf->getMaterial().setTexture(0, tsrc->getTextureRaw("rat.png"));
+       buf->getMaterial().setTexture(0, tsrc->getTexture("rat.png"));
        buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
        buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
        buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
@@ -329,6 +330,7 @@ class ItemCAO : public ClientActiveObject
        std::string infoText()
                {return m_infotext;}
 
+       bool getCollisionBox(aabb3f *toset) { return false; }
 private:
        core::aabbox3d<f32> m_selection_box;
        scene::IMeshSceneNode *m_node;
@@ -391,7 +393,7 @@ void ItemCAO::addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc,
        buf->getMaterial().setFlag(video::EMF_LIGHTING, false);
        buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false);
        // Initialize with a generated placeholder texture
-       buf->getMaterial().setTexture(0, tsrc->getTextureRaw(""));
+       buf->getMaterial().setTexture(0, tsrc->getTexture(""));
        buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false);
        buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true);
        buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
@@ -472,7 +474,7 @@ void ItemCAO::updateTexture()
                IItemDefManager *idef = m_gamedef->idef();
                ItemStack item;
                item.deSerialize(is, idef);
-               texture = item.getDefinition(idef).inventory_texture;
+               texture = idef->getInventoryTexture(item.getDefinition(idef).name, m_gamedef);
        }
        catch(SerializationError &e)
        {
@@ -643,26 +645,60 @@ class GenericCAO : public ClientActiveObject
                        ClientActiveObject::registerType(getType(), create);
        }
 
+       bool getCollisionBox(aabb3f *toset) {
+               if (m_prop.physical) {
+                       aabb3f retval;
+                       //update collision box
+                       toset->MinEdge = m_prop.collisionbox.MinEdge * BS;
+                       toset->MaxEdge = m_prop.collisionbox.MaxEdge * BS;
+
+                       toset->MinEdge += m_position;
+                       toset->MaxEdge += m_position;
+
+                       return true;
+               }
+
+               return false;
+       }
+
+       bool collideWithObjects() {
+               return m_prop.collideWithObjects;
+       }
+
        void initialize(const std::string &data)
        {
                infostream<<"GenericCAO: Got init data"<<std::endl;
                std::istringstream is(data, std::ios::binary);
+               int num_messages = 0;
                // version
                u8 version = readU8(is);
                // check version
-               if(version != 0){
+               if(version == 1) // In PROTOCOL_VERSION 14
+               {
+                       m_name = deSerializeString(is);
+                       m_is_player = readU8(is);
+                       m_id = readS16(is);
+                       m_position = readV3F1000(is);
+                       m_yaw = readF1000(is);
+                       m_hp = readS16(is);
+                       num_messages = readU8(is);
+               }
+               else if(version == 0) // In PROTOCOL_VERSION 13
+               {
+                       m_name = deSerializeString(is);
+                       m_is_player = readU8(is);
+                       m_position = readV3F1000(is);
+                       m_yaw = readF1000(is);
+                       m_hp = readS16(is);
+                       num_messages = readU8(is);
+               }
+               else
+               {
                        errorstream<<"GenericCAO: Unsupported init data version"
                                        <<std::endl;
                        return;
                }
-               m_name = deSerializeString(is);
-               m_is_player = readU8(is);
-               m_id = readS16(is);
-               m_position = readV3F1000(is);
-               m_yaw = readF1000(is);
-               m_hp = readS16(is);
-               
-               int num_messages = readU8(is);
+
                for(int i=0; i<num_messages; i++){
                        std::string message = deSerializeLongString(is);
                        processMessage(message);
@@ -676,11 +712,15 @@ class GenericCAO : public ClientActiveObject
                        if(player && player->isLocal()){
                                m_is_local_player = true;
                        }
+                       m_env->addPlayerName(m_name.c_str());
                }
        }
 
        ~GenericCAO()
        {
+               if(m_is_player){
+                       m_env->removePlayerName(m_name.c_str());
+               }
        }
 
        static ClientActiveObject* create(IGameDef *gamedef, ClientEnvironment *env)
@@ -828,7 +868,7 @@ class GenericCAO : public ClientActiveObject
                        m_spritenode = smgr->addBillboardSceneNode(
                                        NULL, v2f(1, 1), v3f(0,0,0), -1);
                        m_spritenode->setMaterialTexture(0,
-                                       tsrc->getTextureRaw("unknown_block.png"));
+                                       tsrc->getTexture("unknown_node.png"));
                        m_spritenode->setMaterialFlag(video::EMF_LIGHTING, false);
                        m_spritenode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
                        m_spritenode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
@@ -909,6 +949,11 @@ class GenericCAO : public ClientActiveObject
                                        m_prop.visual_size.X));
                        u8 li = m_last_light;
                        setMeshColor(m_meshnode->getMesh(), video::SColor(255,li,li,li));
+
+                       m_meshnode->setMaterialFlag(video::EMF_LIGHTING, false);
+                       m_meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
+                       m_meshnode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
+                       m_meshnode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
                }
                else if(m_prop.visual == "mesh"){
                        infostream<<"GenericCAO::addToScene(): mesh"<<std::endl;
@@ -922,6 +967,11 @@ class GenericCAO : public ClientActiveObject
                                                m_prop.visual_size.X));
                                u8 li = m_last_light;
                                setMeshColor(m_animated_meshnode->getMesh(), video::SColor(255,li,li,li));
+
+                               m_animated_meshnode->setMaterialFlag(video::EMF_LIGHTING, false);
+                               m_animated_meshnode->setMaterialFlag(video::EMF_BILINEAR_FILTER, false);
+                               m_animated_meshnode->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF);
+                               m_animated_meshnode->setMaterialFlag(video::EMF_FOG_ENABLE, true);
                        }
                        else
                                errorstream<<"GenericCAO::addToScene(): Could not load mesh "<<m_prop.mesh<<std::endl;
@@ -933,7 +983,7 @@ class GenericCAO : public ClientActiveObject
                                infostream<<"textures[0]: "<<m_prop.textures[0]<<std::endl;
                                IItemDefManager *idef = m_gamedef->idef();
                                ItemStack item(m_prop.textures[0], 1, 0, "", idef);
-                               scene::IMesh *item_mesh = item.getDefinition(idef).wield_mesh;
+                               scene::IMesh *item_mesh = idef->getWieldMesh(item.getDefinition(idef).name, m_gamedef);
                                
                                // Copy mesh to be able to set unique vertex colors
                                scene::IMeshManipulator *manip =
@@ -970,8 +1020,11 @@ class GenericCAO : public ClientActiveObject
                                        wname.c_str(), video::SColor(255,255,255,255), node);
                        m_textnode->setPosition(v3f(0, BS*1.1, 0));
                }
-               
+
                updateNodePos();
+               updateAnimation();
+               updateBonePosition();
+               updateAttachments();
        }
 
        void expireVisuals()
@@ -1049,9 +1102,6 @@ class GenericCAO : public ClientActiveObject
 
                        removeFromScene(false);
                        addToScene(m_smgr, m_gamedef->tsrc(), m_irr);
-                       updateAnimation();
-                       updateBonePosition();
-                       updateAttachments();
 
                        // Attachments, part 2: Now that the parent has been refreshed, put its attachments back
                        for(std::vector<core::vector2d<int> >::iterator ii = m_env->attachment_list.begin(); ii != m_env->attachment_list.end(); ii++)
@@ -1087,6 +1137,7 @@ class GenericCAO : public ClientActiveObject
                        {
                                LocalPlayer *player = m_env->getLocalPlayer();
                                player->overridePosition = getParent()->getPosition();
+                               m_env->getLocalPlayer()->parent = getParent();
                        }
                }
                else
@@ -1103,10 +1154,10 @@ class GenericCAO : public ClientActiveObject
                                v3f p_pos = m_position;
                                v3f p_velocity = m_velocity;
                                v3f p_acceleration = m_acceleration;
-                               IGameDef *gamedef = env->getGameDef();
-                               moveresult = collisionMoveSimple(&env->getMap(), gamedef,
+                               moveresult = collisionMoveSimple(env,env->getGameDef(),
                                                pos_max_d, box, stepheight, dtime,
-                                               p_pos, p_velocity, p_acceleration);
+                                               p_pos, p_velocity, p_acceleration,
+                                               this, m_prop.collideWithObjects);
                                // Apply results
                                m_position = p_pos;
                                m_velocity = p_velocity;
@@ -1222,12 +1273,12 @@ class GenericCAO : public ClientActiveObject
                {
                        if(m_prop.visual == "sprite")
                        {
-                               std::string texturestring = "unknown_block.png";
+                               std::string texturestring = "unknown_node.png";
                                if(m_prop.textures.size() >= 1)
                                        texturestring = m_prop.textures[0];
                                texturestring += mod;
                                m_spritenode->setMaterialTexture(0,
-                                               tsrc->getTextureRaw(texturestring));
+                                               tsrc->getTexture(texturestring));
 
                                // This allows setting per-material colors. However, until a real lighting
                                // system is added, the code below will have no effect. Once MineTest
@@ -1248,13 +1299,13 @@ class GenericCAO : public ClientActiveObject
                {
                        if(m_prop.visual == "mesh")
                        {
-                               for (u32 i = 0; i < m_prop.textures.size(); ++i)
+                               for (u32 i = 0; i < m_prop.textures.size() && i < m_animated_meshnode->getMaterialCount(); ++i)
                                {
                                        std::string texturestring = m_prop.textures[i];
                                        if(texturestring == "")
                                                continue; // Empty texture string means don't modify that material
                                        texturestring += mod;
-                                       video::ITexture* texture = tsrc->getTextureRaw(texturestring);
+                                       video::ITexture* texture = tsrc->getTexture(texturestring);
                                        if(!texture)
                                        {
                                                errorstream<<"GenericCAO::updateTextures(): Could not load texture "<<texturestring<<std::endl;
@@ -1262,8 +1313,8 @@ class GenericCAO : public ClientActiveObject
                                        }
 
                                        // Set material flags and texture
-                                       m_animated_meshnode->setMaterialTexture(i, texture);
                                        video::SMaterial& material = m_animated_meshnode->getMaterial(i);
+                                       material.TextureLayer[0].Texture = texture;
                                        material.setFlag(video::EMF_LIGHTING, false);
                                        material.setFlag(video::EMF_BILINEAR_FILTER, false);
 
@@ -1271,7 +1322,7 @@ class GenericCAO : public ClientActiveObject
                                        m_animated_meshnode->getMaterial(i).setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter);
                                        m_animated_meshnode->getMaterial(i).setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter);
                                }
-                               for (u32 i = 0; i < m_prop.colors.size(); ++i)
+                               for (u32 i = 0; i < m_prop.colors.size() && i < m_animated_meshnode->getMaterialCount(); ++i)
                                {
                                        // This allows setting per-material colors. However, until a real lighting
                                        // system is added, the code below will have no effect. Once MineTest
@@ -1288,24 +1339,19 @@ class GenericCAO : public ClientActiveObject
                        {
                                for (u32 i = 0; i < 6; ++i)
                                {
-                                       std::string texturestring = "unknown_block.png";
+                                       std::string texturestring = "unknown_node.png";
                                        if(m_prop.textures.size() > i)
                                                texturestring = m_prop.textures[i];
                                        texturestring += mod;
-                                       AtlasPointer ap = tsrc->getTexture(texturestring);
 
-                                       // Get the tile texture and atlas transformation
-                                       video::ITexture* atlas = ap.atlas;
-                                       v2f pos = ap.pos;
-                                       v2f size = ap.size;
 
                                        // Set material flags and texture
                                        video::SMaterial& material = m_meshnode->getMaterial(i);
                                        material.setFlag(video::EMF_LIGHTING, false);
                                        material.setFlag(video::EMF_BILINEAR_FILTER, false);
-                                       material.setTexture(0, atlas);
-                                       material.getTextureMatrix(0).setTextureTranslate(pos.X, pos.Y);
-                                       material.getTextureMatrix(0).setTextureScale(size.X, size.Y);
+                                       material.setTexture(0,
+                                                       tsrc->getTexture(texturestring));
+                                       material.getTextureMatrix(0).makeIdentity();
 
                                        // This allows setting per-material colors. However, until a real lighting
                                        // system is added, the code below will have no effect. Once MineTest
@@ -1332,7 +1378,7 @@ class GenericCAO : public ClientActiveObject
                                        tname += mod;
                                        scene::IMeshBuffer *buf = mesh->getMeshBuffer(0);
                                        buf->getMaterial().setTexture(0,
-                                                       tsrc->getTextureRaw(tname));
+                                                       tsrc->getTexture(tname));
                                        
                                        // This allows setting per-material colors. However, until a real lighting
                                        // system is added, the code below will have no effect. Once MineTest
@@ -1357,7 +1403,7 @@ class GenericCAO : public ClientActiveObject
                                        tname += mod;
                                        scene::IMeshBuffer *buf = mesh->getMeshBuffer(1);
                                        buf->getMaterial().setTexture(0,
-                                                       tsrc->getTextureRaw(tname));
+                                                       tsrc->getTexture(tname));
 
                                        // This allows setting per-material colors. However, until a real lighting
                                        // system is added, the code below will have no effect. Once MineTest
@@ -1637,6 +1683,19 @@ class GenericCAO : public ClientActiveObject
 
                        updateTexturePos();
                }
+               else if(cmd == GENERIC_CMD_SET_PHYSICS_OVERRIDE)
+               {
+                       float override_speed = readF1000(is);
+                       float override_jump = readF1000(is);
+                       float override_gravity = readF1000(is);
+                       if(m_is_local_player)
+                       {
+                               LocalPlayer *player = m_env->getLocalPlayer();
+                               player->physics_override_speed = override_speed;
+                               player->physics_override_jump = override_jump;
+                               player->physics_override_gravity = override_gravity;
+                       }
+               }
                else if(cmd == GENERIC_CMD_SET_ANIMATION)
                {
                        m_animation_range = readV2F1000(is);