ToolDefManager serialization
[oweals/minetest.git] / src / content_cao.h
index 146e23b0c985f0db3bd7f5fa0071866bbd88e543..3a3fbbcda071a4c259bf48bcc1149085950ab67e 100644 (file)
@@ -23,6 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "clientobject.h"
 #include "content_object.h"
 #include "utility.h" // For IntervalLimiter
+class Settings;
+#include "MyBillboardSceneNode.h"
 
 /*
        SmoothTranslator
@@ -31,19 +33,21 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 struct SmoothTranslator
 {
        v3f vect_old;
+       v3f vect_show;
+       v3f vect_aim;
        f32 anim_counter;
        f32 anim_time;
        f32 anim_time_counter;
-       v3f vect_show;
-       v3f vect_aim;
+       bool aim_is_end;
 
        SmoothTranslator():
                vect_old(0,0,0),
+               vect_show(0,0,0),
+               vect_aim(0,0,0),
                anim_counter(0),
                anim_time(0),
                anim_time_counter(0),
-               vect_show(0,0,0),
-               vect_aim(0,0,0)
+               aim_is_end(true)
        {}
 
        void init(v3f vect)
@@ -51,16 +55,30 @@ struct SmoothTranslator
                vect_old = vect;
                vect_show = vect;
                vect_aim = vect;
+               anim_counter = 0;
+               anim_time = 0;
+               anim_time_counter = 0;
+               aim_is_end = true;
        }
 
-       void update(v3f vect_new)
+       void sharpen()
        {
+               init(vect_show);
+       }
+
+       void update(v3f vect_new, bool is_end_position=false, float update_interval=-1)
+       {
+               aim_is_end = is_end_position;
                vect_old = vect_show;
                vect_aim = vect_new;
-               if(anim_time < 0.001 || anim_time > 1.0)
-                       anim_time = anim_time_counter;
-               else
-                       anim_time = anim_time * 0.9 + anim_time_counter * 0.1;
+               if(update_interval > 0){
+                       anim_time = update_interval;
+               } else {
+                       if(anim_time < 0.001 || anim_time > 1.0)
+                               anim_time = anim_time_counter;
+                       else
+                               anim_time = anim_time * 0.9 + anim_time_counter * 0.1;
+               }
                anim_time_counter = 0;
                anim_counter = 0;
        }
@@ -74,11 +92,19 @@ struct SmoothTranslator
                if(anim_time > 0.001)
                        moveratio = anim_time_counter / anim_time;
                // Move a bit less than should, to avoid oscillation
-               moveratio = moveratio * 0.8;
-               if(moveratio > 1.5)
-                       moveratio = 1.5;
+               moveratio = moveratio * 0.5;
+               float move_end = 1.5;
+               if(aim_is_end)
+                       move_end = 1.0;
+               if(moveratio > move_end)
+                       moveratio = move_end;
                vect_show = vect_old + vect_move * moveratio;
        }
+
+       bool is_moving()
+       {
+               return ((anim_time_counter / anim_time) < 1.4);
+       }
 };
 
 
@@ -89,7 +115,7 @@ struct SmoothTranslator
 class TestCAO : public ClientActiveObject
 {
 public:
-       TestCAO();
+       TestCAO(IGameDef *gamedef);
        virtual ~TestCAO();
        
        u8 getType() const
@@ -97,9 +123,9 @@ public:
                return ACTIVEOBJECT_TYPE_TEST;
        }
        
-       static ClientActiveObject* create();
+       static ClientActiveObject* create(IGameDef *gamedef);
 
-       void addToScene(scene::ISceneManager *smgr);
+       void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc);
        void removeFromScene();
        void updateLight(u8 light_at_pos);
        v3s16 getLightPosition();
@@ -121,7 +147,7 @@ private:
 class ItemCAO : public ClientActiveObject
 {
 public:
-       ItemCAO();
+       ItemCAO(IGameDef *gamedef);
        virtual ~ItemCAO();
        
        u8 getType() const
@@ -129,9 +155,9 @@ public:
                return ACTIVEOBJECT_TYPE_ITEM;
        }
        
-       static ClientActiveObject* create();
+       static ClientActiveObject* create(IGameDef *gamedef);
 
-       void addToScene(scene::ISceneManager *smgr);
+       void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc);
        void removeFromScene();
        void updateLight(u8 light_at_pos);
        v3s16 getLightPosition();
@@ -162,7 +188,7 @@ private:
 class RatCAO : public ClientActiveObject
 {
 public:
-       RatCAO();
+       RatCAO(IGameDef *gamedef);
        virtual ~RatCAO();
        
        u8 getType() const
@@ -170,9 +196,9 @@ public:
                return ACTIVEOBJECT_TYPE_RAT;
        }
        
-       static ClientActiveObject* create();
+       static ClientActiveObject* create(IGameDef *gamedef);
 
-       void addToScene(scene::ISceneManager *smgr);
+       void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc);
        void removeFromScene();
        void updateLight(u8 light_at_pos);
        v3s16 getLightPosition();
@@ -187,7 +213,8 @@ public:
        core::aabbox3d<f32>* getSelectionBox()
                {return &m_selection_box;}
        v3f getPosition()
-               {return m_position;}
+               {return pos_translator.vect_show;}
+               //{return m_position;}
 
 private:
        core::aabbox3d<f32> m_selection_box;
@@ -204,7 +231,7 @@ private:
 class Oerkki1CAO : public ClientActiveObject
 {
 public:
-       Oerkki1CAO();
+       Oerkki1CAO(IGameDef *gamedef);
        virtual ~Oerkki1CAO();
        
        u8 getType() const
@@ -212,9 +239,9 @@ public:
                return ACTIVEOBJECT_TYPE_OERKKI1;
        }
        
-       static ClientActiveObject* create();
+       static ClientActiveObject* create(IGameDef *gamedef);
 
-       void addToScene(scene::ISceneManager *smgr);
+       void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc);
        void removeFromScene();
        void updateLight(u8 light_at_pos);
        v3s16 getLightPosition();
@@ -232,6 +259,9 @@ public:
                {return pos_translator.vect_show;}
                //{return m_position;}
 
+       // If returns true, punch will not be sent to the server
+       bool directReportPunch(const std::string &toolname, v3f dir);
+
 private:
        IntervalLimiter m_attack_interval;
        core::aabbox3d<f32> m_selection_box;
@@ -243,6 +273,166 @@ private:
        bool m_damage_texture_enabled;
 };
 
+/*
+       FireflyCAO
+*/
+
+class FireflyCAO : public ClientActiveObject
+{
+public:
+       FireflyCAO(IGameDef *gamedef);
+       virtual ~FireflyCAO();
+       
+       u8 getType() const
+       {
+               return ACTIVEOBJECT_TYPE_FIREFLY;
+       }
+       
+       static ClientActiveObject* create(IGameDef *gamedef);
+
+       void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc);
+       void removeFromScene();
+       void updateLight(u8 light_at_pos);
+       v3s16 getLightPosition();
+       void updateNodePos();
+
+       void step(float dtime, ClientEnvironment *env);
+
+       void processMessage(const std::string &data);
+
+       void initialize(const std::string &data);
+       
+       core::aabbox3d<f32>* getSelectionBox()
+               {return &m_selection_box;}
+       v3f getPosition()
+               {return m_position;}
+
+private:
+       core::aabbox3d<f32> m_selection_box;
+       scene::IMeshSceneNode *m_node;
+       v3f m_position;
+       float m_yaw;
+       SmoothTranslator pos_translator;
+};
+
+/*
+       MobV2CAO
+*/
+
+class MobV2CAO : public ClientActiveObject
+{
+public:
+       MobV2CAO(IGameDef *gamedef);
+       virtual ~MobV2CAO();
+       
+       u8 getType() const
+       {
+               return ACTIVEOBJECT_TYPE_MOBV2;
+       }
+       
+       static ClientActiveObject* create(IGameDef *gamedef);
+
+       void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc);
+       void removeFromScene();
+       void updateLight(u8 light_at_pos);
+       v3s16 getLightPosition();
+       void updateNodePos();
+
+       void step(float dtime, ClientEnvironment *env);
+
+       void processMessage(const std::string &data);
+
+       void initialize(const std::string &data);
+       
+       core::aabbox3d<f32>* getSelectionBox()
+               {return &m_selection_box;}
+       v3f getPosition()
+               {return pos_translator.vect_show;}
+               //{return m_position;}
+       bool doShowSelectionBox(){return false;}
+
+       // If returns true, punch will not be sent to the server
+       bool directReportPunch(const std::string &toolname, v3f dir);
+
+private:
+       void setLooks(const std::string &looks);
+       
+       IntervalLimiter m_attack_interval;
+       core::aabbox3d<f32> m_selection_box;
+       scene::MyBillboardSceneNode *m_node;
+       v3f m_position;
+       std::string m_texture_name;
+       float m_yaw;
+       SmoothTranslator pos_translator;
+       bool m_walking;
+       float m_walking_unset_timer;
+       float m_walk_timer;
+       int m_walk_frame;
+       float m_damage_visual_timer;
+       u8 m_last_light;
+       bool m_shooting;
+       float m_shooting_unset_timer;
+       v2f m_sprite_size;
+       float m_sprite_y;
+       bool m_bright_shooting;
+       std::string m_sprite_type;
+       int m_simple_anim_frames;
+       float m_simple_anim_frametime;
+       bool m_lock_full_brightness;
+       int m_player_hit_damage;
+       float m_player_hit_distance;
+       float m_player_hit_interval;
+       float m_player_hit_timer;
+
+       Settings *m_properties;
+};
+
+/*
+       LuaEntityCAO
+*/
+
+struct LuaEntityProperties;
+
+class LuaEntityCAO : public ClientActiveObject
+{
+public:
+       LuaEntityCAO(IGameDef *gamedef);
+       virtual ~LuaEntityCAO();
+       
+       u8 getType() const
+       {
+               return ACTIVEOBJECT_TYPE_LUAENTITY;
+       }
+       
+       static ClientActiveObject* create(IGameDef *gamedef);
+
+       void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc);
+       void removeFromScene();
+       void updateLight(u8 light_at_pos);
+       v3s16 getLightPosition();
+       void updateNodePos();
+
+       void step(float dtime, ClientEnvironment *env);
+
+       void processMessage(const std::string &data);
+
+       void initialize(const std::string &data);
+       
+       core::aabbox3d<f32>* getSelectionBox()
+               {return &m_selection_box;}
+       v3f getPosition()
+               {return pos_translator.vect_show;}
+
+private:
+       core::aabbox3d<f32> m_selection_box;
+       scene::IMeshSceneNode *m_meshnode;
+       scene::MyBillboardSceneNode *m_spritenode;
+       v3f m_position;
+       float m_yaw;
+       struct LuaEntityProperties *m_prop;
+       SmoothTranslator pos_translator;
+};
+
 
 #endif