1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-02 16:38:41 +00:00

Add third person view

This commit is contained in:
BlockMen 2014-01-08 13:47:53 +01:00
parent e149d1ad9a
commit a1db9242ec
19 changed files with 270 additions and 22 deletions

View file

@ -41,6 +41,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/mathconstants.h"
#include "map.h"
#include "main.h" // g_settings
#include "game.h" // CameraModes
#include <IMeshManipulator.h>
#include <IAnimatedMeshSceneNode.h>
#include <IBoneSceneNode.h>
@ -858,7 +859,7 @@ public:
m_visuals_expired = false;
if(!m_prop.is_visible || m_is_local_player)
if(!m_prop.is_visible)
return;
//video::IVideoDriver* driver = smgr->getVideoDriver();
@ -1078,6 +1079,60 @@ public:
void step(float dtime, ClientEnvironment *env)
{
// Handel model of local player instantly to prevent lags
if(m_is_local_player) {
LocalPlayer *player = m_env->getLocalPlayer();
if (player->camera_mode > CAMERA_MODE_FIRST) {
int old_anim = player->last_animation;
float old_anim_speed = player->last_animation_speed;
m_is_visible = true;
m_position = player->getPosition() + v3f(0,BS,0);
m_velocity = v3f(0,0,0);
m_acceleration = v3f(0,0,0);
pos_translator.vect_show = m_position;
m_yaw = player->getYaw();
PlayerControl controls = player->getPlayerControl();
bool walking = false;
if(controls.up || controls.down || controls.left || controls.right)
walking = true;
m_animation_speed = player->local_animation_speed;
if(controls.sneak && walking)
m_animation_speed = player->local_animation_speed/2;
player->last_animation_speed = m_animation_speed;
if(walking && (controls.LMB || controls.RMB)) {
m_animation_range = player->local_animations[3];
player->last_animation = WD_ANIM;
} else if(walking) {
m_animation_range = player->local_animations[1];
player->last_animation = WALK_ANIM;
} else if(controls.LMB || controls.RMB) {
m_animation_range = player->local_animations[2];
player->last_animation = DIG_ANIM;
}
// reset animation when no input detected
if (!walking && !controls.LMB && !controls.RMB) {
player->last_animation = NO_ANIM;
if (old_anim != NO_ANIM) {
m_animation_range = player->local_animations[0];
updateAnimation();
}
}
// Update local player animations
if ((player->last_animation != old_anim && player->last_animation != NO_ANIM) || m_animation_speed != old_anim_speed)
updateAnimation();
} else {
m_is_visible = false;
}
}
if(m_visuals_expired && m_smgr && m_irr){
m_visuals_expired = false;
@ -1701,6 +1756,7 @@ public:
bool sneak = !readU8(is);
bool sneak_glitch = !readU8(is);
if(m_is_local_player)
{
LocalPlayer *player = m_env->getLocalPlayer();
@ -1713,11 +1769,25 @@ public:
}
else if(cmd == GENERIC_CMD_SET_ANIMATION)
{
m_animation_range = readV2F1000(is);
m_animation_speed = readF1000(is);
m_animation_blend = readF1000(is);
updateAnimation();
if (!m_is_local_player) {
m_animation_range = readV2F1000(is);
m_animation_speed = readF1000(is);
m_animation_blend = readF1000(is);
updateAnimation();
} else {
LocalPlayer *player = m_env->getLocalPlayer();
if(player->last_animation == NO_ANIM) {
m_animation_range = readV2F1000(is);
m_animation_speed = readF1000(is);
m_animation_blend = readF1000(is);
}
// update animation only if object is not player
// or the received animation is not registered
if(m_animation_range.X != player->local_animations[1].X &&
m_animation_range.X != player->local_animations[2].X &&
m_animation_range.X != player->local_animations[3].X)
updateAnimation();
}
}
else if(cmd == GENERIC_CMD_SET_BONE_POSITION)
{