aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-02-24 23:16:55 +0100
committerShauren <shauren.trinity@gmail.com>2022-02-24 23:16:55 +0100
commit9f30afe3528441571f89cb2e1775c756774fa0cd (patch)
tree389fbe1f77dced54fa1aeb475584951f34ff9cfe /src/server/game/Entities
parentf96c8cc39ba15d7c9f0784428b9bbcbca4665370 (diff)
Core/PacketIO: Updated packet structures to 9.2.0
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp18
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.h1
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp4
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h19
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp1
-rw-r--r--src/server/game/Entities/Creature/GossipDef.h1
-rw-r--r--src/server/game/Entities/Object/MovementInfo.h21
-rw-r--r--src/server/game/Entities/Object/Object.cpp29
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateField.h2
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp106
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h67
-rw-r--r--src/server/game/Entities/Player/Player.cpp10
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp4
-rw-r--r--src/server/game/Entities/Unit/Unit.h9
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h6
15 files changed, 201 insertions, 97 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
index cd39c461f29..84d0a97af0b 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp
@@ -374,6 +374,9 @@ void AreaTrigger::UpdateTargetList()
case AREATRIGGER_TYPE_CYLINDER:
SearchUnitInCylinder(targetList);
break;
+ case AREATRIGGER_TYPE_DISK:
+ SearchUnitInDisk(targetList);
+ break;
default:
break;
}
@@ -469,6 +472,21 @@ void AreaTrigger::SearchUnitInCylinder(std::vector<Unit*>& targetList)
}), targetList.end());
}
+void AreaTrigger::SearchUnitInDisk(std::vector<Unit*>& targetList)
+{
+ SearchUnits(targetList, GetMaxSearchRadius(), false);
+
+ float innerRadius = _shape.DiskDatas.InnerRadius;
+ float height = _shape.DiskDatas.Height;
+ float minZ = GetPositionZ() - height;
+ float maxZ = GetPositionZ() + height;
+
+ targetList.erase(std::remove_if(targetList.begin(), targetList.end(), [this, innerRadius, minZ, maxZ](Unit const* unit) -> bool
+ {
+ return unit->IsInDist2d(this, innerRadius) || unit->GetPositionZ() < minZ || unit->GetPositionZ() > maxZ;
+ }), targetList.end());
+}
+
void AreaTrigger::HandleUnitEnterExit(std::vector<Unit*> const& newTargetList)
{
GuidUnorderedSet exitUnits(std::move(_insideUnits));
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.h b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
index 3ba82809ec3..ba5aaf7f69f 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTrigger.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.h
@@ -128,6 +128,7 @@ class TC_GAME_API AreaTrigger : public WorldObject, public GridObject<AreaTrigge
void SearchUnitInBox(std::vector<Unit*>& targetList);
void SearchUnitInPolygon(std::vector<Unit*>& targetList);
void SearchUnitInCylinder(std::vector<Unit*>& targetList);
+ void SearchUnitInDisk(std::vector<Unit*>& targetList);
bool CheckIsInPolygon2D(Position const* pos) const;
void HandleUnitEnterExit(std::vector<Unit*> const& targetList);
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
index c0a623a4b52..322a0bf44d6 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp
@@ -41,7 +41,9 @@ float AreaTriggerShapeInfo::GetMaxSearchRadius() const
case AREATRIGGER_TYPE_BOX:
return std::sqrt(BoxDatas.Extents[0] * BoxDatas.Extents[0] / 4 + BoxDatas.Extents[1] * BoxDatas.Extents[1] / 4);
case AREATRIGGER_TYPE_CYLINDER:
- return CylinderDatas.Radius;
+ return std::max(CylinderDatas.Radius, CylinderDatas.RadiusTarget);
+ case AREATRIGGER_TYPE_DISK:
+ return std::max(DiskDatas.OuterRadius, DiskDatas.OuterRadiusTarget);
default:
break;
}
diff --git a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
index 0eb87f833d1..46e79be387f 100644
--- a/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
+++ b/src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h
@@ -24,7 +24,7 @@
#include "SpawnData.h"
#include <vector>
-#define MAX_AREATRIGGER_ENTITY_DATA 6
+#define MAX_AREATRIGGER_ENTITY_DATA 8
#define MAX_AREATRIGGER_SCALE 7
enum AreaTriggerFlags
@@ -50,7 +50,8 @@ enum AreaTriggerTypes
AREATRIGGER_TYPE_UNK = 2,
AREATRIGGER_TYPE_POLYGON = 3,
AREATRIGGER_TYPE_CYLINDER = 4,
- AREATRIGGER_TYPE_MAX = 5
+ AREATRIGGER_TYPE_DISK = 5,
+ AREATRIGGER_TYPE_MAX
};
enum AreaTriggerActionTypes
@@ -123,6 +124,7 @@ struct AreaTriggerShapeInfo
bool IsBox() const { return Type == AREATRIGGER_TYPE_BOX; }
bool IsPolygon() const { return Type == AREATRIGGER_TYPE_POLYGON; }
bool IsCylinder() const { return Type == AREATRIGGER_TYPE_CYLINDER; }
+ bool IsDisk() const { return Type == AREATRIGGER_TYPE_DISK; }
float GetMaxSearchRadius() const;
AreaTriggerTypes Type;
@@ -165,6 +167,19 @@ struct AreaTriggerShapeInfo
float LocationZOffset;
float LocationZOffsetTarget;
} CylinderDatas;
+
+ // AREATRIGGER_TYPE_DISK
+ struct
+ {
+ float InnerRadius;
+ float InnerRadiusTarget;
+ float OuterRadius;
+ float OuterRadiusTarget;
+ float Height;
+ float HeightTarget;
+ float LocationZOffset;
+ float LocationZOffsetTarget;
+ } DiskDatas;
};
};
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index ca8d013999f..784de37b4cf 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -225,6 +225,7 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
opt.OptionNPC = item.MenuItemIcon;
opt.OptionFlags = item.IsCoded; // makes pop up box password
opt.OptionCost = item.BoxMoney; // money required to open menu, 2.0.3
+ opt.OptionLanguage = item.Language;
opt.Text = item.Message; // text for gossip item
opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
opt.Status = GossipOptionStatus::Available;
diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h
index 6c5391ae352..6d12a85f94a 100644
--- a/src/server/game/Entities/Creature/GossipDef.h
+++ b/src/server/game/Entities/Creature/GossipDef.h
@@ -131,6 +131,7 @@ struct GossipMenuItem
uint32 OptionType;
std::string BoxMessage;
uint32 BoxMoney;
+ uint32 Language;
};
// need an ordered container
diff --git a/src/server/game/Entities/Object/MovementInfo.h b/src/server/game/Entities/Object/MovementInfo.h
index 97d10d86105..f587d71e710 100644
--- a/src/server/game/Entities/Object/MovementInfo.h
+++ b/src/server/game/Entities/Object/MovementInfo.h
@@ -19,6 +19,7 @@
#define MovementInfo_h__
#include "ObjectGuid.h"
+#include "Optional.h"
#include "Position.h"
#include <algorithm>
#include <vector>
@@ -29,6 +30,7 @@ struct MovementInfo
ObjectGuid guid;
uint32 flags;
uint32 flags2;
+ uint32 flags3;
Position pos;
uint32 time;
@@ -56,6 +58,17 @@ struct MovementInfo
// swimming/flying
float pitch;
+ struct Inertia
+ {
+ Inertia() : lifetime(0) { }
+
+ ObjectGuid guid;
+ Position force;
+ uint32 lifetime;
+ };
+
+ Optional<Inertia> inertia;
+
// jumping
struct JumpInfo
{
@@ -75,7 +88,7 @@ struct MovementInfo
float splineElevation;
MovementInfo() :
- flags(0), flags2(0), time(0), pitch(0.0f), splineElevation(0.0f)
+ flags(0), flags2(0), flags3(0), time(0), pitch(0.0f), splineElevation(0.0f)
{
pos.Relocate(0.0f, 0.0f, 0.0f, 0.0f);
transport.Reset();
@@ -94,6 +107,12 @@ struct MovementInfo
void RemoveExtraMovementFlag(uint32 flag) { flags2 &= ~flag; }
bool HasExtraMovementFlag(uint32 flag) const { return (flags2 & flag) != 0; }
+ uint32 GetExtraMovementFlags2() const { return flags3; }
+ void SetExtraMovementFlags2(uint32 flag) { flags3 = flag; }
+ void AddExtraMovementFlag2(uint32 flag) { flags3 |= flag; }
+ void RemoveExtraMovementFlag2(uint32 flag) { flags3 &= ~flag; }
+ bool HasExtraMovementFlag2(uint32 flag) const { return (flags3 & flag) != 0; }
+
uint32 GetFallTime() const { return jump.fallTime; }
void SetFallTime(uint32 fallTime) { jump.fallTime = fallTime; }
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index e2df959e8d7..995f1b7b29c 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -299,9 +299,14 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
bool HasFallDirection = unit->HasUnitMovementFlag(MOVEMENTFLAG_FALLING);
bool HasFall = HasFallDirection || unit->m_movementInfo.jump.fallTime != 0;
bool HasSpline = unit->IsSplineEnabled();
+ bool HasInertia = unit->m_movementInfo.inertia.has_value();
*data << GetGUID(); // MoverGUID
+ *data << uint32(unit->GetUnitMovementFlags());
+ *data << uint32(unit->GetExtraUnitMovementFlags());
+ *data << uint32(unit->GetExtraUnitMovementFlags2());
+
*data << uint32(unit->m_movementInfo.time); // MoveTime
*data << float(unit->GetPositionX());
*data << float(unit->GetPositionY());
@@ -317,17 +322,23 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
//for (std::size_t i = 0; i < RemoveForcesIDs.size(); ++i)
// *data << ObjectGuid(RemoveForcesIDs);
- data->WriteBits(unit->GetUnitMovementFlags(), 30);
- data->WriteBits(unit->GetExtraUnitMovementFlags(), 18);
data->WriteBit(!unit->m_movementInfo.transport.guid.IsEmpty()); // HasTransport
data->WriteBit(HasFall); // HasFall
data->WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement
data->WriteBit(false); // HeightChangeFailed
data->WriteBit(false); // RemoteTimeValid
+ data->WriteBit(HasInertia); // HasInertia
if (!unit->m_movementInfo.transport.guid.IsEmpty())
*data << unit->m_movementInfo.transport;
+ if (HasInertia)
+ {
+ *data << unit->m_movementInfo.inertia->guid;
+ *data << unit->m_movementInfo.inertia->force.PositionXYZStream();
+ *data << uint32(unit->m_movementInfo.inertia->lifetime);
+ }
+
if (HasFall)
{
*data << uint32(unit->m_movementInfo.jump.fallTime); // Time
@@ -454,6 +465,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
bool hasAreaTriggerBox = shape.IsBox();
bool hasAreaTriggerPolygon = createProperties && shape.IsPolygon();
bool hasAreaTriggerCylinder = shape.IsCylinder();
+ bool hasDisk = shape.IsDisk();
bool hasAreaTriggerSpline = areaTrigger->HasSplines();
bool hasOrbit = areaTrigger->HasOrbit();
bool hasMovementScript = false;
@@ -473,6 +485,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
data->WriteBit(hasAreaTriggerBox);
data->WriteBit(hasAreaTriggerPolygon);
data->WriteBit(hasAreaTriggerCylinder);
+ data->WriteBit(hasDisk);
data->WriteBit(hasAreaTriggerSpline);
data->WriteBit(hasOrbit);
data->WriteBit(hasMovementScript);
@@ -542,6 +555,18 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
*data << float(shape.CylinderDatas.LocationZOffsetTarget);
}
+ if (hasDisk)
+ {
+ *data << float(shape.DiskDatas.InnerRadius);
+ *data << float(shape.DiskDatas.InnerRadiusTarget);
+ *data << float(shape.DiskDatas.OuterRadius);
+ *data << float(shape.DiskDatas.OuterRadiusTarget);
+ *data << float(shape.DiskDatas.Height);
+ *data << float(shape.DiskDatas.HeightTarget);
+ *data << float(shape.DiskDatas.LocationZOffset);
+ *data << float(shape.DiskDatas.LocationZOffsetTarget);
+ }
+
//if (hasMovementScript)
// *data << *areaTrigger->GetMovementScript(); // AreaTriggerMovementScriptInfo
diff --git a/src/server/game/Entities/Object/Updates/UpdateField.h b/src/server/game/Entities/Object/Updates/UpdateField.h
index edb07858d30..877c2b72ec8 100644
--- a/src/server/game/Entities/Object/Updates/UpdateField.h
+++ b/src/server/game/Entities/Object/Updates/UpdateField.h
@@ -756,7 +756,7 @@ namespace UF
return Size;
}
- T const& operator[](uint32 index) const
+ T const& operator[](std::size_t index) const
{
return _values[index];
}
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
index 230216889ad..dae7ea5e396 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -328,13 +328,13 @@ void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
-void ItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
+void ItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
allowedMaskForTarget |= { 0x03FB1B00u, 0x00000000u };
}
-void ItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
+void ItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
Mask allowedMaskForTarget({ 0xFC04E4FFu, 0x000000FFu });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
@@ -713,13 +713,13 @@ void AzeriteItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
-void AzeriteItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
+void AzeriteItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
allowedMaskForTarget |= { 0x000003E2u };
}
-void AzeriteItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
+void AzeriteItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
Mask allowedMaskForTarget({ 0x0000001Du });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
@@ -1114,7 +1114,6 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << uint32(PassiveSpells.size());
data << uint32(WorldEffects.size());
data << uint32(ChannelObjects.size());
- data << SkinningOwnerGUID;
data << uint32(SilencedSchoolMask);
data << NameplateAttachToGUID;
for (std::size_t i = 0; i < PassiveSpells.size(); ++i)
@@ -1133,24 +1132,24 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0xFE0007FFu, 0x00000000u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x7F0003FFu, 0x00000000u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
-void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
+void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
- allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x1000007Eu, 0x01FFF800u, 0xFFFFFFFFu, 0x00000007u };
+ allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0800007Eu, 0x80FFFC00u, 0xFFFFFFFFu, 0x00000003u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll))
- allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x10000000u, 0x01FFF800u, 0x00000000u, 0x00000000u };
+ allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x08000000u, 0x00FFFC00u, 0x00000000u, 0x00000000u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath))
- allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x001FE000u, 0x00000000u };
+ allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000FF000u, 0x00000000u };
}
-void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
+void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0xFE0007FFu, 0x00000000u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x7F0003FFu, 0x00000000u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
@@ -1682,100 +1681,96 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
if (changesMask[118])
{
- data << SkinningOwnerGUID;
- }
- if (changesMask[119])
- {
data << uint32(SilencedSchoolMask);
}
- if (changesMask[120])
+ if (changesMask[119])
{
data << NameplateAttachToGUID;
}
}
- if (changesMask[121])
+ if (changesMask[120])
{
for (std::size_t i = 0; i < 2; ++i)
{
- if (changesMask[122 + i])
+ if (changesMask[121 + i])
{
data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver));
}
}
}
- if (changesMask[124])
+ if (changesMask[123])
{
for (std::size_t i = 0; i < 7; ++i)
{
- if (changesMask[125 + i])
+ if (changesMask[124 + i])
{
data << int32(Power[i]);
}
- if (changesMask[132 + i])
+ if (changesMask[131 + i])
{
data << int32(MaxPower[i]);
}
- if (changesMask[139 + i])
+ if (changesMask[138 + i])
{
data << float(PowerRegenFlatModifier[i]);
}
- if (changesMask[146 + i])
+ if (changesMask[145 + i])
{
data << float(PowerRegenInterruptedFlatModifier[i]);
}
}
}
- if (changesMask[153])
+ if (changesMask[152])
{
for (std::size_t i = 0; i < 3; ++i)
{
- if (changesMask[154 + i])
+ if (changesMask[153 + i])
{
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[157])
+ if (changesMask[156])
{
for (std::size_t i = 0; i < 2; ++i)
{
- if (changesMask[158 + i])
+ if (changesMask[157 + i])
{
data << uint32(AttackRoundBaseTime[i]);
}
}
}
- if (changesMask[160])
+ if (changesMask[159])
{
for (std::size_t i = 0; i < 4; ++i)
{
- if (changesMask[161 + i])
+ if (changesMask[160 + i])
{
data << int32(Stats[i]);
}
- if (changesMask[165 + i])
+ if (changesMask[164 + i])
{
data << int32(StatPosBuff[i]);
}
- if (changesMask[169 + i])
+ if (changesMask[168 + i])
{
data << int32(StatNegBuff[i]);
}
}
}
- if (changesMask[173])
+ if (changesMask[172])
{
for (std::size_t i = 0; i < 7; ++i)
{
- if (changesMask[174 + i])
+ if (changesMask[173 + i])
{
data << int32(Resistances[i]);
}
- if (changesMask[181 + i])
+ if (changesMask[180 + i])
{
data << int32(BonusResistanceMods[i]);
}
- if (changesMask[188 + i])
+ if (changesMask[187 + i])
{
data << int32(ManaCostModifier[i]);
}
@@ -1899,7 +1894,6 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(LookAtControllerID);
Base::ClearChangesMask(TaxiNodesID);
Base::ClearChangesMask(GuildGUID);
- Base::ClearChangesMask(SkinningOwnerGUID);
Base::ClearChangesMask(SilencedSchoolMask);
Base::ClearChangesMask(NameplateAttachToGUID);
Base::ClearChangesMask(NpcFlags);
@@ -2170,13 +2164,13 @@ void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
-void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
+void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember))
allowedMaskForTarget |= { 0x00000012u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000001u };
}
-void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const
+void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0FFFFFFEu });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
@@ -4434,11 +4428,11 @@ void GameObjectData::ClearChangesMask()
void DynamicObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, DynamicObject const* owner, Player const* receiver) const
{
data << Caster;
+ data << uint8(Type);
SpellVisual->WriteCreate(data, owner, receiver);
data << int32(SpellID);
data << float(Radius);
data << uint32(CastTime);
- data << uint8(Type);
}
void DynamicObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, DynamicObject const* owner, Player const* receiver) const
@@ -4459,23 +4453,23 @@ void DynamicObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, b
}
if (changesMask[2])
{
- SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ data << uint8(Type);
}
if (changesMask[3])
{
- data << int32(SpellID);
+ SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[4])
{
- data << float(Radius);
+ data << int32(SpellID);
}
if (changesMask[5])
{
- data << uint32(CastTime);
+ data << float(Radius);
}
if (changesMask[6])
{
- data << uint8(Type);
+ data << uint32(CastTime);
}
}
}
@@ -4483,11 +4477,11 @@ void DynamicObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, b
void DynamicObjectData::ClearChangesMask()
{
Base::ClearChangesMask(Caster);
+ Base::ClearChangesMask(Type);
Base::ClearChangesMask(SpellVisual);
Base::ClearChangesMask(SpellID);
Base::ClearChangesMask(Radius);
Base::ClearChangesMask(CastTime);
- Base::ClearChangesMask(Type);
_changesMask.ResetAll();
}
@@ -4752,7 +4746,9 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi
data << float(BoundsRadius2D);
data << uint32(DecalPropertiesID);
data << CreatingEffectGUID;
- data << Field_80;
+ data << uint32(Field_80);
+ data << uint32(Field_84);
+ data << Field_88;
ExtraScaleCurve->WriteCreate(data, owner, receiver);
VisualAnim->WriteCreate(data, owner, receiver);
}
@@ -4764,7 +4760,7 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi
void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
- data.WriteBits(changesMask.GetBlock(0), 16);
+ data.WriteBits(changesMask.GetBlock(0), 18);
data.FlushBits();
if (changesMask[0])
@@ -4819,13 +4815,21 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, boo
}
if (changesMask[14])
{
- data << Field_80;
+ data << uint32(Field_80);
+ }
+ if (changesMask[15])
+ {
+ data << uint32(Field_84);
+ }
+ if (changesMask[16])
+ {
+ data << Field_88;
}
if (changesMask[2])
{
ExtraScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[15])
+ if (changesMask[17])
{
VisualAnim->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
@@ -4848,6 +4852,8 @@ void AreaTriggerData::ClearChangesMask()
Base::ClearChangesMask(DecalPropertiesID);
Base::ClearChangesMask(CreatingEffectGUID);
Base::ClearChangesMask(Field_80);
+ Base::ClearChangesMask(Field_84);
+ Base::ClearChangesMask(Field_88);
Base::ClearChangesMask(VisualAnim);
_changesMask.ResetAll();
}
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index 01afa7941cb..a9967827f7a 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -139,8 +139,8 @@ struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<40>
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Item const* owner, Player const* receiver) const;
- void AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
- void FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
+ static void AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags);
+ static void FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags);
void ClearChangesMask();
};
@@ -202,8 +202,8 @@ struct AzeriteItemData : public IsUpdateFieldStructureTag, public HasChangesMask
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AzeriteItem const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AzeriteItem const* owner, Player const* receiver) const;
- void AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
- void FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
+ static void AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags);
+ static void FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags);
void ClearChangesMask();
};
@@ -252,7 +252,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag
bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); }
};
-struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<195>
+struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<194>
{
UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs;
DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells;
@@ -373,29 +373,28 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<195>
UpdateField<int32, 96, 115> LookAtControllerID;
UpdateField<int32, 96, 116> TaxiNodesID;
UpdateField<ObjectGuid, 96, 117> GuildGUID;
- UpdateField<ObjectGuid, 96, 118> SkinningOwnerGUID;
- UpdateField<uint32, 96, 119> SilencedSchoolMask;
- UpdateField<ObjectGuid, 96, 120> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
- UpdateFieldArray<uint32, 2, 121, 122> NpcFlags;
+ UpdateField<uint32, 96, 118> SilencedSchoolMask;
+ UpdateField<ObjectGuid, 96, 119> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
+ UpdateFieldArray<uint32, 2, 120, 121> NpcFlags;
struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
- UpdateFieldArray<int32, 7, 124, 125> Power;
- UpdateFieldArray<int32, 7, 124, 132> MaxPower;
- UpdateFieldArray<float, 7, 124, 139> PowerRegenFlatModifier;
- UpdateFieldArray<float, 7, 124, 146> PowerRegenInterruptedFlatModifier;
- UpdateFieldArray<UF::VisibleItem, 3, 153, 154> VirtualItems;
- UpdateFieldArray<uint32, 2, 157, 158> AttackRoundBaseTime;
- UpdateFieldArray<int32, 4, 160, 161> Stats;
- UpdateFieldArray<int32, 4, 160, 165> StatPosBuff;
- UpdateFieldArray<int32, 4, 160, 169> StatNegBuff;
- UpdateFieldArray<int32, 7, 173, 174> Resistances;
- UpdateFieldArray<int32, 7, 173, 181> BonusResistanceMods;
- UpdateFieldArray<int32, 7, 173, 188> ManaCostModifier;
+ UpdateFieldArray<int32, 7, 123, 124> Power;
+ UpdateFieldArray<int32, 7, 123, 131> MaxPower;
+ UpdateFieldArray<float, 7, 123, 138> PowerRegenFlatModifier;
+ UpdateFieldArray<float, 7, 123, 145> PowerRegenInterruptedFlatModifier;
+ UpdateFieldArray<UF::VisibleItem, 3, 152, 153> VirtualItems;
+ UpdateFieldArray<uint32, 2, 156, 157> AttackRoundBaseTime;
+ UpdateFieldArray<int32, 4, 159, 160> Stats;
+ UpdateFieldArray<int32, 4, 159, 164> StatPosBuff;
+ UpdateFieldArray<int32, 4, 159, 168> StatNegBuff;
+ UpdateFieldArray<int32, 7, 172, 173> Resistances;
+ UpdateFieldArray<int32, 7, 172, 180> BonusResistanceMods;
+ UpdateFieldArray<int32, 7, 172, 187> ManaCostModifier;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Unit const* owner, Player const* receiver) const;
- void AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
- void FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
+ static void AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags);
+ static void FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags);
void ClearChangesMask();
};
@@ -493,8 +492,8 @@ struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<188>
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, Player const* owner, Player const* receiver) const;
- void AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
- void FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags) const;
+ static void AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags);
+ static void FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags);
void ClearChangesMask();
bool IsQuestLogChangesMaskSkipped() const { return false; } // bandwidth savings aren't worth the cpu time
};
@@ -823,11 +822,11 @@ struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<
struct DynamicObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<7>
{
UpdateField<ObjectGuid, 0, 1> Caster;
- UpdateField<UF::SpellCastVisual, 0, 2> SpellVisual;
- UpdateField<int32, 0, 3> SpellID;
- UpdateField<float, 0, 4> Radius;
- UpdateField<uint32, 0, 5> CastTime;
- UpdateField<uint8, 0, 6> Type;
+ UpdateField<uint8, 0, 2> Type;
+ UpdateField<UF::SpellCastVisual, 0, 3> SpellVisual;
+ UpdateField<int32, 0, 4> SpellID;
+ UpdateField<float, 0, 5> Radius;
+ UpdateField<uint32, 0, 6> CastTime;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, DynamicObject const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, DynamicObject const* owner, Player const* receiver) const;
@@ -881,7 +880,7 @@ struct VisualAnim : public IsUpdateFieldStructureTag, public HasChangesMask<5>
void ClearChangesMask();
};
-struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<16>
+struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<18>
{
UpdateField<UF::ScaleCurve, 0, 1> OverrideScaleCurve;
UpdateField<UF::ScaleCurve, 0, 2> ExtraScaleCurve;
@@ -896,8 +895,10 @@ struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask
UpdateField<float, 0, 11> BoundsRadius2D;
UpdateField<uint32, 0, 12> DecalPropertiesID;
UpdateField<ObjectGuid, 0, 13> CreatingEffectGUID;
- UpdateField<ObjectGuid, 0, 14> Field_80;
- UpdateField<UF::VisualAnim, 0, 15> VisualAnim;
+ UpdateField<uint32, 0, 14> Field_80;
+ UpdateField<uint32, 0, 15> Field_84;
+ UpdateField<ObjectGuid, 0, 16> Field_88;
+ UpdateField<UF::VisualAnim, 0, 17> VisualAnim;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index da41e6bfa72..a5c11f6e736 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -28528,11 +28528,11 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId)
if (playerChoiceResponseTemplate.MawPower)
{
WorldPackets::Quest::PlayerChoiceResponseMawPower& mawPower = playerChoiceResponse.MawPower.emplace();
- mawPower.TypeArtFileID = playerChoiceResponse.MawPower->TypeArtFileID;
- mawPower.Rarity = playerChoiceResponse.MawPower->Rarity;
- mawPower.RarityColor = playerChoiceResponse.MawPower->RarityColor;
- mawPower.SpellID = playerChoiceResponse.MawPower->SpellID;
- mawPower.MaxStacks = playerChoiceResponse.MawPower->MaxStacks;
+ mawPower.TypeArtFileID = playerChoiceResponseTemplate.MawPower->TypeArtFileID;
+ mawPower.Rarity = playerChoiceResponseTemplate.MawPower->Rarity;
+ mawPower.RarityColor = playerChoiceResponseTemplate.MawPower->RarityColor;
+ mawPower.SpellID = playerChoiceResponseTemplate.MawPower->SpellID;
+ mawPower.MaxStacks = playerChoiceResponseTemplate.MawPower->MaxStacks;
}
}
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 36b257543c3..1301968399b 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -1519,7 +1519,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
}
}
-void Unit::HandleEmoteCommand(Emote emoteId, Player* target /*=nullptr*/, Trinity::IteratorPair<int32 const*> spellVisualKitIds /*= {}*/)
+void Unit::HandleEmoteCommand(Emote emoteId, Player* target /*=nullptr*/, Trinity::IteratorPair<int32 const*> spellVisualKitIds /*= {}*/, int32 sequenceVariation /*= 0*/)
{
WorldPackets::Chat::Emote packet;
packet.Guid = GetGUID();
@@ -1529,6 +1529,8 @@ void Unit::HandleEmoteCommand(Emote emoteId, Player* target /*=nullptr*/, Trinit
if (emotesEntry->AnimID == ANIM_MOUNT_SPECIAL || emotesEntry->AnimID == ANIM_MOUNT_SELF_SPECIAL)
std::copy(spellVisualKitIds.begin(), spellVisualKitIds.end(), std::back_inserter(packet.SpellVisualKitIDs));
+ packet.SequenceVariation = sequenceVariation;
+
if (target)
target->SendDirectMessage(packet.Write());
else
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 50acbb61055..11f5b856aee 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1041,7 +1041,7 @@ class TC_GAME_API Unit : public WorldObject
DamageInfo* damageInfo, HealInfo* healInfo);
void TriggerAurasProcOnEvent(ProcEventInfo& eventInfo, AuraApplicationProcContainer& procAuras);
- void HandleEmoteCommand(Emote emoteId, Player* target = nullptr, Trinity::IteratorPair<int32 const*> spellVisualKitIds = {});
+ void HandleEmoteCommand(Emote emoteId, Player* target = nullptr, Trinity::IteratorPair<int32 const*> spellVisualKitIds = {}, int32 sequenceVariation = 0);
void AttackerStateUpdate (Unit* victim, WeaponAttackType attType = BASE_ATTACK, bool extra = false);
void CalculateMeleeDamage(Unit* victim, CalcDamageInfo* damageInfo, WeaponAttackType attackType = BASE_ATTACK);
@@ -1738,6 +1738,13 @@ class TC_GAME_API Unit : public WorldObject
bool HasExtraUnitMovementFlag(uint32 f) const { return m_movementInfo.HasExtraMovementFlag(f); }
uint32 GetExtraUnitMovementFlags() const { return m_movementInfo.GetExtraMovementFlags(); }
void SetExtraUnitMovementFlags(uint32 f) { m_movementInfo.SetExtraMovementFlags(f); }
+
+ void AddExtraUnitMovementFlag2(uint32 f) { m_movementInfo.AddExtraMovementFlag2(f); }
+ void RemoveExtraUnitMovementFlag2(uint32 f) { m_movementInfo.RemoveExtraMovementFlag2(f); }
+ bool HasExtraUnitMovementFlag2(uint32 f) const { return m_movementInfo.HasExtraMovementFlag2(f); }
+ uint32 GetExtraUnitMovementFlags2() const { return m_movementInfo.GetExtraMovementFlags2(); }
+ void SetExtraUnitMovementFlags2(uint32 f) { m_movementInfo.SetExtraMovementFlags2(f); }
+
bool IsSplineEnabled() const;
void SetControlled(bool apply, UnitState state);
diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h
index 3e3d124dc28..2377fac002b 100644
--- a/src/server/game/Entities/Unit/UnitDefines.h
+++ b/src/server/game/Entities/Unit/UnitDefines.h
@@ -333,6 +333,12 @@ enum MovementFlags2 : uint32
MOVEMENTFLAG2_INTERPOLATED_PITCHING = 0x00080000
};
+enum MovementFlags3 : uint32
+{
+ MOVEMENTFLAG3_NONE = 0x00000000,
+ MOVEMENTFLAG3_DISABLE_INERTIA = 0x00000001,
+};
+
enum HitInfo
{
HITINFO_NORMALSWING = 0x00000000,