aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheCarl <carlos93@users.noreply.github.com>2024-06-22 14:38:01 +0200
committerGitHub <noreply@github.com>2024-06-22 14:38:01 +0200
commit5ee28a9161e763c516a968bd83127da7073dc1e7 (patch)
tree29922f880d47a49781c86abf7f9b2ff310907dab
parent4fd013e20087989adab6b730396f40fe97de7436 (diff)
Core/Players: Allow GMs to target npcs with UNIT_FLAG2_UNTARGETABLE_BY_CLIENT flag (#30041)
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp4
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h1
-rw-r--r--src/server/game/Entities/Object/Updates/ViewerDependentValues.h17
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: