Step height: Add as a player object property
authorparamat <paramat@users.noreply.github.com>
Sun, 6 Aug 2017 02:57:34 +0000 (03:57 +0100)
committerparamat <mat.gregory@virginmedia.com>
Wed, 9 Aug 2017 10:06:22 +0000 (11:06 +0100)
Add settable player step height using the existing object property.
Breaks compatibility with old clients, add to protocol version 35.

src/constants.h
src/content_cao.h
src/content_sao.cpp
src/localplayer.cpp
src/network/networkprotocol.h

index fb9e97cb3c09f3161fde756480a7e3b1e309432f..e615d00cd576af3a44cc5016a2667de52091ffe9 100644 (file)
@@ -80,6 +80,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 // the main loop (related to TempMods and day/night)
 //#define MAP_BLOCKSIZE 32
 
+// Player step height in nodes
+#define PLAYER_DEFAULT_STEPHEIGHT 0.6f
+
 /*
     Old stuff that shouldn't be hardcoded
 */
index d6d5deac8fe5884599d8062d8409306210324f8c..dc254ad5b4eb9489f76edefa544a85bb643aa0d4 100644 (file)
@@ -147,6 +147,11 @@ public:
 
        scene::IAnimatedMeshSceneNode *getAnimatedMeshSceneNode();
 
+       inline f32 getStepHeight() const
+       {
+               return m_prop.stepheight;
+       }
+
        inline bool isLocalPlayer() const
        {
                return m_is_local_player;
index 5ba4f1ad1fc43016955935604193feca0657cf31..674ab580c389cea7490a9999e0cebbec866dc123 100644 (file)
@@ -799,6 +799,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, u16 peer_id
        // end of default appearance
        m_prop.is_visible = true;
        m_prop.makes_footstep_sound = true;
+       m_prop.stepheight = PLAYER_DEFAULT_STEPHEIGHT * BS;
        m_hp = PLAYER_MAX_HP;
 }
 
index 0ab252a9daa042686e21dd1609e40efe0cd13caf..f04be07d69ce9a533ca2e72bf4d0383c7784cf44 100644 (file)
@@ -279,9 +279,15 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d,
        // This should always apply, otherwise there are glitches
        sanity_check(d > pos_max_d);
 
-       // TODO: this shouldn't be hardcoded but transmitted from server
-       float player_stepheight = (touching_ground) ? (BS * 0.6f) : (BS * 0.2f);
-
+       // Player object property step height is multiplied by BS in
+       // /src/script/common/c_content.cpp and /src/content_sao.cpp
+       float player_stepheight = (m_cao == nullptr) ? 0.0f :
+               (touching_ground ? m_cao->getStepHeight() : (0.2f * BS));
+
+       // TODO this is a problematic hack.
+       // Use a better implementation for autojump, or apply a custom stepheight
+       // to all players, as this currently creates unintended special movement
+       // abilities and advantages for Android players on a server.
 #ifdef __ANDROID__
        player_stepheight += (0.6f * BS);
 #endif
index c858878024a979abe9b7a70f0e51519bc3daf8c1..c90e9456ab4161d523757a38554f1353cf02be31 100644 (file)
@@ -174,6 +174,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
                Add settable player collisionbox. Breaks compatibility with older
                        clients as a 1-node vertical offset has been removed from player's
                        position
+               Add settable player stepheight using existing object property.
+                       Breaks compatibility with older clients.
 */
 
 #define LATEST_PROTOCOL_VERSION 35