X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fcontent_cao.h;h=69e2e54a264502fef563f2a48de2e3065d750e20;hb=77137a92cfc221b885b8eae68f13cede604fcac7;hp=3a3fbbcda071a4c259bf48bcc1149085950ab67e;hpb=abceeee92f99b84ebb79968269835a4f509bfb90;p=minetest.git diff --git a/src/content_cao.h b/src/content_cao.h index 3a3fbbcda..69e2e54a2 100644 --- a/src/content_cao.h +++ b/src/content_cao.h @@ -1,18 +1,18 @@ /* -Minetest-c55 -Copyright (C) 2010-2011 celeron55, Perttu Ahola +Minetest +Copyright (C) 2010-2013 celeron55, Perttu Ahola This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Lesser General Public License for more details. -You should have received a copy of the GNU General Public License along +You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ @@ -20,11 +20,12 @@ with this program; if not, write to the Free Software Foundation, Inc., #ifndef CONTENT_CAO_HEADER #define CONTENT_CAO_HEADER -#include "clientobject.h" +#include +#include "irrlichttypes_extrabloated.h" #include "content_object.h" -#include "utility.h" // For IntervalLimiter -class Settings; -#include "MyBillboardSceneNode.h" +#include "clientobject.h" +#include "object_properties.h" +#include "itemgroup.h" /* SmoothTranslator @@ -40,399 +41,164 @@ struct SmoothTranslator f32 anim_time_counter; 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), - aim_is_end(true) - {} - - void init(v3f vect) - { - vect_old = vect; - vect_show = vect; - vect_aim = vect; - anim_counter = 0; - anim_time = 0; - anim_time_counter = 0; - aim_is_end = true; - } - - 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(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; - } - - 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.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); - } -}; - - -/* - TestCAO -*/ + SmoothTranslator(); -class TestCAO : public ClientActiveObject -{ -public: - TestCAO(IGameDef *gamedef); - virtual ~TestCAO(); - - u8 getType() const - { - return ACTIVEOBJECT_TYPE_TEST; - } - - static ClientActiveObject* create(IGameDef *gamedef); + void init(v3f vect); - void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc); - void removeFromScene(); - void updateLight(u8 light_at_pos); - v3s16 getLightPosition(); - void updateNodePos(); + void sharpen(); - void step(float dtime, ClientEnvironment *env); + void update(v3f vect_new, bool is_end_position=false, float update_interval=-1); - void processMessage(const std::string &data); + void translate(f32 dtime); -private: - scene::IMeshSceneNode *m_node; - v3f m_position; + bool is_moving(); }; -/* - ItemCAO -*/ - -class ItemCAO : public ClientActiveObject +class GenericCAO : public ClientActiveObject { -public: - ItemCAO(IGameDef *gamedef); - virtual ~ItemCAO(); - - u8 getType() const - { - return ACTIVEOBJECT_TYPE_ITEM; - } - - 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* getSelectionBox() - {return &m_selection_box;} - v3f getPosition() - {return m_position;} - private: + // Only set at initialization + std::string m_name; + bool m_is_player; + bool m_is_local_player; + int m_id; + // Property-ish things + ObjectProperties m_prop; + // + scene::ISceneManager *m_smgr; + IrrlichtDevice *m_irr; core::aabbox3d m_selection_box; - scene::IMeshSceneNode *m_node; + scene::IMeshSceneNode *m_meshnode; + scene::IAnimatedMeshSceneNode *m_animated_meshnode; + WieldMeshSceneNode *m_wield_meshnode; + scene::IBillboardSceneNode *m_spritenode; + scene::ITextSceneNode* m_textnode; v3f m_position; - std::string m_inventorystring; -}; + v3f m_velocity; + v3f m_acceleration; + float m_yaw; + s16 m_hp; + SmoothTranslator pos_translator; + // Spritesheet/animation stuff + v2f m_tx_size; + v2s16 m_tx_basepos; + bool m_initial_tx_basepos_set; + bool m_tx_select_horiz_by_yawpitch; + v2s32 m_animation_range; + int m_animation_speed; + int m_animation_blend; + std::map > m_bone_position; // stores position and rotation for each bone name + std::string m_attachment_bone; + v3f m_attachment_position; + v3f m_attachment_rotation; + bool m_attached_to_local; + int m_anim_frame; + int m_anim_num_frames; + float m_anim_framelength; + float m_anim_timer; + ItemGroupList m_armor_groups; + float m_reset_textures_timer; + bool m_visuals_expired; + float m_step_distance_counter; + u8 m_last_light; + bool m_is_visible; -/* - RatCAO -*/ + std::vector m_children; -class RatCAO : public ClientActiveObject -{ public: - RatCAO(IGameDef *gamedef); - virtual ~RatCAO(); - - u8 getType() const - { - return ACTIVEOBJECT_TYPE_RAT; - } - - static ClientActiveObject* create(IGameDef *gamedef); + GenericCAO(IGameDef *gamedef, ClientEnvironment *env); - void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc); - void removeFromScene(); - void updateLight(u8 light_at_pos); - v3s16 getLightPosition(); - void updateNodePos(); + ~GenericCAO(); - void step(float dtime, ClientEnvironment *env); + static ClientActiveObject* create(IGameDef *gamedef, ClientEnvironment *env) + { + return new GenericCAO(gamedef, env); + } - void processMessage(const std::string &data); + inline u8 getType() const + { + return ACTIVEOBJECT_TYPE_GENERIC; + } void initialize(const std::string &data); - - core::aabbox3d* getSelectionBox() - {return &m_selection_box;} - v3f getPosition() - {return pos_translator.vect_show;} - //{return m_position;} -private: - core::aabbox3d m_selection_box; - scene::IMeshSceneNode *m_node; - v3f m_position; - float m_yaw; - SmoothTranslator pos_translator; -}; + ClientActiveObject *getParent(); -/* - Oerkki1CAO -*/ + bool getCollisionBox(aabb3f *toset); -class Oerkki1CAO : public ClientActiveObject -{ -public: - Oerkki1CAO(IGameDef *gamedef); - virtual ~Oerkki1CAO(); - - u8 getType() const - { - return ACTIVEOBJECT_TYPE_OERKKI1; - } - - static ClientActiveObject* create(IGameDef *gamedef); + bool collideWithObjects(); - void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc); - void removeFromScene(); - void updateLight(u8 light_at_pos); - v3s16 getLightPosition(); - void updateNodePos(); + core::aabbox3d* getSelectionBox(); - void step(float dtime, ClientEnvironment *env); + v3f getPosition(); - void processMessage(const std::string &data); + scene::ISceneNode *getSceneNode(); - void initialize(const std::string &data); - - core::aabbox3d* getSelectionBox() - {return &m_selection_box;} - v3f getPosition() - {return pos_translator.vect_show;} - //{return m_position;} + scene::IMeshSceneNode *getMeshSceneNode(); - // If returns true, punch will not be sent to the server - bool directReportPunch(const std::string &toolname, v3f dir); + scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode(); -private: - IntervalLimiter m_attack_interval; - core::aabbox3d m_selection_box; - scene::IMeshSceneNode *m_node; - v3f m_position; - float m_yaw; - SmoothTranslator pos_translator; - float m_damage_visual_timer; - bool m_damage_texture_enabled; -}; + WieldMeshSceneNode *getWieldMeshSceneNode(); -/* - FireflyCAO -*/ + scene::IBillboardSceneNode *getSpriteSceneNode(); -class FireflyCAO : public ClientActiveObject -{ -public: - FireflyCAO(IGameDef *gamedef); - virtual ~FireflyCAO(); - - u8 getType() const + inline bool isPlayer() const { - return ACTIVEOBJECT_TYPE_FIREFLY; + return m_is_player; } - - static ClientActiveObject* create(IGameDef *gamedef); - void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc); - void removeFromScene(); - void updateLight(u8 light_at_pos); - v3s16 getLightPosition(); - void updateNodePos(); + inline bool isLocalPlayer() const + { + return m_is_local_player; + } - void step(float dtime, ClientEnvironment *env); + inline bool isVisible() const + { + return m_is_visible; + } - void processMessage(const std::string &data); + inline void setVisible(bool toset) + { + m_is_visible = toset; + } - void initialize(const std::string &data); - - core::aabbox3d* getSelectionBox() - {return &m_selection_box;} - v3f getPosition() - {return m_position;} + void setAttachments(); -private: - core::aabbox3d m_selection_box; - scene::IMeshSceneNode *m_node; - v3f m_position; - float m_yaw; - SmoothTranslator pos_translator; -}; + void removeFromScene(bool permanent); -/* - MobV2CAO -*/ + void addToScene(scene::ISceneManager *smgr, ITextureSource *tsrc, + IrrlichtDevice *irr); -class MobV2CAO : public ClientActiveObject -{ -public: - MobV2CAO(IGameDef *gamedef); - virtual ~MobV2CAO(); - - u8 getType() const + inline void expireVisuals() { - return ACTIVEOBJECT_TYPE_MOBV2; + m_visuals_expired = true; } - - 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 updateTexturePos(); - void initialize(const std::string &data); - - core::aabbox3d* getSelectionBox() - {return &m_selection_box;} - v3f getPosition() - {return pos_translator.vect_show;} - //{return m_position;} - bool doShowSelectionBox(){return false;} + void updateTextures(const std::string &mod); - // If returns true, punch will not be sent to the server - bool directReportPunch(const std::string &toolname, v3f dir); + void updateAnimation(); -private: - void setLooks(const std::string &looks); - - IntervalLimiter m_attack_interval; - core::aabbox3d 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; -}; + void updateBonePosition(); -/* - 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 updateAttachments(); void processMessage(const std::string &data); - void initialize(const std::string &data); - - core::aabbox3d* getSelectionBox() - {return &m_selection_box;} - v3f getPosition() - {return pos_translator.vect_show;} + bool directReportPunch(v3f dir, const ItemStack *punchitem=NULL, + float time_from_last_punch=1000000); -private: - core::aabbox3d m_selection_box; - scene::IMeshSceneNode *m_meshnode; - scene::MyBillboardSceneNode *m_spritenode; - v3f m_position; - float m_yaw; - struct LuaEntityProperties *m_prop; - SmoothTranslator pos_translator; + std::string debugInfoText(); }; #endif -