diff options
author | TheCarl <carlos93@users.noreply.github.com> | 2024-06-22 14:38:01 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-06-23 23:52:03 +0200 |
commit | 0f6af797149e00a6139adef3681cc41ae99e6d5b (patch) | |
tree | 1c5d3a97386a6a44c26cde7e36154f58fe9ec65c /src | |
parent | e63d73f5cafd7433cd031fba8a55433eb327039c (diff) |
Core/Players: Allow GMs to target npcs with UNIT_FLAG2_UNTARGETABLE_BY_CLIENT flag (#30041)
(cherry picked from commit 5ee28a9161e763c516a968bd83127da7073dc1e7)
# Conflicts:
# src/server/game/Entities/Object/Updates/UpdateFields.cpp
# src/server/game/Entities/Object/Updates/UpdateFields.h
Diffstat (limited to 'src')
3 files changed, 20 insertions, 2 deletions
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 5b3ad53b13e..db98a205b5c 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -715,7 +715,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi VirtualItems[i].WriteCreate(data, owner, receiver); } data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver)); - data << uint32(Flags2); + data << uint32(ViewerDependentValue<Flags2Tag>::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver)); for (uint32 i = 0; i < 2; ++i) @@ -1098,7 +1098,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[42]) { - data << uint32(Flags2); + data << uint32(ViewerDependentValue<Flags2Tag>::GetValue(this, owner, receiver)); } if (changesMask[43]) { diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index cfc51d4d0fb..941aad27d07 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -241,6 +241,7 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<227> UpdateField<uint32, 32, 41> Flags; struct FlagsTag : ViewerDependentValueTag<uint32> {}; UpdateField<uint32, 32, 42> Flags2; + struct Flags2Tag : ViewerDependentValueTag<uint32> {}; UpdateField<uint32, 32, 43> Flags3; struct Flags3Tag : ViewerDependentValueTag<uint32> {}; UpdateField<uint32, 32, 44> AuraState; diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h index f73bed33eb5..4911f67518c 100644 --- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h +++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h @@ -241,6 +241,23 @@ public: }; template<> +class ViewerDependentValue<UF::UnitData::Flags2Tag> +{ +public: + using value_type = UF::UnitData::Flags2Tag::value_type; + + static value_type GetValue(UF::UnitData const* unitData, Unit const* /*unit*/, Player const* receiver) + { + value_type flags = unitData->Flags2; + // Gamemasters should be always able to interact with units - remove uninteractible flag + if (receiver->IsGameMaster()) + flags &= ~UNIT_FLAG2_UNTARGETABLE_BY_CLIENT; + + return flags; + } +}; + +template<> class ViewerDependentValue<UF::UnitData::Flags3Tag> { public: |