From 0f6af797149e00a6139adef3681cc41ae99e6d5b Mon Sep 17 00:00:00 2001 From: TheCarl Date: Sat, 22 Jun 2024 14:38:01 +0200 Subject: 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 --- .../game/Entities/Object/Updates/UpdateFields.cpp | 4 ++-- src/server/game/Entities/Object/Updates/UpdateFields.h | 1 + .../Entities/Object/Updates/ViewerDependentValues.h | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) (limited to 'src/server/game') 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 fieldVisi VirtualItems[i].WriteCreate(data, owner, receiver); } data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); - data << uint32(Flags2); + data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue::GetValue(this, owner, receiver)); data << uint32(ViewerDependentValue::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::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 Flags; struct FlagsTag : ViewerDependentValueTag {}; UpdateField Flags2; + struct Flags2Tag : ViewerDependentValueTag {}; UpdateField Flags3; struct Flags3Tag : ViewerDependentValueTag {}; UpdateField 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 @@ -240,6 +240,23 @@ public: } }; +template<> +class ViewerDependentValue +{ +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 { -- cgit v1.2.3