X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Fcontent_cao.h;h=575aad24145f9adac48a4c1432f1bf96087417bf;hb=0a83c42dfdf390cef75758096a481cdf8e2c828b;hp=319f90380f6d4a3afa4fe741386507a189215b10;hpb=96bee29e35f0790657fbd8bb67d2af79b498255c;p=minetest.git diff --git a/src/content_cao.h b/src/content_cao.h index 319f90380..575aad241 100644 --- a/src/content_cao.h +++ b/src/content_cao.h @@ -1,28 +1,34 @@ /* -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. */ -#ifndef CONTENT_CAO_HEADER -#define CONTENT_CAO_HEADER +#pragma once +#include +#include "irrlichttypes_extrabloated.h" #include "clientobject.h" -#include "content_object.h" -#include "utility.h" // For IntervalLimiter +#include "object_properties.h" +#include "itemgroup.h" +#include "constants.h" + +class Camera; +class Client; +struct Nametag; /* SmoothTranslator @@ -31,261 +37,182 @@ with this program; if not, write to the Free Software Foundation, Inc., struct SmoothTranslator { v3f vect_old; - f32 anim_counter; - f32 anim_time; - f32 anim_time_counter; v3f vect_show; v3f vect_aim; + f32 anim_counter = 0; + f32 anim_time = 0; + f32 anim_time_counter = 0; + bool aim_is_end = true; - 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) - {} + SmoothTranslator() = default; - void init(v3f vect) - { - vect_old = vect; - vect_show = vect; - vect_aim = vect; - } + void init(v3f 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 update(v3f vect_new, bool is_end_position=false, float update_interval=-1); - 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; - } + void translate(f32 dtime); }; - -/* - TestCAO -*/ - -class TestCAO : public ClientActiveObject +class GenericCAO : public ClientActiveObject { +private: + // Only set at initialization + std::string m_name = ""; + bool m_is_player = false; + bool m_is_local_player = false; + // Property-ish things + ObjectProperties m_prop; + // + scene::ISceneManager *m_smgr = nullptr; + Client *m_client = nullptr; + aabb3f m_selection_box = aabb3f(-BS/3.,-BS/3.,-BS/3., BS/3.,BS/3.,BS/3.); + scene::IMeshSceneNode *m_meshnode = nullptr; + scene::IAnimatedMeshSceneNode *m_animated_meshnode = nullptr; + WieldMeshSceneNode *m_wield_meshnode = nullptr; + scene::IBillboardSceneNode *m_spritenode = nullptr; + Nametag *m_nametag = nullptr; + v3f m_position = v3f(0.0f, 10.0f * BS, 0); + v3f m_velocity; + v3f m_acceleration; + float m_yaw = 0.0f; + s16 m_hp = 1; + SmoothTranslator pos_translator; + // Spritesheet/animation stuff + v2f m_tx_size = v2f(1,1); + v2s16 m_tx_basepos; + bool m_initial_tx_basepos_set = false; + bool m_tx_select_horiz_by_yawpitch = false; + v2s32 m_animation_range; + float m_animation_speed = 15.0f; + float m_animation_blend = 0.0f; + bool m_animation_loop = true; + // stores position and rotation for each bone name + std::unordered_map> m_bone_position; + std::string m_attachment_bone = ""; + v3f m_attachment_position; + v3f m_attachment_rotation; + bool m_attached_to_local = false; + int m_anim_frame = 0; + int m_anim_num_frames = 1; + float m_anim_framelength = 0.2f; + float m_anim_timer = 0.0f; + ItemGroupList m_armor_groups; + float m_reset_textures_timer = -1.0f; + // stores texture modifier before punch update + std::string m_previous_texture_modifier = ""; + // last applied texture modifier + std::string m_current_texture_modifier = ""; + bool m_visuals_expired = false; + float m_step_distance_counter = 0.0f; + u8 m_last_light = 255; + bool m_is_visible = false; + s8 m_glow = 0; + + std::vector m_children; + public: - TestCAO(); - virtual ~TestCAO(); - - u8 getType() const + GenericCAO(Client *client, ClientEnvironment *env); + + ~GenericCAO(); + + static ClientActiveObject* create(Client *client, ClientEnvironment *env) { - return ACTIVEOBJECT_TYPE_TEST; + return new GenericCAO(client, env); } - - 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); + inline ActiveObjectType getType() const + { + return ACTIVEOBJECT_TYPE_GENERIC; + } - void processMessage(const std::string &data); + void initialize(const std::string &data); -private: - scene::IMeshSceneNode *m_node; - v3f m_position; -}; + void processInitData(const std::string &data); -/* - ItemCAO -*/ + ClientActiveObject *getParent() const; -class ItemCAO : public ClientActiveObject -{ -public: - ItemCAO(); - virtual ~ItemCAO(); - - u8 getType() const - { - return ACTIVEOBJECT_TYPE_ITEM; - } - - static ClientActiveObject* create(); + bool getCollisionBox(aabb3f *toset) const; - void addToScene(scene::ISceneManager *smgr); - void removeFromScene(); - void updateLight(u8 light_at_pos); - v3s16 getLightPosition(); - void updateNodePos(); + bool collideWithObjects() const; - void step(float dtime, ClientEnvironment *env); + virtual bool getSelectionBox(aabb3f *toset) const; - void processMessage(const std::string &data); + v3f getPosition(); + inline float getYaw() const + { + return m_yaw; + } - void initialize(const std::string &data); - - core::aabbox3d* getSelectionBox() - {return &m_selection_box;} - v3f getPosition() - {return m_position;} + scene::ISceneNode *getSceneNode(); -private: - core::aabbox3d m_selection_box; - scene::IMeshSceneNode *m_node; - v3f m_position; - std::string m_inventorystring; -}; + scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode(); -/* - RatCAO -*/ + inline f32 getStepHeight() const + { + return m_prop.stepheight; + } -class RatCAO : public ClientActiveObject -{ -public: - RatCAO(); - virtual ~RatCAO(); - - u8 getType() const + inline bool isLocalPlayer() const { - return ACTIVEOBJECT_TYPE_RAT; + return m_is_local_player; } - - static ClientActiveObject* create(); - void addToScene(scene::ISceneManager *smgr); - void removeFromScene(); - void updateLight(u8 light_at_pos); - v3s16 getLightPosition(); - void updateNodePos(); + inline bool isVisible() const + { + return m_is_visible; + } - void step(float dtime, ClientEnvironment *env); + inline void setVisible(bool toset) + { + m_is_visible = toset; + } - void processMessage(const std::string &data); + void setChildrenVisible(bool toset); - void initialize(const std::string &data); - - core::aabbox3d* getSelectionBox() - {return &m_selection_box;} - v3f getPosition() - {return pos_translator.vect_show;} - //{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); -/* - Oerkki1CAO -*/ + void addToScene(ITextureSource *tsrc); -class Oerkki1CAO : public ClientActiveObject -{ -public: - Oerkki1CAO(); - virtual ~Oerkki1CAO(); - - u8 getType() const + inline void expireVisuals() { - return ACTIVEOBJECT_TYPE_OERKKI1; + m_visuals_expired = true; } - - static ClientActiveObject* create(); - void addToScene(scene::ISceneManager *smgr); - void removeFromScene(); void updateLight(u8 light_at_pos); + + void updateLightNoCheck(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;} + // std::string copy is mandatory as mod can be a class member and there is a swap + // on those class members + void updateTextures(std::string mod); -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; -}; + void updateAnimation(); -/* - FireflyCAO -*/ + void updateAnimationSpeed(); -class FireflyCAO : public ClientActiveObject -{ -public: - FireflyCAO(); - virtual ~FireflyCAO(); - - u8 getType() const - { - return ACTIVEOBJECT_TYPE_FIREFLY; - } - - static ClientActiveObject* create(); + void updateBonePosition(); - void addToScene(scene::ISceneManager *smgr); - 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 m_position;} + bool directReportPunch(v3f dir, const ItemStack *punchitem=NULL, + float time_from_last_punch=1000000); -private: - core::aabbox3d m_selection_box; - scene::IMeshSceneNode *m_node; - v3f m_position; - float m_yaw; - SmoothTranslator pos_translator; -}; - - -#endif + std::string debugInfoText(); + std::string infoText() + { + return m_prop.infotext; + } +};