Fixed bug in entities movement: Corrected proper flooring of double values for the relative move packet, and teleport packet. Also, made the velocity packet to be sent first than the positions packets.
git-svn-id: http://mc-server.googlecode.com/svn/trunk@1367 0a769ca7-a7f5-676a-18bf-c427514a06d6
This commit is contained in:
parent
34f93de4f9
commit
92e782068f
@ -276,14 +276,21 @@ void cEntity::Tick(float a_Dt, MTRand & a_TickRandom)
|
|||||||
|
|
||||||
void cEntity::BroadcastMovementUpdate(const cClientHandle * a_Exclude)
|
void cEntity::BroadcastMovementUpdate(const cClientHandle * a_Exclude)
|
||||||
{
|
{
|
||||||
int DiffX = (int)((GetPosX() - m_LastPosX) * 32.0);
|
//We need to keep updating the clients when there is movement or if there was a change in speed and after 2 ticks
|
||||||
int DiffY = (int)((GetPosY() - m_LastPosY) * 32.0);
|
if( (m_Speed.SqrLength() > 0.0004f || m_bDirtySpeed) && (m_World->GetWorldAge() - m_TimeLastSpeedPacket >= 2))
|
||||||
int DiffZ = (int)((GetPosZ() - m_LastPosZ) * 32.0);
|
{
|
||||||
Int64 DiffTeleportPacket = m_World->GetWorldAge() - m_TimeLastTeleportPacket;
|
m_World->BroadcastEntVelocity(*this,a_Exclude);
|
||||||
|
m_bDirtySpeed = false;
|
||||||
|
m_TimeLastSpeedPacket = m_World->GetWorldAge();
|
||||||
|
}
|
||||||
|
|
||||||
//Have to process this every two ticks
|
//Have to process position related packets this every two ticks
|
||||||
if (m_World->GetWorldAge() % 2 == 0)
|
if (m_World->GetWorldAge() % 2 == 0)
|
||||||
{
|
{
|
||||||
|
int DiffX = (int) (floor(GetPosX() * 32.0) - floor(m_LastPosX * 32.0));
|
||||||
|
int DiffY = (int) (floor(GetPosY() * 32.0) - floor(m_LastPosY * 32.0));
|
||||||
|
int DiffZ = (int) (floor(GetPosZ() * 32.0) - floor(m_LastPosZ * 32.0));
|
||||||
|
Int64 DiffTeleportPacket = m_World->GetWorldAge() - m_TimeLastTeleportPacket;
|
||||||
// 4 blocks is max Relative So if the Diff is greater than 127 or. Send an absolute position every 20 seconds
|
// 4 blocks is max Relative So if the Diff is greater than 127 or. Send an absolute position every 20 seconds
|
||||||
if (DiffTeleportPacket >= 400 ||
|
if (DiffTeleportPacket >= 400 ||
|
||||||
((DiffX > 127) || (DiffX < -128) ||
|
((DiffX > 127) || (DiffX < -128) ||
|
||||||
@ -336,13 +343,6 @@ void cEntity::BroadcastMovementUpdate(const cClientHandle * a_Exclude)
|
|||||||
m_bDirtyHead = false;
|
m_bDirtyHead = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//We need to keep updating the clients when there is movement or if there was a change in speed and after 2 ticks
|
|
||||||
if( (m_Speed.SqrLength() > 0.0004f || m_bDirtySpeed) && (m_World->GetWorldAge() - m_TimeLastSpeedPacket >= 2))
|
|
||||||
{
|
|
||||||
m_World->BroadcastEntVelocity(*this,a_Exclude);
|
|
||||||
m_bDirtySpeed = false;
|
|
||||||
m_TimeLastSpeedPacket = m_World->GetWorldAge();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -725,7 +725,9 @@ void cProtocol125::SendTeleportEntity(const cEntity & a_Entity)
|
|||||||
cCSLock Lock(m_CSPacket);
|
cCSLock Lock(m_CSPacket);
|
||||||
WriteByte (PACKET_ENT_TELEPORT);
|
WriteByte (PACKET_ENT_TELEPORT);
|
||||||
WriteInt (a_Entity.GetUniqueID());
|
WriteInt (a_Entity.GetUniqueID());
|
||||||
WriteVectorI((Vector3i)(a_Entity.GetPosition() * 32));
|
WriteInt ((int)(floor(a_Entity.GetPosX() * 32)));
|
||||||
|
WriteInt ((int)(floor(a_Entity.GetPosY() * 32)));
|
||||||
|
WriteInt ((int)(floor(a_Entity.GetPosZ() * 32)));
|
||||||
WriteByte ((char)((a_Entity.GetRotation() / 360.f) * 256));
|
WriteByte ((char)((a_Entity.GetRotation() / 360.f) * 256));
|
||||||
WriteByte ((char)((a_Entity.GetPitch() / 360.f) * 256));
|
WriteByte ((char)((a_Entity.GetPitch() / 360.f) * 256));
|
||||||
Flush();
|
Flush();
|
||||||
|
Loading…
Reference in New Issue
Block a user