aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-02-10 14:20:09 +0100
committerShauren <shauren.trinity@gmail.com>2024-02-10 14:20:09 +0100
commit6543d23a1a70768e9dce89b33ae7bf5fe6cdcc1e (patch)
tree69e3e2a96157444cda50a7af76ac97d736e20637 /src/server/game/Entities/Object
parent761dac8f4a0d9d05a22f2af0b9f8e140b680b8bc (diff)
Core/Creatures: Set InteractSpellID for npc spellclick
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.h30
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: