diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-02-24 23:16:55 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-02-24 23:16:55 +0100 |
| commit | 9f30afe3528441571f89cb2e1775c756774fa0cd (patch) | |
| tree | 389fbe1f77dced54fa1aeb475584951f34ff9cfe /src/server/game/Entities | |
| parent | f96c8cc39ba15d7c9f0784428b9bbcbca4665370 (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.cpp | 18 | ||||
| -rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.h | 1 | ||||
| -rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTriggerTemplate.h | 19 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 1 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/GossipDef.h | 1 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/MovementInfo.h | 21 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 29 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateField.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.cpp | 106 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 67 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 10 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/UnitDefines.h | 6 |
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, |
