diff options
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 7 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 139 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 4 | ||||
| -rw-r--r-- | src/server/game/Movement/MovementStructures.cpp | 94 |
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: |
