]> git.lizzy.rs Git - minetest.git/blobdiff - src/client/clientenvironment.cpp
Fix player sprite visibility in first person
[minetest.git] / src / client / clientenvironment.cpp
index 895b0193c5976f9ad7ea4ee91d010bb40922536a..ea7be4200c3bc9726134bfe1b9d55b3d162b08a3 100644 (file)
@@ -25,7 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "clientmap.h"
 #include "scripting_client.h"
 #include "mapblock_mesh.h"
-#include "event.h"
+#include "mtevent.h"
 #include "collision.h"
 #include "nodedef.h"
 #include "profiler.h"
@@ -183,84 +183,61 @@ void ClientEnvironment::step(float dtime)
        if(dtime > 0.5)
                dtime = 0.5;
 
-       f32 dtime_downcount = dtime;
-
        /*
                Stuff that has a maximum time increment
        */
 
-       u32 loopcount = 0;
-       do
-       {
-               loopcount++;
-
-               f32 dtime_part;
-               if(dtime_downcount > dtime_max_increment)
-               {
-                       dtime_part = dtime_max_increment;
-                       dtime_downcount -= dtime_part;
-               }
-               else
-               {
-                       dtime_part = dtime_downcount;
-                       /*
-                               Setting this to 0 (no -=dtime_part) disables an infinite loop
-                               when dtime_part is so small that dtime_downcount -= dtime_part
-                               does nothing
-                       */
-                       dtime_downcount = 0;
-               }
-
+       u32 steps = ceil(dtime / dtime_max_increment);
+       f32 dtime_part = dtime / steps;
+       for (; steps > 0; --steps) {
                /*
-                       Handle local player
+                       Local player handling
                */
 
-               {
-                       // Control local player
-                       lplayer->applyControl(dtime_part, this);
-
-                       // Apply physics
-                       if (!free_move && !is_climbing) {
-                               // Gravity
-                               v3f speed = lplayer->getSpeed();
-                               if (!lplayer->in_liquid)
-                                       speed.Y -= lplayer->movement_gravity *
-                                               lplayer->physics_override_gravity * dtime_part * 2.0f;
-
-                               // Liquid floating / sinking
-                               if (lplayer->in_liquid && !lplayer->swimming_vertical &&
-                                               !lplayer->swimming_pitch)
-                                       speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2.0f;
-
-                               // Liquid resistance
-                               if (lplayer->in_liquid_stable || lplayer->in_liquid) {
-                                       // How much the node's viscosity blocks movement, ranges
-                                       // between 0 and 1. Should match the scale at which viscosity
-                                       // increase affects other liquid attributes.
-                                       static const f32 viscosity_factor = 0.3f;
-
-                                       v3f d_wanted = -speed / lplayer->movement_liquid_fluidity;
-                                       f32 dl = d_wanted.getLength();
-                                       if (dl > lplayer->movement_liquid_fluidity_smooth)
-                                               dl = lplayer->movement_liquid_fluidity_smooth;
-
-                                       dl *= (lplayer->liquid_viscosity * viscosity_factor) +
-                                               (1 - viscosity_factor);
-                                       v3f d = d_wanted.normalize() * (dl * dtime_part * 100.0f);
-                                       speed += d;
-                               }
-
-                               lplayer->setSpeed(speed);
+               // Control local player
+               lplayer->applyControl(dtime_part, this);
+
+               // Apply physics
+               if (!free_move && !is_climbing) {
+                       // Gravity
+                       v3f speed = lplayer->getSpeed();
+                       if (!lplayer->in_liquid)
+                               speed.Y -= lplayer->movement_gravity *
+                                       lplayer->physics_override_gravity * dtime_part * 2.0f;
+
+                       // Liquid floating / sinking
+                       if (lplayer->in_liquid && !lplayer->swimming_vertical &&
+                                       !lplayer->swimming_pitch)
+                               speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2.0f;
+
+                       // Liquid resistance
+                       if (lplayer->in_liquid_stable || lplayer->in_liquid) {
+                               // How much the node's viscosity blocks movement, ranges
+                               // between 0 and 1. Should match the scale at which viscosity
+                               // increase affects other liquid attributes.
+                               static const f32 viscosity_factor = 0.3f;
+
+                               v3f d_wanted = -speed / lplayer->movement_liquid_fluidity;
+                               f32 dl = d_wanted.getLength();
+                               if (dl > lplayer->movement_liquid_fluidity_smooth)
+                                       dl = lplayer->movement_liquid_fluidity_smooth;
+
+                               dl *= (lplayer->liquid_viscosity * viscosity_factor) +
+                                       (1 - viscosity_factor);
+                               v3f d = d_wanted.normalize() * (dl * dtime_part * 100.0f);
+                               speed += d;
                        }
 
-                       /*
-                               Move the lplayer.
-                               This also does collision detection.
-                       */
-                       lplayer->move(dtime_part, this, position_max_increment,
-                               &player_collisions);
+                       lplayer->setSpeed(speed);
                }
-       } while (dtime_downcount > 0.001);
+
+               /*
+                       Move the lplayer.
+                       This also does collision detection.
+               */
+               lplayer->move(dtime_part, this, position_max_increment,
+                       &player_collisions);
+       }
 
        bool player_immortal = lplayer->getCAO() && lplayer->getCAO()->isImmortal();
 
@@ -368,21 +345,6 @@ bool isFreeClientActiveObjectId(const u16 id,
 
 }
 
-u16 getFreeClientActiveObjectId(ClientActiveObjectMap &objects)
-{
-       // try to reuse id's as late as possible
-       static u16 last_used_id = 0;
-       u16 startid = last_used_id;
-       for(;;) {
-               last_used_id ++;
-               if (isFreeClientActiveObjectId(last_used_id, objects))
-                       return last_used_id;
-
-               if (last_used_id == startid)
-                       return 0;
-       }
-}
-
 u16 ClientEnvironment::addActiveObject(ClientActiveObject *object)
 {
        // Register object. If failed return zero id