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 | |
| 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')
6 files changed, 61 insertions, 2 deletions
diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index e01d020120c..d11577da3bd 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -20,6 +20,7 @@ #include "Common.h" #include "DBCEnums.h" +#include "Optional.h" #include "SharedDefines.h" #include "SpawnData.h" #include "UnitDefines.h" @@ -605,6 +606,13 @@ struct CreatureModelInfo bool is_trigger; }; +struct CreatureSummonedData +{ + Optional<uint32> CreatureIDVisibleToSummoner; + Optional<uint32> GroundMountDisplayID; + Optional<uint32> FlyingMountDisplayID; +}; + enum InhabitTypeValues { INHABIT_GROUND = 1, diff --git a/src/server/game/Entities/Creature/TemporarySummon.cpp b/src/server/game/Entities/Creature/TemporarySummon.cpp index a389ff5f8fc..249edcf3e15 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.cpp +++ b/src/server/game/Entities/Creature/TemporarySummon.cpp @@ -25,6 +25,7 @@ #include "Log.h" #include "Map.h" #include "ObjectAccessor.h" +#include "ObjectMgr.h" #include "Pet.h" #include "Player.h" #include "SmoothPhasing.h" @@ -194,6 +195,19 @@ void TempSummon::InitStats(uint32 duration) if (owner->GetTypeId() == TYPEID_PLAYER) m_ControlledByPlayer = true; + if (owner && owner->IsPlayer()) + { + if (CreatureSummonedData const* summonedData = sObjectMgr->GetCreatureSummonedData(GetEntry())) + { + m_creatureIdVisibleToSummoner = summonedData->CreatureIDVisibleToSummoner; + if (summonedData->CreatureIDVisibleToSummoner) + { + CreatureTemplate const* creatureTemplateVisibleToSummoner = ASSERT_NOTNULL(sObjectMgr->GetCreatureTemplate(*summonedData->CreatureIDVisibleToSummoner)); + m_displayIdVisibleToSummoner = ObjectMgr::ChooseDisplayId(creatureTemplateVisibleToSummoner, nullptr)->CreatureDisplayID; + } + } + } + if (!m_Properties) return; diff --git a/src/server/game/Entities/Creature/TemporarySummon.h b/src/server/game/Entities/Creature/TemporarySummon.h index d9501cce342..27dfea28506 100644 --- a/src/server/game/Entities/Creature/TemporarySummon.h +++ b/src/server/game/Entities/Creature/TemporarySummon.h @@ -61,6 +61,8 @@ class TC_GAME_API TempSummon : public Creature ObjectGuid GetSummonerGUID() const { return m_summonerGUID; } TempSummonType GetSummonType() const { return m_type; } uint32 GetTimer() const { return m_timer; } + Optional<uint32> GetCreatureIdVisibleToSummoner() const { return m_creatureIdVisibleToSummoner; } + Optional<uint32> GetDisplayIdVisibleToSummoner() const { return m_displayIdVisibleToSummoner; } bool CanFollowOwner() const { return m_canFollowOwner; } void SetCanFollowOwner(bool can) { m_canFollowOwner = can; } @@ -72,6 +74,8 @@ class TC_GAME_API TempSummon : public Creature uint32 m_timer; uint32 m_lifetime; ObjectGuid m_summonerGUID; + Optional<uint32> m_creatureIdVisibleToSummoner; + Optional<uint32> m_displayIdVisibleToSummoner; bool m_canFollowOwner; }; 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())) { |
