]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/client/localplayer.h
Merge branch 'master' of https://github.com/minetest/minetest
[dragonfireclient.git] / src / client / localplayer.h
index 7148bc4ded9c8837a8372d2c42583dc1aa9dbf15..0e071d2b4862a0eb117bbce618c2a831b4a08118 100644 (file)
@@ -31,6 +31,7 @@ class GenericCAO;
 class ClientActiveObject;
 class ClientEnvironment;
 class IGameDef;
+struct ContentFeatures;
 struct collisionMoveResult;
 
 enum LocalPlayerAnimations
@@ -47,12 +48,9 @@ class LocalPlayer : public Player
        LocalPlayer(Client *client, const char *name);
        virtual ~LocalPlayer() = default;
 
-       ClientActiveObject *parent = nullptr;
-
        // Initialize hp to 0, so that no hearts will be shown if server
        // doesn't support health points
        u16 hp = 0;
-       bool isAttached = false;
        bool touching_ground = false;
        // This oscillates so that the player jumps a bit above the surface
        bool in_liquid = false;
@@ -62,6 +60,7 @@ class LocalPlayer : public Player
        u8 liquid_viscosity = 0;
        bool is_climbing = false;
        bool swimming_vertical = false;
+       bool swimming_pitch = false;
 
        float physics_override_speed = 1.0f;
        float physics_override_jump = 1.0f;
@@ -71,8 +70,6 @@ class LocalPlayer : public Player
        // Temporary option for old move code
        bool physics_override_new_move = true;
 
-       v3f overridePosition;
-
        void move(f32 dtime, Environment *env, f32 pos_max_d);
        void move(f32 dtime, Environment *env, f32 pos_max_d,
                        std::vector<CollisionInfo> *collision_info);
@@ -99,7 +96,7 @@ class LocalPlayer : public Player
        bool makes_footstep_sound = true;
 
        int last_animation = NO_ANIM;
-       float last_animation_speed;
+       float last_animation_speed = 0.0f;
 
        std::string hotbar_image = "";
        std::string hotbar_selected_image = "";
@@ -111,6 +108,8 @@ class LocalPlayer : public Player
 
        GenericCAO *getCAO() const { return m_cao; }
 
+       ClientActiveObject *getParent() const;
+
        void setCAO(GenericCAO *toset)
        {
                assert(!m_cao); // Pre-condition
@@ -133,32 +132,79 @@ class LocalPlayer : public Player
        inline void setPosition(const v3f &position)
        {
                m_position = position;
+               if (! m_freecam)
+                       m_legit_position = position;
                m_sneak_node_exists = false;
        }
 
        v3f getPosition() const { return m_position; }
+
+       v3f getLegitPosition() const { return m_legit_position; }
+       
+       v3f getLegitSpeed() const { return m_legit_speed; }
+
+       inline void setLegitPosition(const v3f &position)
+       {
+               if (m_freecam)
+                       m_legit_position = position;
+               else
+                       setPosition(position);
+       }
+
+       inline void freecamEnable() 
+       {
+               m_freecam = true;
+       }
+       
+       inline void freecamDisable() 
+       {
+               m_freecam = false;
+               setPosition(m_legit_position);
+               setSpeed(m_legit_speed);
+       }
+       
+       // Non-transformed eye offset getters
+       // For accurate positions, use the Camera functions
        v3f getEyePosition() const { return m_position + getEyeOffset(); }
        v3f getEyeOffset() const;
        void setEyeHeight(float eye_height) { m_eye_height = eye_height; }
 
        void setCollisionbox(const aabb3f &box) { m_collisionbox = box; }
 
+       const aabb3f& getCollisionbox() const { return m_collisionbox; }
+
        float getZoomFOV() const { return m_zoom_fov; }
        void setZoomFOV(float zoom_fov) { m_zoom_fov = zoom_fov; }
 
        bool getAutojump() const { return m_autojump; }
 
+       bool isDead() const;
+
+       inline void addVelocity(const v3f &vel)
+       {
+               added_velocity += vel;
+       }
+       
+       void tryReattach(int id);
+       
+       bool isWaitingForReattach() const;
+       
+       bool canWalkOn(const ContentFeatures &f);
+       
 private:
-       void accelerateHorizontal(const v3f &target_speed, const f32 max_increase);
-       void accelerateVertical(const v3f &target_speed, const f32 max_increase);
+       void accelerate(const v3f &target_speed, const f32 max_increase_H,
+               const f32 max_increase_V, const bool use_pitch);
        bool updateSneakNode(Map *map, const v3f &position, const v3f &sneak_max);
        float getSlipFactor(Environment *env, const v3f &speedH);
        void handleAutojump(f32 dtime, Environment *env,
-                       const collisionMoveResult &result,
-                       const v3f &position_before_move, const v3f &speed_before_move,
-                       f32 pos_max_d);
+               const collisionMoveResult &result,
+               const v3f &position_before_move, const v3f &speed_before_move,
+               f32 pos_max_d);
 
+       bool m_freecam = false;
        v3f m_position;
+       v3f m_legit_position;
+       v3f m_legit_speed;
        v3s16 m_standing_node;
 
        v3s16 m_sneak_node = v3s16(32767, 32767, 32767);
@@ -182,17 +228,21 @@ class LocalPlayer : public Player
        // ***** End of variables for temporary option *****
 
        bool m_can_jump = false;
+       bool m_disable_jump = false;
        u16 m_breath = PLAYER_MAX_BREATH_DEFAULT;
        f32 m_yaw = 0.0f;
        f32 m_pitch = 0.0f;
        bool camera_barely_in_ceiling = false;
        aabb3f m_collisionbox = aabb3f(-BS * 0.30f, 0.0f, -BS * 0.30f, BS * 0.30f,
-                       BS * 1.75f, BS * 0.30f);
+               BS * 1.75f, BS * 0.30f);
        float m_eye_height = 1.625f;
        float m_zoom_fov = 0.0f;
        bool m_autojump = false;
        float m_autojump_time = 0.0f;
 
+       v3f added_velocity = v3f(0.0f); // cleared on each move()
+       // TODO: Rename to adhere to convention: added_velocity --> m_added_velocity
+
        GenericCAO *m_cao = nullptr;
        Client *m_client;
 };