diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-02-10 14:20:09 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-02-10 14:20:09 +0100 |
| commit | 6543d23a1a70768e9dce89b33ae7bf5fe6cdcc1e (patch) | |
| tree | 69e3e2a96157444cda50a7af76ac97d736e20637 /src/server/game/Entities/Object | |
| parent | 761dac8f4a0d9d05a22f2af0b9f8e140b680b8bc (diff) | |
Core/Creatures: Set InteractSpellID for npc spellclick
Diffstat (limited to 'src/server/game/Entities/Object')
3 files changed, 33 insertions, 2 deletions
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp index 905cc26e982..2e012897754 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp @@ -1105,7 +1105,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi data << int32(WildBattlePetLevel); data << int32(BattlePetCompanionExperience); data << uint32(BattlePetCompanionNameTimestamp); - data << int32(InteractSpellID); + data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver)); data << int32(ScaleDuration); data << int32(LooksLikeMountID); data << int32(LooksLikeCreatureID); @@ -1670,7 +1670,7 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor } if (changesMask[114]) { - data << int32(InteractSpellID); + data << int32(ViewerDependentValue<InteractSpellIDTag>::GetValue(this, owner, receiver)); } if (changesMask[115]) { diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 626ba71ec11..078f0e5738c 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -376,6 +376,7 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<217> UpdateField<int32, 96, 112> BattlePetCompanionExperience; UpdateField<uint32, 96, 113> BattlePetCompanionNameTimestamp; UpdateField<int32, 96, 114> InteractSpellID; + struct InteractSpellIDTag : ViewerDependentValueTag<int32> {}; UpdateField<int32, 96, 115> ScaleDuration; UpdateField<int32, 96, 116> LooksLikeMountID; UpdateField<int32, 96, 117> LooksLikeCreatureID; diff --git a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h index 371c0e2ab39..852ba9b86e3 100644 --- a/src/server/game/Entities/Object/Updates/ViewerDependentValues.h +++ b/src/server/game/Entities/Object/Updates/ViewerDependentValues.h @@ -288,6 +288,36 @@ public: }; template<> +class ViewerDependentValue<UF::UnitData::InteractSpellIDTag> +{ +public: + using value_type = UF::UnitData::InteractSpellIDTag::value_type; + + static value_type GetValue(UF::UnitData const* unitData, Unit const* unit, Player const* receiver) + { + value_type interactSpellId = unitData->InteractSpellID; + if (unitData->NpcFlags[0] & UNIT_NPC_FLAG_SPELLCLICK && !interactSpellId) + { + // this field is not set if there are multiple available spellclick spells + auto clickBounds = sObjectMgr->GetSpellClickInfoMapBounds(unit->GetEntry()); + for (auto const& [creatureId, spellClickInfo] : clickBounds) + { + if (!spellClickInfo.IsFitToRequirements(receiver, unit)) + continue; + + if (!sConditionMgr->IsObjectMeetingSpellClickConditions(unit->GetEntry(), spellClickInfo.spellId, receiver, unit)) + continue; + + interactSpellId = spellClickInfo.spellId; + break; + } + + } + return interactSpellId; + } +}; + +template<> class ViewerDependentValue<UF::UnitData::NpcFlagsTag> { public: |
