aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp7
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp139
-rw-r--r--src/server/game/Entities/Unit/Unit.h4
-rw-r--r--src/server/game/Movement/MovementStructures.cpp94
4 files changed, 117 insertions, 127 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 3be706b4cb6..153f6c3da89 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -5141,7 +5141,7 @@ void Player::BuildPlayerRepop()
SetHealth(1);
SetWaterWalking(true);
- if (!GetSession()->isLogingOut())
+ if (!GetSession()->isLogingOut() && !HasUnitState(UNIT_STATE_STUNNED))
SetRooted(false);
// BG - remove insignia related
@@ -5181,7 +5181,8 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness)
setDeathState(ALIVE);
SetWaterWalking(false);
- SetRooted(false);
+ if (!HasUnitState(UNIT_STATE_STUNNED))
+ SetRooted(false);
m_deathTimer = 0;
@@ -23125,7 +23126,7 @@ void Player::SendInitialPacketsAfterAddToMap()
// manual send package (have code in HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true); that must not be re-applied.
if (HasAuraType(SPELL_AURA_MOD_ROOT))
- SendMoveRoot(2);
+ SetRooted(true, true);
SendAurasForTarget(this);
SendEnchantmentDurations(); // must be after add to map
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 923030bde00..40450dfce2d 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -14329,7 +14329,8 @@ void Unit::SetControlled(bool apply, UnitState state)
if (HasAuraType(SPELL_AURA_MOD_ROOT) || GetVehicle())
return;
- SetRooted(false);
+ if (!HasUnitState(UNIT_STATE_STUNNED))
+ SetRooted(false);
break;
case UNIT_STATE_CONFUSED:
if (HasAuraType(SPELL_AURA_MOD_CONFUSE))
@@ -14364,63 +14365,6 @@ void Unit::SetControlled(bool apply, UnitState state)
}
}
-void Unit::SendMoveRoot(uint32 value)
-{
- ObjectGuid guid = GetGUID();
- WorldPacket data(SMSG_MOVE_ROOT, 1 + 8 + 4);
- data.WriteBit(guid[2]);
- data.WriteBit(guid[7]);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[3]);
-
- data.WriteByteSeq(guid[1]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(guid[5]);
-
- data << uint32(value);
-
-
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(guid[6]);
-
- SendMessageToSet(&data, true);
-}
-
-void Unit::SendMoveUnroot(uint32 value)
-{
- ObjectGuid guid = GetGUID();
- WorldPacket data(SMSG_MOVE_UNROOT, 1 + 8 + 4);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[7]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[2]);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[6]);
-
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[6]);
- data.WriteByteSeq(guid[1]);
-
- data << uint32(value);
-
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[5]);
-
- SendMessageToSet(&data, true);
-}
-
void Unit::SetStunned(bool apply)
{
if (apply)
@@ -14453,76 +14397,29 @@ void Unit::SetStunned(bool apply)
}
}
-void Unit::SetRooted(bool apply)
+void Unit::SetRooted(bool apply, bool packetOnly /*= false*/)
{
- if (apply)
+ if (!packetOnly)
{
- // 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 (apply == HasUnitMovementFlag(MOVEMENTFLAG_ROOT))
+ return;
- if (GetTypeId() == TYPEID_PLAYER)
- SendMoveRoot(m_movementCounter++);
- else
+ if (apply)
{
- ObjectGuid guid = GetGUID();
- WorldPacket data(SMSG_SPLINE_MOVE_ROOT, 8);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[7]);
- data.WriteBit(guid[2]);
- data.WriteBit(guid[0]);
- data.FlushBits();
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(guid[1]);
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[5]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[6]);
- data.WriteByteSeq(guid[4]);
- SendMessageToSet(&data, true);
- StopMoving();
+ // 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);
}
- }
- else
- {
- if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
- {
- if (GetTypeId() == TYPEID_PLAYER)
- SendMoveUnroot(m_movementCounter++);
- else
- {
- ObjectGuid guid = GetGUID();
- WorldPacket data(SMSG_SPLINE_MOVE_UNROOT, 8);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[2]);
- data.WriteBit(guid[7]);
- data.WriteBit(guid[4]);
- data.FlushBits();
- data.WriteByteSeq(guid[6]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[1]);
- data.WriteByteSeq(guid[5]);
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(guid[4]);
- SendMessageToSet(&data, true);
- }
-
+ else
RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
- }
}
+
+ if (apply)
+ Movement::PacketSender(this, SMSG_SPLINE_MOVE_ROOT, SMSG_MOVE_ROOT, SMSG_MOVE_ROOT).Send();
+ else
+ Movement::PacketSender(this, SMSG_SPLINE_MOVE_UNROOT, SMSG_MOVE_UNROOT, SMSG_MOVE_UNROOT).Send();
}
void Unit::SetFeared(bool apply)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 292204e9c7b..8eee9264582 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -2240,12 +2240,10 @@ class Unit : public WorldObject
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const;
protected:
- void SendMoveRoot(uint32 value);
- void SendMoveUnroot(uint32 value);
void SetFeared(bool apply);
void SetConfused(bool apply);
void SetStunned(bool apply);
- void SetRooted(bool apply);
+ void SetRooted(bool apply, bool packetOnly = false);
uint32 m_movementCounter; ///< Incrementing counter used in movement packets
diff --git a/src/server/game/Movement/MovementStructures.cpp b/src/server/game/Movement/MovementStructures.cpp
index 61f1ded14e3..a0f70c7b96c 100644
--- a/src/server/game/Movement/MovementStructures.cpp
+++ b/src/server/game/Movement/MovementStructures.cpp
@@ -4693,6 +4693,48 @@ MovementStatusElements const SplineMoveSetNormalFall[] =
MSEEnd,
};
+MovementStatusElements const SplineMoveRoot[] =
+{
+ MSEHasGuidByte5,
+ MSEHasGuidByte4,
+ MSEHasGuidByte6,
+ MSEHasGuidByte1,
+ MSEHasGuidByte3,
+ MSEHasGuidByte7,
+ MSEHasGuidByte2,
+ MSEHasGuidByte0,
+ MSEGuidByte2,
+ MSEGuidByte1,
+ MSEGuidByte7,
+ MSEGuidByte3,
+ MSEGuidByte5,
+ MSEGuidByte0,
+ MSEGuidByte6,
+ MSEGuidByte4,
+ MSEEnd,
+};
+
+MovementStatusElements const SplineMoveUnroot[] =
+{
+ MSEHasGuidByte0,
+ MSEHasGuidByte1,
+ MSEHasGuidByte6,
+ MSEHasGuidByte5,
+ MSEHasGuidByte3,
+ MSEHasGuidByte2,
+ MSEHasGuidByte7,
+ MSEHasGuidByte4,
+ MSEGuidByte6,
+ MSEGuidByte3,
+ MSEGuidByte1,
+ MSEGuidByte5,
+ MSEGuidByte2,
+ MSEGuidByte0,
+ MSEGuidByte7,
+ MSEGuidByte4,
+ MSEEnd,
+};
+
MovementStatusElements const MoveSetCanFly[] =
{
MSEHasGuidByte1,
@@ -4869,6 +4911,50 @@ MovementStatusElements const MoveNormalFall[] =
MSEEnd,
};
+MovementStatusElements const MoveRoot[] =
+{
+ MSEHasGuidByte2,
+ MSEHasGuidByte7,
+ MSEHasGuidByte6,
+ MSEHasGuidByte0,
+ MSEHasGuidByte5,
+ MSEHasGuidByte4,
+ MSEHasGuidByte1,
+ MSEHasGuidByte3,
+ MSEGuidByte1,
+ MSEGuidByte0,
+ MSEGuidByte2,
+ MSEGuidByte5,
+ MSECounter,
+ MSEGuidByte3,
+ MSEGuidByte4,
+ MSEGuidByte7,
+ MSEGuidByte6,
+ MSEEnd,
+};
+
+MovementStatusElements const MoveUnroot[] =
+{
+ MSEHasGuidByte0,
+ MSEHasGuidByte1,
+ MSEHasGuidByte3,
+ MSEHasGuidByte7,
+ MSEHasGuidByte5,
+ MSEHasGuidByte2,
+ MSEHasGuidByte4,
+ MSEHasGuidByte6,
+ MSEGuidByte3,
+ MSEGuidByte6,
+ MSEGuidByte1,
+ MSECounter,
+ MSEGuidByte2,
+ MSEGuidByte0,
+ MSEGuidByte7,
+ MSEGuidByte4,
+ MSEGuidByte5,
+ MSEEnd,
+};
+
MovementStatusElements const ChangeSeatsOnControlledVehicle[] =
{
MSEPositionY,
@@ -5333,6 +5419,10 @@ MovementStatusElements const* GetMovementStatusElementsSequence(Opcodes opcode)
return SplineMoveSetFeatherFall;
case SMSG_SPLINE_MOVE_SET_NORMAL_FALL:
return SplineMoveSetNormalFall;
+ case SMSG_SPLINE_MOVE_ROOT:
+ return SplineMoveRoot;
+ case SMSG_SPLINE_MOVE_UNROOT:
+ return SplineMoveUnroot;
case SMSG_MOVE_SET_CAN_FLY:
return MoveSetCanFly;
case SMSG_MOVE_UNSET_CAN_FLY:
@@ -5349,6 +5439,10 @@ MovementStatusElements const* GetMovementStatusElementsSequence(Opcodes opcode)
return MoveFeatherFall;
case SMSG_MOVE_NORMAL_FALL:
return MoveNormalFall;
+ case SMSG_MOVE_ROOT:
+ return MoveRoot;
+ case SMSG_MOVE_UNROOT:
+ return MoveUnroot;
case CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE:
return ChangeSeatsOnControlledVehicle;
case CMSG_CAST_SPELL: