diff options
Diffstat (limited to 'src/clientobject.h')
-rw-r--r-- | src/clientobject.h | 226 |
1 files changed, 197 insertions, 29 deletions
diff --git a/src/clientobject.h b/src/clientobject.h index 840fe5ede..8d211fef3 100644 --- a/src/clientobject.h +++ b/src/clientobject.h @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "common_irrlicht.h" #include "activeobject.h" +#include "utility.h" /* @@ -35,6 +36,65 @@ Some planning */ +/* + SmoothTranslator +*/ + +struct SmoothTranslator +{ + v3f vect_old; + f32 anim_counter; + f32 anim_time; + f32 anim_time_counter; + v3f vect_show; + v3f vect_aim; + + SmoothTranslator(): + vect_old(0,0,0), + anim_counter(0), + anim_time(0), + anim_time_counter(0), + vect_show(0,0,0), + vect_aim(0,0,0) + {} + + void init(v3f vect) + { + vect_old = vect; + vect_show = vect; + vect_aim = vect; + } + + void update(v3f vect_new) + { + 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; + anim_time_counter = 0; + anim_counter = 0; + } + + void translate(f32 dtime) + { + anim_time_counter = anim_time_counter + dtime; + anim_counter = anim_counter + dtime; + v3f vect_move = vect_aim - vect_old; + f32 moveratio = 1.0; + 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; + vect_show = vect_old + vect_move * moveratio; + } +}; + +class ClientEnvironment; + class ClientActiveObject : public ActiveObject { public: @@ -46,16 +106,21 @@ public: // 0 <= light_at_pos <= LIGHT_SUN virtual void updateLight(u8 light_at_pos){} virtual v3s16 getLightPosition(){return v3s16(0,0,0);} + virtual core::aabbox3d<f32>* getSelectionBox(){return NULL;} + virtual core::aabbox3d<f32>* getCollisionBox(){return NULL;} + virtual v3f getPosition(){return v3f(0,0,0);} // Step object in time - virtual void step(float dtime){} + virtual void step(float dtime, ClientEnvironment *env){} // Process a message sent by the server side object virtual void processMessage(const std::string &data){} + virtual std::string infoText() {return "";} + /* - This takes the return value of getClientInitializationData - TODO: Usage of this + This takes the return value of + ServerActiveObject::getClientInitializationData */ virtual void initialize(const std::string &data){} @@ -63,12 +128,39 @@ public: static ClientActiveObject* create(u8 type); protected: + // Used for creating objects based on type + typedef ClientActiveObject* (*Factory)(); + static void registerType(u16 type, Factory f); +private: + // Used for creating objects based on type + static core::map<u16, Factory> m_types; +}; + +struct DistanceSortedActiveObject +{ + ClientActiveObject *obj; + f32 d; + + DistanceSortedActiveObject(ClientActiveObject *a_obj, f32 a_d) + { + obj = a_obj; + d = a_d; + } + + bool operator < (DistanceSortedActiveObject &other) + { + return d < other.d; + } }; +/* + TestCAO +*/ + class TestCAO : public ClientActiveObject { public: - TestCAO(u16 id); + TestCAO(); virtual ~TestCAO(); u8 getType() const @@ -76,13 +168,15 @@ public: return ACTIVEOBJECT_TYPE_TEST; } + static ClientActiveObject* create(); + void addToScene(scene::ISceneManager *smgr); void removeFromScene(); void updateLight(u8 light_at_pos); v3s16 getLightPosition(); void updateNodePos(); - void step(float dtime); + void step(float dtime, ClientEnvironment *env); void processMessage(const std::string &data); @@ -91,30 +185,63 @@ private: v3f m_position; }; -extern "C"{ -#include "lua.h" -#include "lualib.h" -#include "lauxlib.h" -} +/* + ItemCAO +*/ -class LuaCAO : public ClientActiveObject +class ItemCAO : public ClientActiveObject { public: - LuaCAO(u16 id); - virtual ~LuaCAO(); + ItemCAO(); + virtual ~ItemCAO(); u8 getType() const { - return ACTIVEOBJECT_TYPE_LUA; + return ACTIVEOBJECT_TYPE_ITEM; } - void step(float dtime); + static ClientActiveObject* create(); + + void addToScene(scene::ISceneManager *smgr); + 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; + std::string m_inventorystring; +}; + +/* + RatCAO +*/ - void loadScript(const std::string script); +class RatCAO : public ClientActiveObject +{ +public: + RatCAO(); + virtual ~RatCAO(); + + u8 getType() const + { + return ACTIVEOBJECT_TYPE_RAT; + } + + static ClientActiveObject* create(); void addToScene(scene::ISceneManager *smgr); void removeFromScene(); @@ -122,26 +249,67 @@ public: v3s16 getLightPosition(); void updateNodePos(); - void setPosition(v3f pos); - v3f getPosition(); + void step(float dtime, ClientEnvironment *env); + + void processMessage(const std::string &data); - void setRotation(v3f rot); - v3f getRotation(); + void initialize(const std::string &data); - // image: eg. "rat.png" - // corners: v3f corners[4] - void addToMesh(const char *image, v3f *corners, bool backface_culling); - void clearMesh(); + core::aabbox3d<f32>* getSelectionBox() + {return &m_selection_box;} + v3f getPosition() + {return m_position;} private: - lua_State* L; - - scene::ISceneManager *m_smgr; + core::aabbox3d<f32> m_selection_box; scene::IMeshSceneNode *m_node; - scene::SMesh *m_mesh; + v3f m_position; + float m_yaw; + SmoothTranslator pos_translator; +}; + +/* + Oerkki1CAO +*/ +class Oerkki1CAO : public ClientActiveObject +{ +public: + Oerkki1CAO(); + virtual ~Oerkki1CAO(); + + u8 getType() const + { + return ACTIVEOBJECT_TYPE_OERKKI1; + } + + static ClientActiveObject* create(); + + void addToScene(scene::ISceneManager *smgr); + 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;} + +private: + IntervalLimiter m_attack_interval; + core::aabbox3d<f32> m_selection_box; + scene::IMeshSceneNode *m_node; v3f m_position; - v3f m_rotation; + float m_yaw; + SmoothTranslator pos_translator; }; #endif |