]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/content_cao.cpp
Remove blank default values for emergequeue_limit_* settings
[dragonfireclient.git] / src / content_cao.cpp
index 0a1a92271e721fb41b9b96a30cedab84f15b3c3d..840103cc74644f7406ae98e569258b4c7bdad3e7 100644 (file)
@@ -223,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;
@@ -393,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;
@@ -661,6 +661,10 @@ class GenericCAO : public ClientActiveObject
                return false;
        }
 
+       bool collideWithObjects() {
+               return m_prop.collideWithObjects;
+       }
+
        void initialize(const std::string &data)
        {
                infostream<<"GenericCAO: Got init data"<<std::endl;
@@ -708,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)
@@ -860,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);
@@ -949,10 +957,11 @@ class GenericCAO : public ClientActiveObject
                }
                else if(m_prop.visual == "mesh"){
                        infostream<<"GenericCAO::addToScene(): mesh"<<std::endl;
-                       scene::IAnimatedMesh *mesh = smgr->getMesh(m_prop.mesh.c_str());
+                       scene::IAnimatedMesh *mesh = m_gamedef->getMesh(m_prop.mesh);
                        if(mesh)
                        {
                                m_animated_meshnode = smgr->addAnimatedMeshSceneNode(mesh, NULL);
+                               mesh->drop(); // The scene node took hold of it
                                m_animated_meshnode->animateJoints(); // Needed for some animations
                                m_animated_meshnode->setScale(v3f(m_prop.visual_size.X,
                                                m_prop.visual_size.Y,
@@ -1142,13 +1151,13 @@ class GenericCAO : public ClientActiveObject
                                box.MaxEdge *= BS;
                                collisionMoveResult moveresult;
                                f32 pos_max_d = BS*0.125; // Distance per iteration
-                               f32 stepheight = 0;
                                v3f p_pos = m_position;
                                v3f p_velocity = m_velocity;
                                v3f p_acceleration = m_acceleration;
                                moveresult = collisionMoveSimple(env,env->getGameDef(),
-                                               pos_max_d, box, stepheight, dtime,
-                                               p_pos, p_velocity, p_acceleration);
+                                               pos_max_d, box, m_prop.stepheight, dtime,
+                                               p_pos, p_velocity, p_acceleration,
+                                               this, m_prop.collideWithObjects);
                                // Apply results
                                m_position = p_pos;
                                m_velocity = p_velocity;
@@ -1202,6 +1211,12 @@ class GenericCAO : public ClientActiveObject
                        m_yaw += dtime * m_prop.automatic_rotate * 180 / M_PI;
                        updateNodePos();
                }
+
+               if (getParent() == NULL && 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;
+                       updateNodePos();
+               }
        }
 
        void updateTexturePos()
@@ -1264,12 +1279,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
@@ -1296,7 +1311,7 @@ class GenericCAO : public ClientActiveObject
                                        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;
@@ -1304,8 +1319,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);
 
@@ -1330,24 +1345,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
@@ -1374,7 +1384,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
@@ -1399,7 +1409,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
@@ -1640,6 +1650,8 @@ class GenericCAO : public ClientActiveObject
                        m_acceleration = readV3F1000(is);
                        if(fabs(m_prop.automatic_rotate) < 0.001)
                                m_yaw = readF1000(is);
+                       else
+                               readF1000(is);
                        bool do_interpolate = readU8(is);
                        bool is_end_position = readU8(is);
                        float update_interval = readF1000(is);
@@ -1684,12 +1696,18 @@ class GenericCAO : public ClientActiveObject
                        float override_speed = readF1000(is);
                        float override_jump = readF1000(is);
                        float override_gravity = readF1000(is);
+                       // these are sent inverted so we get true when the server sends nothing
+                       bool sneak = !readU8(is);
+                       bool sneak_glitch = !readU8(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;
+                               player->physics_override_sneak = sneak;
+                               player->physics_override_sneak_glitch = sneak_glitch;
                        }
                }
                else if(cmd == GENERIC_CMD_SET_ANIMATION)
@@ -1731,8 +1749,29 @@ class GenericCAO : public ClientActiveObject
                {
                        /*s16 damage =*/ readS16(is);
                        s16 result_hp = readS16(is);
-                       
+
+                       // Use this instead of the send damage to not interfere with prediction
+                       s16 damage = m_hp - result_hp;
+
                        m_hp = result_hp;
+
+                       if (damage > 0) {
+                               if (m_hp <= 0) {
+                                       // TODO: Execute defined fast response
+                                       // As there is no definition, make a smoke puff
+                                       ClientSimpleObject *simple = createSmokePuff(
+                                                       m_smgr, m_env, m_position,
+                                                       m_prop.visual_size * BS);
+                                       m_env->addSimpleObject(simple);
+                               } else {
+                                       // 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");
+                               }
+                       }
                }
                else if(cmd == GENERIC_CMD_UPDATE_ARMOR_GROUPS)
                {