diff --git a/src/environment.cpp b/src/environment.cpp index d6ff4d826..8103b7110 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -1512,6 +1512,11 @@ void ClientEnvironment::step(float dtime) Get the speed the player is going */ 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(); @@ -1570,7 +1575,7 @@ void ClientEnvironment::step(float dtime) v3f lplayerpos = lplayer->getPosition(); // Apply physics - if(free_move == false && is_climbing == false) + if(free_move == false && is_climbing == false && is_frozen == false) { // Gravity v3f speed = lplayer->getSpeed(); diff --git a/src/player.cpp b/src/player.cpp index d59ae7049..7cfdfebb6 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -330,7 +330,18 @@ void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d, /* Calculate new position */ - position += m_speed * dtime; + 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; + } + + /* + 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"); @@ -503,8 +514,11 @@ void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d, } catch(InvalidPositionException &e) { - // Doing nothing here will block the player from - // walking over map borders + if(!is_frozen) { + // freeze when entering unloaded areas + is_frozen = true; + } + continue; } core::aabbox3d nodebox = getNodeBox(v3s16(x,y,z), BS); diff --git a/src/player.h b/src/player.h index 9a6ad93bf..13cffa205 100644 --- a/src/player.h +++ b/src/player.h @@ -142,6 +142,7 @@ public: bool in_water_stable; bool is_climbing; bool swimming_up; + bool is_frozen; Inventory inventory; // Actual inventory is backed up here when creative mode is used