Send Position packet on event, don't check it at each AsyncRunStep.

* This permit to cleanup the player checking loop
This commit is contained in:
Loic Blot 2015-03-04 12:19:26 +01:00
parent 7f8f9785d7
commit 40bf1d7b5f
5 changed files with 10 additions and 45 deletions

@ -29,6 +29,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "tool.h" // For ToolCapabilities #include "tool.h" // For ToolCapabilities
#include "gamedef.h" #include "gamedef.h"
#include "player.h" #include "player.h"
#include "server.h"
#include "scripting_game.h" #include "scripting_game.h"
#include "genericobject.h" #include "genericobject.h"
#include "log.h" #include "log.h"
@ -716,7 +717,6 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, Player *player_, u16 peer_id_,
m_attachment_parent_id(0), m_attachment_parent_id(0),
m_attachment_sent(false), m_attachment_sent(false),
// public // public
m_moved(false),
m_physics_override_speed(1), m_physics_override_speed(1),
m_physics_override_jump(1), m_physics_override_jump(1),
m_physics_override_gravity(1), m_physics_override_gravity(1),
@ -867,7 +867,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
m_attachment_position = v3f(0,0,0); m_attachment_position = v3f(0,0,0);
m_attachment_rotation = v3f(0,0,0); m_attachment_rotation = v3f(0,0,0);
m_player->setPosition(m_last_good_position); m_player->setPosition(m_last_good_position);
m_moved = true; ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
} }
//dstream<<"PlayerSAO::step: dtime: "<<dtime<<std::endl; //dstream<<"PlayerSAO::step: dtime: "<<dtime<<std::endl;
@ -982,8 +982,7 @@ void PlayerSAO::setPos(v3f pos)
m_player->setPosition(pos); m_player->setPosition(pos);
// Movement caused by this command is always valid // Movement caused by this command is always valid
m_last_good_position = pos; m_last_good_position = pos;
// Force position change on client ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
m_moved = true;
} }
void PlayerSAO::moveTo(v3f pos, bool continuous) void PlayerSAO::moveTo(v3f pos, bool continuous)
@ -993,22 +992,19 @@ void PlayerSAO::moveTo(v3f pos, bool continuous)
m_player->setPosition(pos); m_player->setPosition(pos);
// Movement caused by this command is always valid // Movement caused by this command is always valid
m_last_good_position = pos; m_last_good_position = pos;
// Force position change on client ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
m_moved = true;
} }
void PlayerSAO::setYaw(float yaw) void PlayerSAO::setYaw(float yaw)
{ {
m_player->setYaw(yaw); m_player->setYaw(yaw);
// Force change on client ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
m_moved = true;
} }
void PlayerSAO::setPitch(float pitch) void PlayerSAO::setPitch(float pitch)
{ {
m_player->setPitch(pitch); m_player->setPitch(pitch);
// Force change on client ((Server*)m_env->getGameDef())->SendMovePlayer(m_peer_id);
m_moved = true;
} }
int PlayerSAO::punch(v3f dir, int PlayerSAO::punch(v3f dir,
@ -1241,7 +1237,6 @@ bool PlayerSAO::checkMovementCheat()
<<" moved too fast; resetting position" <<" moved too fast; resetting position"
<<std::endl; <<std::endl;
m_player->setPosition(m_last_good_position); m_player->setPosition(m_last_good_position);
m_moved = true;
cheated = true; cheated = true;
} }
} }

@ -314,9 +314,6 @@ private:
bool m_attachment_sent; bool m_attachment_sent;
public: public:
// Some flags used by Server
bool m_moved;
float m_physics_override_speed; float m_physics_override_speed;
float m_physics_override_jump; float m_physics_override_jump;
float m_physics_override_gravity; float m_physics_override_gravity;

@ -579,10 +579,10 @@ void Server::handleCommand_PlayerPos(NetworkPacket* pkt)
player->control.LMB = (keyPressed & 128); player->control.LMB = (keyPressed & 128);
player->control.RMB = (keyPressed & 256); player->control.RMB = (keyPressed & 256);
bool cheated = playersao->checkMovementCheat(); if (playersao->checkMovementCheat()) {
if (cheated) {
// Call callbacks // Call callbacks
m_script->on_cheat(playersao, "moved_too_fast"); m_script->on_cheat(playersao, "moved_too_fast");
SendMovePlayer(pkt->getPeerId());
} }
} }

@ -581,32 +581,6 @@ void Server::AsyncRunStep(bool initial_step)
Do background stuff Do background stuff
*/ */
/*
Handle players
*/
{
JMutexAutoLock lock(m_env_mutex);
std::list<u16> clientids = m_clients.getClientIDs();
ScopeProfiler sp(g_profiler, "Server: handle players");
for(std::list<u16>::iterator
i = clientids.begin();
i != clientids.end(); ++i)
{
PlayerSAO *playersao = getPlayerSAO(*i);
if(playersao == NULL)
continue;
if(playersao->m_moved) {
SendMovePlayer(*i);
playersao->m_moved = false;
}
}
}
/* Transform liquids */ /* Transform liquids */
m_liquid_transform_timer += dtime; m_liquid_transform_timer += dtime;
if(m_liquid_transform_timer >= m_liquid_transform_every) if(m_liquid_transform_timer >= m_liquid_transform_every)
@ -2590,6 +2564,7 @@ void Server::RespawnPlayer(u16 peer_id)
bool repositioned = m_script->on_respawnplayer(playersao); bool repositioned = m_script->on_respawnplayer(playersao);
if(!repositioned){ if(!repositioned){
v3f pos = findSpawnPos(m_env->getServerMap()); v3f pos = findSpawnPos(m_env->getServerMap());
// setPos will send the new position to client
playersao->setPos(pos); playersao->setPos(pos);
} }
} }

@ -374,9 +374,8 @@ public:
void SendPlayerHPOrDie(u16 peer_id, bool die) { die ? DiePlayer(peer_id) : SendPlayerHP(peer_id); } void SendPlayerHPOrDie(u16 peer_id, bool die) { die ? DiePlayer(peer_id) : SendPlayerHP(peer_id); }
void SendPlayerBreath(u16 peer_id); void SendPlayerBreath(u16 peer_id);
// Envlock and conlock should be locked when calling these
void SendInventory(u16 peer_id); void SendInventory(u16 peer_id);
void SendMovePlayer(u16 peer_id);
// Bind address // Bind address
Address m_bind_addr; Address m_bind_addr;
@ -402,7 +401,6 @@ private:
void SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed); void SendTimeOfDay(u16 peer_id, u16 time, f32 time_speed);
void SendPlayerHP(u16 peer_id); void SendPlayerHP(u16 peer_id);
void SendMovePlayer(u16 peer_id);
void SendLocalPlayerAnimations(u16 peer_id, v2s32 animation_frames[4], f32 animation_speed); void SendLocalPlayerAnimations(u16 peer_id, v2s32 animation_frames[4], f32 animation_speed);
void SendEyeOffset(u16 peer_id, v3f first, v3f third); void SendEyeOffset(u16 peer_id, v3f first, v3f third);
void SendPlayerPrivileges(u16 peer_id); void SendPlayerPrivileges(u16 peer_id);