diff options
author | Perttu Ahola <celeron55@gmail.com> | 2011-10-16 18:45:17 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2011-10-16 18:45:17 +0300 |
commit | 369177aa8015d75f4cb18c65f435efc1f2a9e05a (patch) | |
tree | 7c686e54f150a17399d383fa6fd8d57a15ef7653 /src | |
parent | 0bf533f7534e84a23b5b9c8a5ca45e67c1cc3f00 (diff) | |
download | minetest-369177aa8015d75f4cb18c65f435efc1f2a9e05a.tar.gz minetest-369177aa8015d75f4cb18c65f435efc1f2a9e05a.tar.bz2 minetest-369177aa8015d75f4cb18c65f435efc1f2a9e05a.zip |
Better player damage prevention when falling on unloaded blocks, not involving getting stuck in there.
Diffstat (limited to 'src')
-rw-r--r-- | src/environment.cpp | 9 | ||||
-rw-r--r-- | src/player.cpp | 29 | ||||
-rw-r--r-- | src/player.h | 1 |
3 files changed, 12 insertions, 27 deletions
diff --git a/src/environment.cpp b/src/environment.cpp index d7bbadd05..1d684129d 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -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++) diff --git a/src/player.cpp b/src/player.cpp index 6a774251c..732911828 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -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; diff --git a/src/player.h b/src/player.h index ce1001992..a352c1bd9 100644 --- a/src/player.h +++ b/src/player.h @@ -150,7 +150,6 @@ public: bool in_water_stable; bool is_climbing; bool swimming_up; - bool is_frozen; u8 light; |