fix(Core/Movement): Properly handled root movement acks. (#8019)

Fixes #7892
This commit is contained in:
UltraNix
2021-10-01 10:41:31 +02:00
committed by GitHub
parent 7001865186
commit 0c8fb1ea73
3 changed files with 111 additions and 112 deletions

View File

@@ -17174,44 +17174,16 @@ void Unit::SetStunned(bool apply)
{
if (apply)
{
if (m_rootTimes > 0) // blizzard internal check?
m_rootTimes++;
SetTarget();
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
// MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a)
// this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
// setting MOVEMENTFLAG_ROOT
RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING);
AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
if (GetTypeId() == TYPEID_PLAYER)
{
WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10);
data << GetPackGUID();
data << m_rootTimes;
SendMessageToSet(&data, true);
}
else
{
WorldPacket data(SMSG_SPLINE_MOVE_ROOT, 8);
data << GetPackGUID();
SendMessageToSet(&data, true);
}
// xinef: inform client about our current orientation
SendMovementFlagUpdate();
// Creature specific
if (GetTypeId() != TYPEID_PLAYER)
StopMoving();
else
{
SetStandState(UNIT_STAND_STATE_STAND);
sScriptMgr->AnticheatSetSkipOnePacketForASH(ToPlayer(), true);
}
SetRooted(true);
CastStop();
}
else
@@ -17236,21 +17208,7 @@ void Unit::SetStunned(bool apply)
if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
{
if (GetTypeId() == TYPEID_PLAYER)
{
WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 10);
data << GetPackGUID();
data << ++m_rootTimes;
SendMessageToSet(&data, true);
}
else
{
WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8);
data << GetPackGUID();
SendMessageToSet(&data, true);
}
RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
SetRooted(false);
}
}
}
@@ -17266,44 +17224,55 @@ void Unit::SetRooted(bool apply)
// this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
// setting MOVEMENTFLAG_ROOT
RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING);
AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
if (GetTypeId() == TYPEID_PLAYER)
if (IsFalling())
{
WorldPacket data(SMSG_FORCE_MOVE_ROOT, 10);
data << GetPackGUID();
data << m_rootTimes;
SendMessageToSet(&data, true);
sScriptMgr->AnticheatSetSkipOnePacketForASH(ToPlayer(), true);
AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
}
else
{
WorldPacket data(SMSG_SPLINE_MOVE_ROOT, 8);
AddUnitMovementFlag(MOVEMENTFLAG_PENDING_ROOT);
}
// Creature specific
if (GetTypeId() != TYPEID_PLAYER)
{
StopMoving();
}
if (m_movedByPlayer)
{
WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
data << GetPackGUID();
data << m_rootTimes;
m_movedByPlayer->ToPlayer()->SendDirectMessage(&data);
}
else
{
WorldPacket data(SMSG_SPLINE_MOVE_ROOT, GetPackGUID().size());
data << GetPackGUID();
SendMessageToSet(&data, true);
StopMoving();
}
}
else
{
RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT | MOVEMENTFLAG_PENDING_ROOT);
if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
{
if (GetTypeId() == TYPEID_PLAYER)
if (m_movedByPlayer)
{
WorldPacket data(SMSG_FORCE_MOVE_UNROOT, 10);
WorldPacket data(SMSG_FORCE_MOVE_UNROOT, GetPackGUID().size() + 4);
data << GetPackGUID();
data << ++m_rootTimes;
SendMessageToSet(&data, true);
data << m_rootTimes;
m_movedByPlayer->ToPlayer()->SendDirectMessage(&data);
}
else
{
WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8);
WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, GetPackGUID().size());
data << GetPackGUID();
SendMessageToSet(&data, true);
}
RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
}
}
}