Fix more things I forgot for attached players. Such players will now properly see themselves moving when attached, and the server will read their position accordingly

Fix attached players being able to bob their view and generate foostep sounds by pressing a movement key (running in place)
This commit is contained in:
MirceaKitsune 2012-11-09 16:45:29 +02:00 committed by Perttu Ahola
parent 9259d028ac
commit 4d656963e4
3 changed files with 16 additions and 10 deletions

@ -1538,7 +1538,6 @@ public:
{ {
LocalPlayer *player = m_env->getLocalPlayer(); LocalPlayer *player = m_env->getLocalPlayer();
player->isAttached = true; player->isAttached = true;
player->overridePosition = m_attachment_position;
} }
} }
} }

@ -34,6 +34,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
LocalPlayer::LocalPlayer(IGameDef *gamedef): LocalPlayer::LocalPlayer(IGameDef *gamedef):
Player(gamedef), Player(gamedef),
isAttached(false),
overridePosition(v3f(0,0,0)),
m_sneak_node(32767,32767,32767), m_sneak_node(32767,32767,32767),
m_sneak_node_exists(false), m_sneak_node_exists(false),
m_old_node_below(32767,32767,32767), m_old_node_below(32767,32767,32767),
@ -53,6 +55,12 @@ LocalPlayer::~LocalPlayer()
void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d, void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
core::list<CollisionInfo> *collision_info) core::list<CollisionInfo> *collision_info)
{ {
INodeDefManager *nodemgr = m_gamedef->ndef();
v3f position = getPosition();
v3f old_speed = m_speed;
// Copy parent position if local player is attached // Copy parent position if local player is attached
if(isAttached) if(isAttached)
{ {
@ -60,12 +68,6 @@ void LocalPlayer::move(f32 dtime, Map &map, f32 pos_max_d,
return; return;
} }
INodeDefManager *nodemgr = m_gamedef->ndef();
v3f position = getPosition();
v3f old_speed = m_speed;
// Skip collision detection if a special movement mode is used // Skip collision detection if a special movement mode is used
bool fly_allowed = m_gamedef->checkLocalPrivilege("fly"); bool fly_allowed = m_gamedef->checkLocalPrivilege("fly");
bool free_move = fly_allowed && g_settings->getBool("free_move"); bool free_move = fly_allowed && g_settings->getBool("free_move");
@ -360,6 +362,13 @@ void LocalPlayer::applyControl(float dtime)
setPitch(control.pitch); setPitch(control.pitch);
setYaw(control.yaw); setYaw(control.yaw);
// Nullify speed and don't run positioning code if the player is attached
if(isAttached)
{
setSpeed(v3f(0,0,0));
return;
}
v3f move_direction = v3f(0,0,1); v3f move_direction = v3f(0,0,1);
move_direction.rotateXZBy(getYaw()); move_direction.rotateXZBy(getYaw());

@ -254,7 +254,6 @@ void ContentFeatures::serialize(std::ostream &os)
os<<serializeString(liquid_alternative_flowing); os<<serializeString(liquid_alternative_flowing);
os<<serializeString(liquid_alternative_source); os<<serializeString(liquid_alternative_source);
writeU8(os, liquid_viscosity); writeU8(os, liquid_viscosity);
writeU8(os, liquid_renewable);
writeU8(os, light_source); writeU8(os, light_source);
writeU32(os, damage_per_second); writeU32(os, damage_per_second);
node_box.serialize(os); node_box.serialize(os);
@ -312,7 +311,6 @@ void ContentFeatures::deSerialize(std::istream &is)
liquid_alternative_flowing = deSerializeString(is); liquid_alternative_flowing = deSerializeString(is);
liquid_alternative_source = deSerializeString(is); liquid_alternative_source = deSerializeString(is);
liquid_viscosity = readU8(is); liquid_viscosity = readU8(is);
liquid_renewable = readU8(is);
light_source = readU8(is); light_source = readU8(is);
damage_per_second = readU32(is); damage_per_second = readU32(is);
node_box.deSerialize(is); node_box.deSerialize(is);