diff options
| author | Teleqraph <nyrdeveloper@gmail.com> | 2022-07-03 16:00:14 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-03 16:00:14 +0200 |
| commit | ebf1b6eb5cbfd1dc8f1b0d26c29ae1423784cabb (patch) | |
| tree | f2e27de6472c4ef1f76fac1ae9422d3470589e1b /src/server/game/Entities/Object | |
| parent | 9fcf920d0e69df5c8ca5078d3687f3843b51fcbd (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')
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())) { |
