From edf12fd6a1b989d7785bc0619002eda1ccc87368 Mon Sep 17 00:00:00 2001 From: Wyrserth Date: Fri, 5 Jul 2019 14:11:15 +0200 Subject: Core/Conditions: allow spellclick conditions to properly work for aura apply/remove (#23527) (cherry picked from commit 12e545f7e2247f91db3fd1e8e2f961982422a147) --- src/server/game/Conditions/ConditionMgr.cpp | 10 ++++++++++ src/server/game/Conditions/ConditionMgr.h | 6 ++++++ 2 files changed, 16 insertions(+) (limited to 'src/server/game/Conditions') 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 #include #include +#include #include 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 SpellsUsedInSpellClickConditions; ConditionEntriesByAreaTriggerIdMap AreaTriggerConditionContainerStore; ConditionEntriesByCreatureIdMap TrainerSpellConditionContainerStore; }; -- cgit v1.2.3