aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorTeleqraph <nyrdeveloper@gmail.com>2022-07-03 16:00:14 +0200
committerGitHub <noreply@github.com>2022-07-03 16:00:14 +0200
commitebf1b6eb5cbfd1dc8f1b0d26c29ae1423784cabb (patch)
treef2e27de6472c4ef1f76fac1ae9422d3470589e1b /src/server/game/Entities/Object
parent9fcf920d0e69df5c8ca5078d3687f3843b51fcbd (diff)
Core/Creatures: Implemented sending different creature id for summoner (#28066)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src/server/game/Entities/Object')
-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.h32
3 files changed, 35 insertions, 2 deletions
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
index 70e228847b4..c3146b13bdc 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -37,7 +37,7 @@ namespace UF
{
void ObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Object const* owner, Player const* receiver) const
{
- data << int32(EntryID);
+ data << int32(ViewerDependentValue<EntryIDTag>::GetValue(this, owner, receiver));
data << uint32(ViewerDependentValue<DynamicFlagsTag>::GetValue(this, owner, receiver));
data << float(Scale);
}
@@ -56,7 +56,7 @@ void ObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign
{
if (changesMask[1])
{
- data << int32(EntryID);
+ data << int32(ViewerDependentValue<EntryIDTag>::GetValue(this, owner, receiver));
}
if (changesMask[2])
{
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index a4fcd0b65dd..5beb9c4b93a 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -47,6 +47,7 @@ namespace UF
struct ObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<4>
{
UpdateField<int32, 0, 1> EntryID;
+ struct EntryIDTag : ViewerDependentValueTag<int32> {};
UpdateField<uint32, 0, 2> DynamicFlags;
struct DynamicFlagsTag : ViewerDependentValueTag<uint32> {};
UpdateField<float, 0, 3> Scale;
diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
index 564b31a9b86..028fdd91a26 100644
--- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
+++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h
@@ -26,6 +26,7 @@
#include "Player.h"
#include "SpellInfo.h"
#include "SpellMgr.h"
+#include "TemporarySummon.h"
#include "World.h"
#include "WorldSession.h"
@@ -37,6 +38,25 @@ class ViewerDependentValue
};
template<>
+class ViewerDependentValue<UF::ObjectData::EntryIDTag>
+{
+public:
+ using value_type = UF::ObjectData::EntryIDTag::value_type;
+
+ static value_type GetValue(UF::ObjectData const* objectData, Object const* object, Player const* receiver)
+ {
+ value_type entryId = objectData->EntryID;
+
+ if (Unit const* unit = object->ToUnit())
+ if (TempSummon const* summon = unit->ToTempSummon())
+ if (summon->GetSummonerGUID() == receiver->GetGUID() && summon->GetCreatureIdVisibleToSummoner())
+ entryId = *summon->GetCreatureIdVisibleToSummoner();
+
+ return entryId;
+ }
+};
+
+template<>
class ViewerDependentValue<UF::ObjectData::DynamicFlagsTag>
{
public:
@@ -121,6 +141,18 @@ public:
{
CreatureTemplate const* cinfo = unit->ToCreature()->GetCreatureTemplate();
+ if (TempSummon const* summon = unit->ToTempSummon())
+ {
+ if (summon->GetSummonerGUID() == receiver->GetGUID())
+ {
+ if (summon->GetCreatureIdVisibleToSummoner())
+ cinfo = sObjectMgr->GetCreatureTemplate(*summon->GetCreatureIdVisibleToSummoner());
+
+ if (summon->GetDisplayIdVisibleToSummoner())
+ displayId = *summon->GetDisplayIdVisibleToSummoner();
+ }
+ }
+
// this also applies for transform auras
if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(unit->GetTransformSpell(), unit->GetMap()->GetDifficultyID()))
{