diff options
author | SnapperRy <snapperryen@gmail.com> | 2016-08-20 18:22:43 +0200 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2017-02-12 16:27:43 +0100 |
commit | f886788a672014bcdefbcd8661c9a97518a37611 (patch) | |
tree | e50acb0a17afa68cef4a5e85450728430ac9cea2 /src | |
parent | 3a62ecb5160e9d564204f5070270227b10be5e35 (diff) |
Core/SpellArea: only check against spell_area entries for the current quest when updating quest status
Closes #17804
(cherry picked from commit 0b4b0ea3486192dfdf55d057edad913750f57186)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.h | 4 |
4 files changed, 24 insertions, 9 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4e0f3caf8e5..a7d46363aa4 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14841,7 +14841,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver) StartCriteriaTimer(CRITERIA_TIMED_TYPE_QUEST, quest_id); - SendQuestUpdate(); + SendQuestUpdate(quest_id); if (sWorld->getBoolConfig(CONFIG_QUEST_ENABLE_QUEST_TRACKER)) // check if Quest Tracker is enabled { @@ -15189,7 +15189,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, UpdatePvPState(); } - SendQuestUpdate(); + SendQuestUpdate(quest_id); SendQuestGiverStatusMultiple(); @@ -15843,7 +15843,7 @@ void Player::SetQuestStatus(uint32 questId, QuestStatus status, bool update /*= } if (update) - SendQuestUpdate(); + SendQuestUpdate(questId); sScriptMgr->OnQuestStatusChange(this, questId, status); } @@ -15858,7 +15858,7 @@ void Player::RemoveActiveQuest(uint32 questId, bool update /*= true*/) } if (update) - SendQuestUpdate(); + SendQuestUpdate(questId); } void Player::RemoveRewardedQuest(uint32 questId, bool update /*= true*/) @@ -15874,19 +15874,19 @@ void Player::RemoveRewardedQuest(uint32 questId, bool update /*= true*/) SetQuestCompletedBit(questBit, false); if (update) - SendQuestUpdate(); + SendQuestUpdate(questId); } -void Player::SendQuestUpdate() +void Player::SendQuestUpdate(uint32 questId) { uint32 zone = 0, area = 0; GetZoneAndAreaId(zone, area); - SpellAreaForQuestMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(area); + SpellAreaForQuestAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForQuestAreaMapBounds(area, questId); if (saBounds.first != saBounds.second) { - for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr) + for (SpellAreaForQuestAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr) { if (!itr->second->IsFitToRequirements(this, zone, area)) RemoveAurasDueToSpell(itr->second->spellId); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 60361dd319b..c182e92364c 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1568,7 +1568,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void SetQuestStatus(uint32 questId, QuestStatus status, bool update = true); void RemoveActiveQuest(uint32 questId, bool update = true); void RemoveRewardedQuest(uint32 questId, bool update = true); - void SendQuestUpdate(); + void SendQuestUpdate(uint32 questId); QuestGiverStatus GetQuestDialogStatus(Object* questGiver); void SetDailyQuestStatus(uint32 quest_id); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 514185803e1..c3d03a009da 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -1158,6 +1158,11 @@ SpellAreaForAreaMapBounds SpellMgr::GetSpellAreaForAreaMapBounds(uint32 area_id) return mSpellAreaForAreaMap.equal_range(area_id); } +SpellAreaForQuestAreaMapBounds SpellMgr::GetSpellAreaForQuestAreaMapBounds(uint32 area_id, uint32 quest_id) const +{ + return mSpellAreaForQuestAreaMap.equal_range(std::pair<uint32, uint32>(area_id, quest_id)); +} + bool SpellArea::IsFitToRequirements(Player const* player, uint32 newZone, uint32 newArea) const { if (gender != GENDER_NONE) // is not expected gender @@ -2625,6 +2630,12 @@ void SpellMgr::LoadSpellAreas() if (spellArea.auraSpell) mSpellAreaForAuraMap.insert(SpellAreaForAuraMap::value_type(abs(spellArea.auraSpell), sa)); + if (spellArea.areaId && spellArea.questStart) + mSpellAreaForQuestAreaMap.insert(SpellAreaForQuestAreaMap::value_type(std::pair<uint32, uint32>(spellArea.areaId, spellArea.questStart), sa)); + + if (spellArea.areaId && spellArea.questEnd) + mSpellAreaForQuestAreaMap.insert(SpellAreaForQuestAreaMap::value_type(std::pair<uint32, uint32>(spellArea.areaId, spellArea.questEnd), sa)); + ++count; } while (result->NextRow()); diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 251fc64c996..6eb0f0c03c9 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -516,10 +516,12 @@ typedef std::multimap<uint32, SpellArea> SpellAreaMap; typedef std::multimap<uint32, SpellArea const*> SpellAreaForQuestMap; typedef std::multimap<uint32, SpellArea const*> SpellAreaForAuraMap; typedef std::multimap<uint32, SpellArea const*> SpellAreaForAreaMap; +typedef std::multimap<std::pair<uint32, uint32>, SpellArea const*> SpellAreaForQuestAreaMap; typedef std::pair<SpellAreaMap::const_iterator, SpellAreaMap::const_iterator> SpellAreaMapBounds; typedef std::pair<SpellAreaForQuestMap::const_iterator, SpellAreaForQuestMap::const_iterator> SpellAreaForQuestMapBounds; typedef std::pair<SpellAreaForAuraMap::const_iterator, SpellAreaForAuraMap::const_iterator> SpellAreaForAuraMapBounds; typedef std::pair<SpellAreaForAreaMap::const_iterator, SpellAreaForAreaMap::const_iterator> SpellAreaForAreaMapBounds; +typedef std::pair<SpellAreaForQuestAreaMap::const_iterator, SpellAreaForQuestAreaMap::const_iterator> SpellAreaForQuestAreaMapBounds; // Spell rank chain (accessed using SpellMgr functions) struct SpellChainNode @@ -716,6 +718,7 @@ class TC_GAME_API SpellMgr SpellAreaForQuestMapBounds GetSpellAreaForQuestEndMapBounds(uint32 quest_id) const; SpellAreaForAuraMapBounds GetSpellAreaForAuraMapBounds(uint32 spell_id) const; SpellAreaForAreaMapBounds GetSpellAreaForAreaMapBounds(uint32 area_id) const; + SpellAreaForQuestAreaMapBounds GetSpellAreaForQuestAreaMapBounds(uint32 area_id, uint32 quest_id) const; // SpellInfo object management SpellInfo const* GetSpellInfo(uint32 spellId) const { return spellId < GetSpellInfoStoreSize() ? mSpellInfoMap[spellId] : NULL; } @@ -786,6 +789,7 @@ class TC_GAME_API SpellMgr SpellAreaForQuestMap mSpellAreaForQuestEndMap; SpellAreaForAuraMap mSpellAreaForAuraMap; SpellAreaForAreaMap mSpellAreaForAreaMap; + SpellAreaForQuestAreaMap mSpellAreaForQuestAreaMap; SkillLineAbilityMap mSkillLineAbilityMap; PetLevelupSpellMap mPetLevelupSpellMap; PetDefaultSpellsMap mPetDefaultSpellsMap; // only spells not listed in related mPetLevelupSpellMap entry |