aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Conditions
diff options
context:
space:
mode:
authorWyrserth <wyrserth@protonmail.com>2019-07-05 14:11:15 +0200
committerShauren <shauren.trinity@gmail.com>2021-12-14 20:52:13 +0100
commitedf12fd6a1b989d7785bc0619002eda1ccc87368 (patch)
treeb225ce3361419b08c0f766105dda8e92db3cd7c6 /src/server/game/Conditions
parent104ec7a81a5bb782f81fd05b872bf664e4de1c89 (diff)
Core/Conditions: allow spellclick conditions to properly work for aura apply/remove (#23527)
(cherry picked from commit 12e545f7e2247f91db3fd1e8e2f961982422a147)
Diffstat (limited to 'src/server/game/Conditions')
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp10
-rw-r--r--src/server/game/Conditions/ConditionMgr.h6
2 files changed, 16 insertions, 0 deletions
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index c0d1ac0f4a4..d9a67f3bcf7 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -1071,6 +1071,11 @@ bool ConditionMgr::IsObjectMeetingVendorItemConditions(uint32 creatureId, uint32
return true;
}
+bool ConditionMgr::IsSpellUsedInSpellClickConditions(uint32 spellId) const
+{
+ return SpellsUsedInSpellClickConditions.find(spellId) != SpellsUsedInSpellClickConditions.end();
+}
+
ConditionContainer const* ConditionMgr::GetConditionsForAreaTrigger(uint32 areaTriggerId, bool isServerSide) const
{
return Trinity::Containers::MapGetValuePtr(AreaTriggerConditionContainerStore, { areaTriggerId, isServerSide });
@@ -1294,6 +1299,8 @@ void ConditionMgr::LoadConditions(bool isReload)
case CONDITION_SOURCE_TYPE_SPELL_CLICK_EVENT:
{
SpellClickEventConditionStore[cond->SourceGroup][cond->SourceEntry].push_back(cond);
+ if (cond->ConditionType == CONDITION_AURA)
+ SpellsUsedInSpellClickConditions.insert(cond->ConditionValue1);
valid = true;
++count;
continue; // do not add to m_AllocatedMemory to avoid double deleting
@@ -1360,6 +1367,8 @@ void ConditionMgr::LoadConditions(bool isReload)
//handle not grouped conditions
//add new Condition to storage based on Type/Entry
+ if (cond->SourceType == CONDITION_SOURCE_TYPE_SPELL_CLICK_EVENT && cond->ConditionType == CONDITION_AURA)
+ SpellsUsedInSpellClickConditions.insert(cond->ConditionValue1);
ConditionStore[cond->SourceType][cond->SourceEntry].push_back(cond);
++count;
}
@@ -2554,6 +2563,7 @@ void ConditionMgr::Clean()
delete *i;
SpellClickEventConditionStore.clear();
+ SpellsUsedInSpellClickConditions.clear();
for (ConditionEntriesByCreatureIdMap::iterator itr = NpcVendorConditionContainerStore.begin(); itr != NpcVendorConditionContainerStore.end(); ++itr)
for (ConditionsByEntryMap::iterator it = itr->second.begin(); it != itr->second.end(); ++it)
diff --git a/src/server/game/Conditions/ConditionMgr.h b/src/server/game/Conditions/ConditionMgr.h
index df4c683439f..82ecbc98c52 100644
--- a/src/server/game/Conditions/ConditionMgr.h
+++ b/src/server/game/Conditions/ConditionMgr.h
@@ -23,6 +23,7 @@
#include <array>
#include <string>
#include <unordered_map>
+#include <unordered_set>
#include <vector>
class Creature;
@@ -292,6 +293,9 @@ class TC_GAME_API ConditionMgr
bool IsObjectMeetingVehicleSpellConditions(uint32 creatureId, uint32 spellId, Player* player, Unit* vehicle) const;
bool IsObjectMeetingSmartEventConditions(int64 entryOrGuid, uint32 eventId, uint32 sourceType, Unit* unit, WorldObject* baseObject) const;
bool IsObjectMeetingVendorItemConditions(uint32 creatureId, uint32 itemId, Player* player, Creature* vendor) const;
+
+ bool IsSpellUsedInSpellClickConditions(uint32 spellId) const;
+
ConditionContainer const* GetConditionsForAreaTrigger(uint32 areaTriggerId, bool isServerSide) const;
bool IsObjectMeetingTrainerSpellConditions(uint32 trainerId, uint32 spellId, Player* player) const;
@@ -329,6 +333,8 @@ class TC_GAME_API ConditionMgr
ConditionEntriesByCreatureIdMap SpellClickEventConditionStore;
ConditionEntriesByCreatureIdMap NpcVendorConditionContainerStore;
SmartEventConditionContainer SmartEventConditionStore;
+
+ std::unordered_set<uint32> SpellsUsedInSpellClickConditions;
ConditionEntriesByAreaTriggerIdMap AreaTriggerConditionContainerStore;
ConditionEntriesByCreatureIdMap TrainerSpellConditionContainerStore;
};