Better player damage prevention when falling on unloaded blocks, not involving gettin...
authorPerttu Ahola <celeron55@gmail.com>
Sun, 16 Oct 2011 15:45:17 +0000 (18:45 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sun, 16 Oct 2011 15:45:17 +0000 (18:45 +0300)
src/environment.cpp
src/player.cpp
src/player.h

index d7bbadd054808be4d011d8ec3bdadd16f53e09d5..1d684129d18dc27869a83246aac2c81a117ee791 100644 (file)
@@ -1671,11 +1671,6 @@ void ClientEnvironment::step(float dtime)
        */
        bool is_climbing = lplayer->is_climbing;
        
-       /*
-               Check if the player is frozen (don't apply physics)
-       */
-       bool is_frozen = lplayer->is_frozen;
-
        f32 player_speed = 0.001; // just some small value
        player_speed = lplayer->getSpeed().getLength();
        
@@ -1733,7 +1728,7 @@ void ClientEnvironment::step(float dtime)
                        v3f lplayerpos = lplayer->getPosition();
                        
                        // Apply physics
-                       if(free_move == false && is_climbing == false && is_frozen == false)
+                       if(free_move == false && is_climbing == false)
                        {
                                // Gravity
                                v3f speed = lplayer->getSpeed();
@@ -1767,7 +1762,7 @@ void ClientEnvironment::step(float dtime)
        while(dtime_downcount > 0.001);
                
        //std::cout<<"Looped "<<loopcount<<" times."<<std::endl;
-
+       
        for(core::list<CollisionInfo>::Iterator
                        i = player_collisions.begin();
                        i != player_collisions.end(); i++)
index 6a774251cc110289edc22137c4a976b1760080f0..73291182813d3396081d98b98a8f5569e13de525 100644 (file)
@@ -33,7 +33,6 @@ Player::Player():
        in_water_stable(false),
        is_climbing(false),
        swimming_up(false),
-       is_frozen(false),
        inventory_backup(NULL),
        craftresult_is_preview(true),
        hp(20),
@@ -335,19 +334,8 @@ void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
        /*
                Calculate new position
        */
-       if(is_frozen) {
-               // Still move very slowly so as not to feel all completely stuck
-               position += m_speed * dtime * 0.001;
-       }
-       else {
-               position += m_speed * dtime;
-       }
+       position += m_speed * dtime;
        
-       /*
-               If the player enters an unloaded chunk this is set to true.
-       */
-       is_frozen = false;
-
        // Skip collision detection if a special movement mode is used
        bool free_move = g_settings->getBool("free_move");
        if(free_move)
@@ -505,6 +493,8 @@ void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
                        <<pos_i.X<<","<<pos_i.Y<<","<<pos_i.Z
                        <<"):"<<std::endl;*/
        
+       bool standing_on_unloaded = false;
+       
        /*
                Go through every node around the player
        */
@@ -512,6 +502,7 @@ void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
        for(s16 z = oldpos_i.Z - 1; z <= oldpos_i.Z + 1; z++)
        for(s16 x = oldpos_i.X - 1; x <= oldpos_i.X + 1; x++)
        {
+               bool is_unloaded = false;
                try{
                        // Player collides into walkable nodes
                        if(content_walkable(map.getNode(v3s16(x,y,z)).getContent()) == false)
@@ -519,11 +510,9 @@ void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
                }
                catch(InvalidPositionException &e)
                {
-                       if(!is_frozen) {
-                               // freeze when entering unloaded areas
-                               is_frozen = true;
-                       }
-                       continue;
+                       is_unloaded = true;
+                       // Doing nothing here will block the player from
+                       // walking over map borders
                }
 
                core::aabbox3d<f32> nodebox = getNodeBox(v3s16(x,y,z), BS);
@@ -546,6 +535,8 @@ void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
                                && nodebox.MinEdge.Z+d < playerbox.MaxEdge.Z
                ){
                        touching_ground = true;
+                       if(is_unloaded)
+                               standing_on_unloaded = true;
                }
                
                // If player doesn't intersect with node, ignore node.
@@ -727,7 +718,7 @@ void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
        if(collision_info)
        {
                // Report fall collision
-               if(old_speed.Y < m_speed.Y - 0.1)
+               if(old_speed.Y < m_speed.Y - 0.1 && !standing_on_unloaded)
                {
                        CollisionInfo info;
                        info.t = COLLISION_FALL;
index ce1001992fda971a02e2e565a7253f7a229d6978..a352c1bd94790bfe8d38cf388f119443990ca69c 100644 (file)
@@ -150,7 +150,6 @@ public:
        bool in_water_stable;
        bool is_climbing;
        bool swimming_up;
-       bool is_frozen;
        
        u8 light;