aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp10
-rw-r--r--src/server/game/Achievements/AchievementMgr.h4
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp91
-rw-r--r--src/server/game/Achievements/CriteriaHandler.h9
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp6
-rw-r--r--src/server/game/Entities/Player/Player.cpp6
-rw-r--r--src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp2
-rw-r--r--src/server/game/Quests/QuestObjectiveCriteriaMgr.h2
-rw-r--r--src/server/game/Scenarios/Scenario.cpp2
-rw-r--r--src/server/game/Scenarios/Scenario.h2
10 files changed, 107 insertions, 27 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 0f33174f40c..ce2494c350a 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -486,7 +486,7 @@ void PlayerAchievementMgr::CompletedAchievement(AchievementEntry const* achievem
if (!(achievement->Flags & ACHIEVEMENT_FLAG_TRACKING_FLAG))
_achievementPoints += achievement->Points;
- UpdateCriteria(CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, 0, 0, 0, NULL, referencePlayer);
+ UpdateCriteria(CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, achievement->ID, 0, 0, NULL, referencePlayer);
UpdateCriteria(CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->Points, 0, 0, NULL, referencePlayer);
// reward items and titles if any
@@ -632,9 +632,9 @@ void PlayerAchievementMgr::SendPacket(WorldPacket const* data) const
_owner->SendDirectMessage(data);
}
-CriteriaList const& PlayerAchievementMgr::GetCriteriaByType(CriteriaTypes type) const
+CriteriaList const& PlayerAchievementMgr::GetCriteriaByType(CriteriaTypes type, uint32 asset) const
{
- return sCriteriaMgr->GetPlayerCriteriaByType(type);
+ return sCriteriaMgr->GetPlayerCriteriaByType(type, asset);
}
GuildAchievementMgr::GuildAchievementMgr(Guild* owner) : _owner(owner)
@@ -913,7 +913,7 @@ void GuildAchievementMgr::CompletedAchievement(AchievementEntry const* achieveme
if (!(achievement->Flags & ACHIEVEMENT_FLAG_TRACKING_FLAG))
_achievementPoints += achievement->Points;
- UpdateCriteria(CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, 0, 0, 0, NULL, referencePlayer);
+ UpdateCriteria(CRITERIA_TYPE_COMPLETE_ACHIEVEMENT, achievement->ID, 0, 0, NULL, referencePlayer);
UpdateCriteria(CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS, achievement->Points, 0, 0, NULL, referencePlayer);
}
@@ -967,7 +967,7 @@ void GuildAchievementMgr::SendPacket(WorldPacket const* data) const
_owner->BroadcastPacket(data);
}
-CriteriaList const& GuildAchievementMgr::GetCriteriaByType(CriteriaTypes type) const
+CriteriaList const& GuildAchievementMgr::GetCriteriaByType(CriteriaTypes type, uint32 /*asset*/) const
{
return sCriteriaMgr->GetGuildCriteriaByType(type);
}
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index 966b990ce3e..8e7a172721d 100644
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -102,7 +102,7 @@ protected:
void SendPacket(WorldPacket const* data) const override;
std::string GetOwnerInfo() const override;
- CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override;
+ CriteriaList const& GetCriteriaByType(CriteriaTypes type, uint32 asset) const override;
private:
Player* _owner;
@@ -135,7 +135,7 @@ protected:
void SendPacket(WorldPacket const* data) const override;
std::string GetOwnerInfo() const override;
- CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override;
+ CriteriaList const& GetCriteriaByType(CriteriaTypes type, uint32 asset) const override;
private:
Guild* _owner;
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index 92b5c88d291..e2df88e5ada 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -457,7 +457,7 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0
TC_LOG_DEBUG("criteria", "CriteriaHandler::UpdateCriteria(%s, %u, " UI64FMTD ", " UI64FMTD ", " UI64FMTD ") %s",
CriteriaMgr::GetCriteriaTypeString(type), type, miscValue1, miscValue2, miscValue3, GetOwnerInfo().c_str());
- CriteriaList const& criteriaList = GetCriteriaByType(type);
+ CriteriaList const& criteriaList = GetCriteriaByType(type, uint32(miscValue1));
for (Criteria const* criteria : criteriaList)
{
CriteriaTreeList const* trees = sCriteriaMgr->GetCriteriaTreesByCriteria(criteria->ID);
@@ -472,6 +472,7 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0
switch (type)
{
// std. case: increment at 1
+ case CRITERIA_TYPE_WIN_BG:
case CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS:
case CRITERIA_TYPE_LOSE_DUEL:
case CRITERIA_TYPE_CREATE_AUCTION:
@@ -485,6 +486,7 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0
case CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
case CRITERIA_TYPE_DEATH:
case CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
+ case CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
case CRITERIA_TYPE_DEATH_AT_MAP:
case CRITERIA_TYPE_DEATH_IN_DUNGEON:
case CRITERIA_TYPE_KILLED_BY_CREATURE:
@@ -531,8 +533,6 @@ void CriteriaHandler::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0
case CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED:
case CRITERIA_TYPE_TOTAL_HEALING_RECEIVED:
case CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS:
- case CRITERIA_TYPE_WIN_BG:
- case CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
case CRITERIA_TYPE_DAMAGE_DONE:
case CRITERIA_TYPE_HEALING_DONE:
case CRITERIA_TYPE_HEART_OF_AZEROTH_ARTIFACT_POWER_EARNED:
@@ -1492,8 +1492,8 @@ bool CriteriaHandler::RequirementsSatisfied(Criteria const* criteria, uint64 mis
return false;
break;
case CRITERIA_TYPE_EQUIP_EPIC_ITEM:
- // miscValue1 = itemid miscValue2 = itemSlot
- if (!miscValue1 || miscValue2 != uint32(criteria->Entry->Asset.ItemSlot))
+ // miscValue1 = itemSlot miscValue2 = itemid
+ if (!miscValue2 || miscValue1 != uint32(criteria->Entry->Asset.ItemSlot))
return false;
break;
case CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
@@ -3111,6 +3111,63 @@ CriteriaMgr* CriteriaMgr::Instance()
return &instance;
}
+namespace
+{
+inline bool IsCriteriaTypeStoredByAsset(CriteriaTypes type)
+{
+ switch (type)
+ {
+ case CRITERIA_TYPE_KILL_CREATURE:
+ case CRITERIA_TYPE_WIN_BG:
+ case CRITERIA_TYPE_REACH_SKILL_LEVEL:
+ case CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
+ case CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
+ case CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
+ case CRITERIA_TYPE_KILLED_BY_CREATURE:
+ case CRITERIA_TYPE_COMPLETE_QUEST:
+ case CRITERIA_TYPE_BE_SPELL_TARGET:
+ case CRITERIA_TYPE_CAST_SPELL:
+ case CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
+ case CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
+ case CRITERIA_TYPE_LEARN_SPELL:
+ case CRITERIA_TYPE_OWN_ITEM:
+ case CRITERIA_TYPE_LEARN_SKILL_LEVEL:
+ case CRITERIA_TYPE_USE_ITEM:
+ case CRITERIA_TYPE_LOOT_ITEM:
+ case CRITERIA_TYPE_EXPLORE_AREA:
+ case CRITERIA_TYPE_GAIN_REPUTATION:
+ case CRITERIA_TYPE_EQUIP_EPIC_ITEM:
+ case CRITERIA_TYPE_HK_CLASS:
+ case CRITERIA_TYPE_HK_RACE:
+ case CRITERIA_TYPE_DO_EMOTE:
+ case CRITERIA_TYPE_EQUIP_ITEM:
+ case CRITERIA_TYPE_USE_GAMEOBJECT:
+ case CRITERIA_TYPE_BE_SPELL_TARGET2:
+ case CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
+ case CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
+ case CRITERIA_TYPE_LOOT_TYPE:
+ case CRITERIA_TYPE_CAST_SPELL2:
+ case CRITERIA_TYPE_LEARN_SKILL_LINE:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+}
+
+CriteriaList const& CriteriaMgr::GetPlayerCriteriaByType(CriteriaTypes type, uint32 asset) const
+{
+ if (asset && IsCriteriaTypeStoredByAsset(type))
+ {
+ auto itr = _criteriasByAsset[type].find(asset);
+ if (itr != _criteriasByAsset[type].end())
+ return itr->second;
+ }
+
+ return _criteriasByType[type];
+}
+
//==========================================================
CriteriaMgr::~CriteriaMgr()
{
@@ -3309,6 +3366,30 @@ void CriteriaMgr::LoadCriteriaList()
{
++criterias;
_criteriasByType[criteriaEntry->Type].push_back(criteria);
+ if (IsCriteriaTypeStoredByAsset(CriteriaTypes(criteriaEntry->Type)))
+ {
+ if (criteriaEntry->Type != CRITERIA_TYPE_EXPLORE_AREA)
+ _criteriasByAsset[criteriaEntry->Type][criteriaEntry->Asset.ID].push_back(criteria);
+ else
+ {
+ WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(criteriaEntry->Asset.WorldMapOverlayID);
+ if (!worldOverlayEntry)
+ break;
+
+ for (uint8 j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j)
+ {
+ if (worldOverlayEntry->AreaID[j])
+ {
+ bool valid = true;
+ for (uint8 i = 0; i < j; ++i)
+ if (worldOverlayEntry->AreaID[j] == worldOverlayEntry->AreaID[i])
+ valid = false;
+ if (valid)
+ _criteriasByAsset[criteriaEntry->Type][worldOverlayEntry->AreaID[j]].push_back(criteria);
+ }
+ }
+ }
+ }
}
if (criteria->FlagsCu & CRITERIA_FLAG_CU_GUILD)
diff --git a/src/server/game/Achievements/CriteriaHandler.h b/src/server/game/Achievements/CriteriaHandler.h
index 56b8b977a03..b2b9570f61c 100644
--- a/src/server/game/Achievements/CriteriaHandler.h
+++ b/src/server/game/Achievements/CriteriaHandler.h
@@ -61,6 +61,7 @@ struct Criteria
};
typedef std::vector<Criteria const*> CriteriaList;
+typedef std::unordered_map<uint32, CriteriaList> CriteriaListByAsset;
struct CriteriaTree
{
@@ -303,7 +304,7 @@ protected:
bool ModifierSatisfied(ModifierTreeEntry const* modifier, uint64 miscValue1, uint64 miscValue2, Unit const* unit, Player* referencePlayer) const;
virtual std::string GetOwnerInfo() const = 0;
- virtual CriteriaList const& GetCriteriaByType(CriteriaTypes type) const = 0;
+ virtual CriteriaList const& GetCriteriaByType(CriteriaTypes type, uint32 asset) const = 0;
CriteriaProgressMap _criteriaProgress;
std::map<uint32, uint32 /*ms time left*/> _timeCriteriaTrees;
@@ -320,10 +321,7 @@ public:
static CriteriaMgr* Instance();
- CriteriaList const& GetPlayerCriteriaByType(CriteriaTypes type) const
- {
- return _criteriasByType[type];
- }
+ CriteriaList const& GetPlayerCriteriaByType(CriteriaTypes type, uint32 asset) const;
CriteriaList const& GetGuildCriteriaByType(CriteriaTypes type) const
{
@@ -408,6 +406,7 @@ private:
// store criterias by type to speed up lookup
CriteriaList _criteriasByType[CRITERIA_TYPE_TOTAL];
+ CriteriaListByAsset _criteriasByAsset[CRITERIA_TYPE_TOTAL];
CriteriaList _guildCriteriasByType[CRITERIA_TYPE_TOTAL];
CriteriaList _scenarioCriteriasByType[CRITERIA_TYPE_TOTAL];
CriteriaList _questObjectiveCriteriasByType[CRITERIA_TYPE_TOTAL];
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 1b26f339c5e..dd330ba325b 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -824,14 +824,14 @@ void Battleground::EndBattleground(uint32 winner)
// TODO: loss honor xp
}
- player->UpdateCriteria(CRITERIA_TYPE_WIN_BG, 1);
+ player->UpdateCriteria(CRITERIA_TYPE_WIN_BG, player->GetMapId());
if (!guildAwarded)
{
guildAwarded = true;
if (ObjectGuid::LowType guildId = GetBgMap()->GetOwnerGuildId(player->GetBGTeam()))
{
if (Guild* guild = sGuildMgr->GetGuildById(guildId))
- guild->UpdateCriteria(CRITERIA_TYPE_WIN_BG, 1, 0, 0, NULL, player);
+ guild->UpdateCriteria(CRITERIA_TYPE_WIN_BG, player->GetMapId(), 0, 0, NULL, player);
}
}
}
@@ -852,7 +852,7 @@ void Battleground::EndBattleground(uint32 winner)
sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), player->GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType());
player->SendDirectMessage(battlefieldStatus.Write());
- player->UpdateCriteria(CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1);
+ player->UpdateCriteria(CRITERIA_TYPE_COMPLETE_BATTLEGROUND, player->GetMapId());
}
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 3dd310f4b52..99835ca5060 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6230,7 +6230,7 @@ void Player::CheckAreaExploreAndOutdoor()
{
SetUpdateFieldFlagValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::ExploredZones, offset), val);
- UpdateCriteria(CRITERIA_TYPE_EXPLORE_AREA);
+ UpdateCriteria(CRITERIA_TYPE_EXPLORE_AREA, GetAreaId());
if (areaEntry->ExplorationLevel > 0)
{
@@ -12475,7 +12475,7 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update)
// only for full equip instead adding to stack
UpdateCriteria(CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry());
- UpdateCriteria(CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot);
+ UpdateCriteria(CRITERIA_TYPE_EQUIP_EPIC_ITEM, slot, pItem->GetEntry());
return pItem;
}
@@ -12601,7 +12601,7 @@ void Player::QuickEquipItem(uint16 pos, Item* pItem)
CheckTitanGripPenalty();
UpdateCriteria(CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry());
- UpdateCriteria(CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot);
+ UpdateCriteria(CRITERIA_TYPE_EQUIP_EPIC_ITEM, slot, pItem->GetEntry());
}
}
diff --git a/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp b/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp
index 8486db1c166..7a9cb99ba4c 100644
--- a/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp
+++ b/src/server/game/Quests/QuestObjectiveCriteriaMgr.cpp
@@ -313,7 +313,7 @@ std::string QuestObjectiveCriteriaMgr::GetOwnerInfo() const
return Trinity::StringFormat("%s %s", _owner->GetGUID().ToString().c_str(), _owner->GetName().c_str());
}
-CriteriaList const& QuestObjectiveCriteriaMgr::GetCriteriaByType(CriteriaTypes type) const
+CriteriaList const& QuestObjectiveCriteriaMgr::GetCriteriaByType(CriteriaTypes type, uint32 /*asset*/) const
{
return sCriteriaMgr->GetQuestObjectiveCriteriaByType(type);
}
diff --git a/src/server/game/Quests/QuestObjectiveCriteriaMgr.h b/src/server/game/Quests/QuestObjectiveCriteriaMgr.h
index 44748b27ba2..280ae5336db 100644
--- a/src/server/game/Quests/QuestObjectiveCriteriaMgr.h
+++ b/src/server/game/Quests/QuestObjectiveCriteriaMgr.h
@@ -54,7 +54,7 @@ protected:
void SendPacket(WorldPacket const* data) const override;
std::string GetOwnerInfo() const override;
- CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override;
+ CriteriaList const& GetCriteriaByType(CriteriaTypes type, uint32 asset) const override;
private:
Player* _owner;
diff --git a/src/server/game/Scenarios/Scenario.cpp b/src/server/game/Scenarios/Scenario.cpp
index 5d9febd7ab5..48890b40cbe 100644
--- a/src/server/game/Scenarios/Scenario.cpp
+++ b/src/server/game/Scenarios/Scenario.cpp
@@ -305,7 +305,7 @@ std::vector<WorldPackets::Achievement::CriteriaProgress> Scenario::GetCriteriasP
return criteriasProgress;
}
-CriteriaList const& Scenario::GetCriteriaByType(CriteriaTypes type) const
+CriteriaList const& Scenario::GetCriteriaByType(CriteriaTypes type, uint32 /*asset*/) const
{
return sCriteriaMgr->GetScenarioCriteriaByType(type);
}
diff --git a/src/server/game/Scenarios/Scenario.h b/src/server/game/Scenarios/Scenario.h
index 121073441b4..ee8d34a92e0 100644
--- a/src/server/game/Scenarios/Scenario.h
+++ b/src/server/game/Scenarios/Scenario.h
@@ -93,7 +93,7 @@ class TC_GAME_API Scenario : public CriteriaHandler
std::vector<WorldPackets::Scenario::BonusObjectiveData> GetBonusObjectivesData();
std::vector<WorldPackets::Achievement::CriteriaProgress> GetCriteriasProgress();
- CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override;
+ CriteriaList const& GetCriteriaByType(CriteriaTypes type, uint32 asset) const override;
ScenarioData const* _data;
private: