X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Flocalplayer.cpp;h=1a238cb4787789c0f45d25cecf5abd015765517d;hb=2fee2baf98cd452f7d0e4acb6c82617b7c7b995a;hp=9c70c8b2f532a810a844a6db915208f12bbf32c9;hpb=feb7de91ec34ef1ca3152270a7bc62b2e308f1bd;p=oweals%2Fminetest.git diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 9c70c8b2f..1a238cb47 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -43,12 +43,18 @@ LocalPlayer::LocalPlayer(IGameDef *gamedef): last_pitch(0), last_yaw(0), last_keyPressed(0), + eye_offset_first(v3f(0,0,0)), + eye_offset_third(v3f(0,0,0)), + last_animation(NO_ANIM), + hotbar_image(""), + hotbar_selected_image(""), m_sneak_node(32767,32767,32767), m_sneak_node_exists(false), m_old_node_below(32767,32767,32767), m_old_node_below_type("air"), m_need_to_get_new_sneak_node(true), - m_can_jump(false) + m_can_jump(false), + m_cao(NULL) { // Initialize hp to 0, so that no hearts will be shown if server // doesn't support health points @@ -59,7 +65,7 @@ LocalPlayer::~LocalPlayer() { } -void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d, +void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, std::list *collision_info) { Map *map = &env->getMap(); @@ -73,6 +79,7 @@ void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d, if(isAttached) { setPosition(overridePosition); + m_sneak_node_exists = false; return; } @@ -85,6 +92,7 @@ void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d, { position += m_speed * dtime; setPosition(position); + m_sneak_node_exists = false; return; } @@ -154,9 +162,6 @@ void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d, // This should always apply, otherwise there are glitches assert(d > pos_max_d); - float player_radius = BS*0.30; - float player_height = BS*1.55; - // Maximum distance over border for sneaking f32 sneak_max = BS*0.4; @@ -164,7 +169,9 @@ void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d, If sneaking, keep in range from the last walked node and don't fall off from it */ - if(control.sneak && m_sneak_node_exists && !(fly_allowed && g_settings->getBool("free_move")) && !in_liquid) + if(control.sneak && m_sneak_node_exists && + !(fly_allowed && g_settings->getBool("free_move")) && !in_liquid && + physics_override_sneak) { f32 maxd = 0.5*BS + sneak_max; v3f lwn_f = intToFloat(m_sneak_node, BS); @@ -184,24 +191,12 @@ void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d, } } - /* - Calculate player collision box (new and old) - */ - core::aabbox3d playerbox( - -player_radius, - 0.0, - -player_radius, - player_radius, - player_height, - player_radius - ); - float player_stepheight = touching_ground ? (BS*0.6) : (BS*0.2); v3f accel_f = v3f(0,0,0); collisionMoveResult result = collisionMoveSimple(env, m_gamedef, - pos_max_d, playerbox, player_stepheight, dtime, + pos_max_d, m_collisionbox, player_stepheight, dtime, position, m_speed, accel_f); /* @@ -236,7 +231,7 @@ void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d, // node. m_need_to_get_new_sneak_node = true; } - if(m_need_to_get_new_sneak_node) + if(m_need_to_get_new_sneak_node && physics_override_sneak) { v3s16 pos_i_bottom = floatToInt(position - v3f(0,BS/2,0), BS); v2f player_p2df(position.X, position.Z); @@ -273,8 +268,13 @@ void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d, if(nodemgr->get(map->getNode(p)).walkable == false) continue; // And the node above it has to be nonwalkable - if(nodemgr->get(map->getNode(p+v3s16(0,1,0))).walkable == true) + if(nodemgr->get(map->getNode(p+v3s16(0,1,0))).walkable == true) { continue; + } + if (!physics_override_sneak_glitch) { + if (nodemgr->get(map->getNode(p+v3s16(0,2,0))).walkable) + continue; + } } catch(InvalidPositionException &e) { @@ -329,6 +329,9 @@ void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d, if(!touching_ground_was && touching_ground){ MtEvent *e = new SimpleTriggerEvent("PlayerRegainGround"); m_gamedef->event()->put(e); + + // Set camera impact value to be used for view bobbing + camera_impact = getSpeed().Y * -1; } { @@ -358,7 +361,7 @@ void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d, m_can_jump = false; } -void LocalPlayer::move(f32 dtime, ClientEnvironment *env, f32 pos_max_d) +void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d) { move(dtime, env, pos_max_d, NULL); } @@ -502,7 +505,7 @@ void LocalPlayer::applyControl(float dtime) if(control.jump) { if(free_move) - { + { if(g_settings->getBool("aux1_descends") || g_settings->getBool("always_fly_fast")) { if(fast_move) @@ -584,6 +587,6 @@ v3s16 LocalPlayer::getStandingNodePos() { if(m_sneak_node_exists) return m_sneak_node; - return floatToInt(getPosition(), BS); + return floatToInt(getPosition() - v3f(0, BS, 0), BS); }