Merge pull request #3139 from LogicParrot/freezeFix
Fix occasional freeze bug
This commit is contained in:
commit
a717fb91b0
@ -65,6 +65,7 @@ cPlayer::cPlayer(cClientHandlePtr a_Client, const AString & a_PlayerName) :
|
|||||||
m_GameMode(eGameMode_NotSet),
|
m_GameMode(eGameMode_NotSet),
|
||||||
m_IP(""),
|
m_IP(""),
|
||||||
m_ClientHandle(a_Client),
|
m_ClientHandle(a_Client),
|
||||||
|
m_IsFrozen(false),
|
||||||
m_NormalMaxSpeed(1.0),
|
m_NormalMaxSpeed(1.0),
|
||||||
m_SprintingMaxSpeed(1.3),
|
m_SprintingMaxSpeed(1.3),
|
||||||
m_FlyingMaxSpeed(1.0),
|
m_FlyingMaxSpeed(1.0),
|
||||||
@ -1759,41 +1760,6 @@ void cPlayer::TossItems(const cItems & a_Items)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cPlayer::FreezeInternal(const Vector3d & a_Location, bool a_ManuallyFrozen)
|
|
||||||
{
|
|
||||||
SetSpeed(0, 0, 0);
|
|
||||||
SetPosition(a_Location);
|
|
||||||
m_IsFrozen = true;
|
|
||||||
m_IsManuallyFrozen = a_ManuallyFrozen;
|
|
||||||
|
|
||||||
double NormalMaxSpeed = GetNormalMaxSpeed();
|
|
||||||
double SprintMaxSpeed = GetSprintingMaxSpeed();
|
|
||||||
double FlyingMaxpeed = GetFlyingMaxSpeed();
|
|
||||||
bool IsFlying = m_IsFlying;
|
|
||||||
|
|
||||||
// Set the client-side speed to 0
|
|
||||||
m_NormalMaxSpeed = 0;
|
|
||||||
m_SprintingMaxSpeed = 0;
|
|
||||||
m_FlyingMaxSpeed = 0;
|
|
||||||
m_IsFlying = true;
|
|
||||||
|
|
||||||
// Send the client its fake speed and max speed of 0
|
|
||||||
GetClientHandle()->SendPlayerMoveLook();
|
|
||||||
GetClientHandle()->SendPlayerAbilities();
|
|
||||||
GetClientHandle()->SendPlayerMaxSpeed();
|
|
||||||
GetClientHandle()->SendEntityVelocity(*this);
|
|
||||||
|
|
||||||
// Keep the server side speed variables as they were in the first place
|
|
||||||
m_NormalMaxSpeed = NormalMaxSpeed;
|
|
||||||
m_SprintingMaxSpeed = SprintMaxSpeed;
|
|
||||||
m_FlyingMaxSpeed = FlyingMaxpeed;
|
|
||||||
m_IsFlying = IsFlying;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool cPlayer::DoMoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn, Vector3d a_NewPosition)
|
bool cPlayer::DoMoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn, Vector3d a_NewPosition)
|
||||||
{
|
{
|
||||||
ASSERT(a_World != nullptr);
|
ASSERT(a_World != nullptr);
|
||||||
@ -2546,3 +2512,38 @@ AString cPlayer::GetUUIDFileName(const AString & a_UUID)
|
|||||||
res.append(".json");
|
res.append(".json");
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void cPlayer::FreezeInternal(const Vector3d & a_Location, bool a_ManuallyFrozen)
|
||||||
|
{
|
||||||
|
SetSpeed(0, 0, 0);
|
||||||
|
SetPosition(a_Location);
|
||||||
|
m_IsFrozen = true;
|
||||||
|
m_IsManuallyFrozen = a_ManuallyFrozen;
|
||||||
|
|
||||||
|
double NormalMaxSpeed = GetNormalMaxSpeed();
|
||||||
|
double SprintMaxSpeed = GetSprintingMaxSpeed();
|
||||||
|
double FlyingMaxpeed = GetFlyingMaxSpeed();
|
||||||
|
bool IsFlying = m_IsFlying;
|
||||||
|
|
||||||
|
// Set the client-side speed to 0
|
||||||
|
m_NormalMaxSpeed = 0;
|
||||||
|
m_SprintingMaxSpeed = 0;
|
||||||
|
m_FlyingMaxSpeed = 0;
|
||||||
|
m_IsFlying = true;
|
||||||
|
|
||||||
|
// Send the client its fake speed and max speed of 0
|
||||||
|
GetClientHandle()->SendPlayerMoveLook();
|
||||||
|
GetClientHandle()->SendPlayerAbilities();
|
||||||
|
GetClientHandle()->SendPlayerMaxSpeed();
|
||||||
|
GetClientHandle()->SendEntityVelocity(*this);
|
||||||
|
|
||||||
|
// Keep the server side speed variables as they were in the first place
|
||||||
|
m_NormalMaxSpeed = NormalMaxSpeed;
|
||||||
|
m_SprintingMaxSpeed = SprintMaxSpeed;
|
||||||
|
m_FlyingMaxSpeed = FlyingMaxpeed;
|
||||||
|
m_IsFlying = IsFlying;
|
||||||
|
}
|
||||||
|
@ -693,11 +693,13 @@ protected:
|
|||||||
/** Tosses a list of items. */
|
/** Tosses a list of items. */
|
||||||
void TossItems(const cItems & a_Items);
|
void TossItems(const cItems & a_Items);
|
||||||
|
|
||||||
/** Pins the player to a_Location until Unfreeze() is called.
|
|
||||||
If ManuallyFrozen is false, the player will unfreeze when the chunk is loaded. */
|
|
||||||
void FreezeInternal(const Vector3d & a_Location, bool a_ManuallyFrozen);
|
|
||||||
|
|
||||||
/** Returns the filename for the player data based on the UUID given.
|
/** Returns the filename for the player data based on the UUID given.
|
||||||
This can be used both for online and offline UUIDs. */
|
This can be used both for online and offline UUIDs. */
|
||||||
AString GetUUIDFileName(const AString & a_UUID);
|
AString GetUUIDFileName(const AString & a_UUID);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/** Pins the player to a_Location until Unfreeze() is called.
|
||||||
|
If ManuallyFrozen is false, the player will unfreeze when the chunk is loaded. */
|
||||||
|
void FreezeInternal(const Vector3d & a_Location, bool a_ManuallyFrozen);
|
||||||
} ; // tolua_export
|
} ; // tolua_export
|
||||||
|
Loading…
Reference in New Issue
Block a user