Fix the bouncy node related stuff a bit
authorPerttu Ahola <celeron55@gmail.com>
Sat, 1 Sep 2012 10:21:52 +0000 (13:21 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 1 Sep 2012 10:21:52 +0000 (13:21 +0300)
src/environment.cpp
src/localplayer.cpp

index 24943ad5fa94fe128fadbf318f460f1d86d35340..a49a5e384edecbe36fa5a79dcfd2ac8f3fa46673 100644 (file)
@@ -2033,10 +2033,18 @@ void ClientEnvironment::step(float dtime)
                        i = player_collisions.begin();
                        i != player_collisions.end(); i++)
        {
+               CollisionInfo &info = *i;
+               v3f speed_diff = info.new_speed - info.old_speed;;
+               // Handle only fall damage
+               // (because otherwise walking against something in fast_move kills you)
+               if(speed_diff.Y < 0 || info.old_speed.Y >= 0)
+                       continue;
+               // Get rid of other components
+               speed_diff.X = 0;
+               speed_diff.Z = 0;
                f32 pre_factor = 1; // 1 hp per node/s
                f32 tolerance = BS*14; // 5 without damage
                f32 post_factor = 1; // 1 hp per node/s
-               CollisionInfo &info = *i;
                if(info.type == COLLISION_NODE)
                {
                        const ContentFeatures &f = m_gamedef->ndef()->
@@ -2045,8 +2053,7 @@ void ClientEnvironment::step(float dtime)
                        int addp = itemgroup_get(f.groups, "fall_damage_add_percent");
                        pre_factor = 1.0 + (float)addp/100.0;
                }
-               float speed = (info.new_speed - info.old_speed).getLength();
-               speed *= pre_factor;
+               float speed = pre_factor * speed_diff.getLength();
                if(speed > tolerance)
                {
                        f32 damage_f = (speed - tolerance)/BS * post_factor;
index 15b6fd15def7fd62901936207b91a662d36d7bb9..46a10c90b3634f7a0f25002811f8c5fda7d5f3f7 100644 (file)
@@ -486,9 +486,8 @@ void LocalPlayer::applyControl(float dtime)
                        v3f speed = getSpeed();
                        if(speed.Y >= -0.5*BS)
                        {
-                               speed.Y += 6.5*BS;
+                               speed.Y = 6.5*BS;
                                setSpeed(speed);
-                               m_can_jump = false;
                                
                                MtEvent *e = new SimpleTriggerEvent("PlayerJump");
                                m_gamedef->event()->put(e);