diff options
author | TheCarl <carlos93@users.noreply.github.com> | 2024-06-22 14:38:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-22 14:38:01 +0200 |
commit | 5ee28a9161e763c516a968bd83127da7073dc1e7 (patch) | |
tree | 29922f880d47a49781c86abf7f9b2ff310907dab | |
parent | 4fd013e20087989adab6b730396f40fe97de7436 (diff) |
Core/Players: Allow GMs to target npcs with UNIT_FLAG2_UNTARGETABLE_BY_CLIENT flag (#30041)
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 aae6e1dd1e9..fa0453e412d 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -995,7 +995,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) @@ -1388,7 +1388,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[43]) { - data << uint32(Flags2); + data << uint32(ViewerDependentValue<Flags2Tag>::GetValue(this, owner, receiver)); } if (changesMask[44]) { diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 4a09c05dd3b..0abb78c5711 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -304,6 +304,7 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<217> UpdateField<uint32, 32, 42> Flags; struct FlagsTag : ViewerDependentValueTag<uint32> {}; UpdateField<uint32, 32, 43> Flags2; + struct Flags2Tag : ViewerDependentValueTag<uint32> {}; UpdateField<uint32, 32, 44> Flags3; struct Flags3Tag : ViewerDependentValueTag<uint32> {}; UpdateField<uint32, 32, 45> 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: |