summaryrefslogtreecommitdiff
path: root/src/server/game/Achievements/AchievementMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Achievements/AchievementMgr.cpp')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp516
1 files changed, 258 insertions, 258 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index b3c6f1d530..8430ed0273 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -379,14 +379,14 @@ bool AchievementCriteriaData::Meets(uint32 criteria_id, Player const* source, Un
case ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT:
return source->GetMap()->GetPlayersCountExceptGMs() <= map_players.maxcount;
case ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM:
- {
+ {
if (!target || target->GetTypeId() != TYPEID_PLAYER)
return false;
- // DB data compatibility...
- uint32 teamOld = target->ToPlayer()->GetTeamId() == TEAM_ALLIANCE ? ALLIANCE : HORDE;
+ // DB data compatibility...
+ uint32 teamOld = target->ToPlayer()->GetTeamId() == TEAM_ALLIANCE ? ALLIANCE : HORDE;
return teamOld == team.team;
- }
+ }
case ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK:
return Player::GetDrunkenstateByValue(source->GetDrunkValue()) >= DrunkenState(drunk.state);
case ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY:
@@ -500,8 +500,8 @@ void AchievementMgr::Reset()
void AchievementMgr::ResetAchievementCriteria(AchievementCriteriaCondition condition, uint32 value, bool evenIfCriteriaComplete)
{
AchievementCriteriaEntryList const* achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByCondition(condition, value);
- if (!achievementCriteriaList)
- return;
+ if (!achievementCriteriaList)
+ return;
for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList->begin(); i != achievementCriteriaList->end(); ++i)
{
@@ -569,7 +569,7 @@ void AchievementMgr::SaveToDB(SQLTransaction& trans)
stmt->setUInt16(1, iter->first);
trans->Append(stmt);
- // pussywizard: insert only for (counter != 0) is very important! this is how criteria of completed achievements gets deleted from db (by setting counter to 0); if conflicted during merge - contact me
+ // pussywizard: insert only for (counter != 0) is very important! this is how criteria of completed achievements gets deleted from db (by setting counter to 0); if conflicted during merge - contact me
if (iter->second.counter)
{
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_ACHIEVEMENT_PROGRESS);
@@ -753,62 +753,62 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
if (m_player->IsGameMaster())
return;
- AchievementCriteriaEntryList const* achievementCriteriaList = NULL;
-
- switch (type)
- {
- case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
- case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
- case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
- case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
- case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
- case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
- case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
- case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
- case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
- case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
- case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
- case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
- case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
- case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
- case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
- case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
- case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
- case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
- case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
- case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
- case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
- case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
- if (miscValue1)
- {
- achievementCriteriaList = sAchievementMgr->GetSpecialAchievementCriteriaByType(type, miscValue1);
- break;
- }
- achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
- if (miscValue2)
- {
- achievementCriteriaList = sAchievementMgr->GetSpecialAchievementCriteriaByType(type, miscValue2);
- break;
- }
- achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type);
- break;
- default:
- achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type);
- break;
- }
-
- if (!achievementCriteriaList)
- return;
+ AchievementCriteriaEntryList const* achievementCriteriaList = NULL;
+
+ switch (type)
+ {
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
+ case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
+ case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
+ case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
+ case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
+ case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
+ if (miscValue1)
+ {
+ achievementCriteriaList = sAchievementMgr->GetSpecialAchievementCriteriaByType(type, miscValue1);
+ break;
+ }
+ achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
+ if (miscValue2)
+ {
+ achievementCriteriaList = sAchievementMgr->GetSpecialAchievementCriteriaByType(type, miscValue2);
+ break;
+ }
+ achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type);
+ break;
+ default:
+ achievementCriteriaList = sAchievementMgr->GetAchievementCriteriaByType(type);
+ break;
+ }
+
+ if (!achievementCriteriaList)
+ return;
for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList->begin(); i != achievementCriteriaList->end(); ++i)
{
@@ -848,7 +848,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
case ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS:/* FIXME: for online player only currently */
case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED:
case ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED:
- case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS:
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS:
// AchievementMgr::UpdateAchievementCriteria might also be called on login - skip in this case
if (!miscValue1)
continue;
@@ -1256,9 +1256,9 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
continue;
// Children's Week achievements have extra requirements
- //if (achievement->categoryId == CATEGORY_CHILDRENS_WEEK || achievement->ID == 1291) // Lonely?
+ //if (achievement->categoryId == CATEGORY_CHILDRENS_WEEK || achievement->ID == 1291) // Lonely?
{
- // Xinef: skip progress only if data exists and is not meet
+ // Xinef: skip progress only if data exists and is not meet
AchievementCriteriaDataSet const* data = sAchievementMgr->GetCriteriaDataSet(achievementCriteria);
if (data && !data->Meets(GetPlayer(), NULL))
continue;
@@ -1448,11 +1448,11 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter)
{
if (skillIter->second->skillId == achievementCriteria->learn_skillline_spell.skillLine)
- {
- // xinef: do not add couter twice if by any chance skill is listed twice in dbc (eg. skill 777 and spell 22717)
+ {
+ // xinef: do not add couter twice if by any chance skill is listed twice in dbc (eg. skill 777 and spell 22717)
++spellCount;
- break;
- }
+ break;
+ }
}
}
@@ -1508,14 +1508,14 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
{
SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellIter->first);
for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter)
- {
+ {
if (skillIter->second->skillId == achievementCriteria->learn_skill_line.skillLine)
- {
- // xinef: do not add couter twice if by any chance skill is listed twice in dbc (eg. skill 777 and spell 22717)
+ {
+ // xinef: do not add couter twice if by any chance skill is listed twice in dbc (eg. skill 777 and spell 22717)
++spellCount;
- break;
- }
- }
+ break;
+ }
+ }
}
SetCriteriaProgress(achievementCriteria, spellCount);
@@ -1719,24 +1719,24 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve
return false;
}
- // pussywizard: progress will be deleted after getting the achievement (optimization)
- // finished achievement should indicate criteria completed, since not finding progress would start some timed achievements and probably other things
- if (HasAchieved(achievement->ID))
- {
- bool completed = true;
+ // pussywizard: progress will be deleted after getting the achievement (optimization)
+ // finished achievement should indicate criteria completed, since not finding progress would start some timed achievements and probably other things
+ if (HasAchieved(achievement->ID))
+ {
+ bool completed = true;
- // completed only after all referenced achievements are also completed
- if (AchievementEntryList const* achRefList = sAchievementMgr->GetAchievementByReferencedId(achievement->ID))
+ // completed only after all referenced achievements are also completed
+ if (AchievementEntryList const* achRefList = sAchievementMgr->GetAchievementByReferencedId(achievement->ID))
for (AchievementEntryList::const_iterator itr = achRefList->begin(); itr != achRefList->end(); ++itr)
if (!IsCompletedAchievement(*itr))
- {
- completed = false;
- break;
- }
+ {
+ completed = false;
+ break;
+ }
- if (completed)
- return true;
- }
+ if (completed)
+ return true;
+ }
CriteriaProgress const* progress = GetCriteriaProgress(achievementCriteria);
if (!progress)
@@ -2000,7 +2000,7 @@ void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry,
switch (ptype)
{
case PROGRESS_SET:
- case PROGRESS_RESET:
+ case PROGRESS_RESET:
newValue = changeValue;
break;
case PROGRESS_ACCUMULATE:
@@ -2138,28 +2138,28 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
ca.date = time(NULL);
ca.changed = true;
- // pussywizard: set all progress counters to 0, so progress will be deleted from db during save
- {
- bool allRefsCompleted = true;
- uint32 achiCheckId = achievement->refAchievement ? achievement->refAchievement : achievement->ID;
-
- if (AchievementEntryList const* achRefList = sAchievementMgr->GetAchievementByReferencedId(achiCheckId))
- for (AchievementEntryList::const_iterator itr = achRefList->begin(); itr != achRefList->end(); ++itr)
- if (!IsCompletedAchievement(*itr))
- {
- allRefsCompleted = false;
- break;
- }
-
- if (allRefsCompleted)
- if (AchievementCriteriaEntryList const* cList = sAchievementMgr->GetAchievementCriteriaByAchievement(achiCheckId))
- for (AchievementCriteriaEntryList::const_iterator itr = cList->begin(); itr != cList->end(); ++itr)
- if (CriteriaProgress* progress = GetCriteriaProgress(*itr))
- {
- progress->changed = true;
- progress->counter = 0;
- }
- }
+ // pussywizard: set all progress counters to 0, so progress will be deleted from db during save
+ {
+ bool allRefsCompleted = true;
+ uint32 achiCheckId = achievement->refAchievement ? achievement->refAchievement : achievement->ID;
+
+ if (AchievementEntryList const* achRefList = sAchievementMgr->GetAchievementByReferencedId(achiCheckId))
+ for (AchievementEntryList::const_iterator itr = achRefList->begin(); itr != achRefList->end(); ++itr)
+ if (!IsCompletedAchievement(*itr))
+ {
+ allRefsCompleted = false;
+ break;
+ }
+
+ if (allRefsCompleted)
+ if (AchievementCriteriaEntryList const* cList = sAchievementMgr->GetAchievementCriteriaByAchievement(achiCheckId))
+ for (AchievementCriteriaEntryList::const_iterator itr = cList->begin(); itr != cList->end(); ++itr)
+ if (CriteriaProgress* progress = GetCriteriaProgress(*itr))
+ {
+ progress->changed = true;
+ progress->counter = 0;
+ }
+ }
// don't insert for ACHIEVEMENT_FLAG_REALM_FIRST_KILL since otherwise only the first group member would reach that achievement
// TODO: where do set this instead?
@@ -2188,10 +2188,10 @@ void AchievementMgr::CompletedAchievement(AchievementEntry const* achievement)
// mail
if (reward->sender)
{
- MailDraft draft(reward->mailTemplate);
+ MailDraft draft(reward->mailTemplate);
if (!reward->mailTemplate)
- draft = MailDraft(reward->subject, reward->text);
+ draft = MailDraft(reward->subject, reward->text);
SQLTransaction trans = CharacterDatabase.BeginTransaction();
@@ -2230,33 +2230,33 @@ void AchievementMgr::SendRespondInspectAchievements(Player* player) const
*/
void AchievementMgr::BuildAllDataPacket(WorldPacket* data, bool inspect) const
{
- if (!m_completedAchievements.empty())
- {
- AchievementEntry const* achievement = NULL;
- for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter)
- {
- // Skip hidden achievements
- achievement = sAchievementStore.LookupEntry(iter->first);
- if (!achievement || achievement->flags & ACHIEVEMENT_FLAG_HIDDEN)
- continue;
-
- *data << uint32(iter->first);
- data->AppendPackedTime(iter->second.date);
- }
- }
- *data << int32(-1);
-
- if (!inspect && !m_criteriaProgress.empty())
- for (CriteriaProgressMap::const_iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter)
- {
- *data << uint32(iter->first);
- data->appendPackGUID(iter->second.counter);
- data->append(GetPlayer()->GetPackGUID());
- *data << uint32(0);
- data->AppendPackedTime(iter->second.date);
- *data << uint32(0);
- *data << uint32(0);
- }
+ if (!m_completedAchievements.empty())
+ {
+ AchievementEntry const* achievement = NULL;
+ for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter)
+ {
+ // Skip hidden achievements
+ achievement = sAchievementStore.LookupEntry(iter->first);
+ if (!achievement || achievement->flags & ACHIEVEMENT_FLAG_HIDDEN)
+ continue;
+
+ *data << uint32(iter->first);
+ data->AppendPackedTime(iter->second.date);
+ }
+ }
+ *data << int32(-1);
+
+ if (!inspect && !m_criteriaProgress.empty())
+ for (CriteriaProgressMap::const_iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter)
+ {
+ *data << uint32(iter->first);
+ data->appendPackGUID(iter->second.counter);
+ data->append(GetPlayer()->GetPackGUID());
+ *data << uint32(0);
+ data->AppendPackedTime(iter->second.date);
+ *data << uint32(0);
+ *data << uint32(0);
+ }
*data << int32(-1);
}
@@ -2329,122 +2329,122 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList()
m_AchievementCriteriaListByAchievement[criteria->referredAchievement].push_back(criteria);
if (criteria->additionalRequirements[0].additionalRequirement_type != ACHIEVEMENT_CRITERIA_CONDITION_NONE)
- m_AchievementCriteriasByCondition[criteria->additionalRequirements[0].additionalRequirement_type][criteria->additionalRequirements[0].additionalRequirement_value].push_back(criteria);
- if (criteria->additionalRequirements[1].additionalRequirement_type != ACHIEVEMENT_CRITERIA_CONDITION_NONE &&
- criteria->additionalRequirements[1].additionalRequirement_type != criteria->additionalRequirements[0].additionalRequirement_type)
- m_AchievementCriteriasByCondition[criteria->additionalRequirements[1].additionalRequirement_type][criteria->additionalRequirements[1].additionalRequirement_value].push_back(criteria);
-
- switch (criteria->requiredType)
- {
- case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
- m_SpecialList[criteria->requiredType][criteria->kill_creature.creatureID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
- m_SpecialList[criteria->requiredType][criteria->win_bg.bgMapID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
- m_SpecialList[criteria->requiredType][criteria->reach_skill_level.skillID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
- m_SpecialList[criteria->requiredType][criteria->complete_achievement.linkedAchievement].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
- m_SpecialList[criteria->requiredType][criteria->complete_quests_in_zone.zoneID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
- m_SpecialList[criteria->requiredType][criteria->complete_battleground.mapID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
- m_SpecialList[criteria->requiredType][criteria->killed_by_creature.creatureEntry].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
- m_SpecialList[criteria->requiredType][criteria->complete_quest.questID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
- m_SpecialList[criteria->requiredType][criteria->be_spell_target.spellID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
- m_SpecialList[criteria->requiredType][criteria->cast_spell.spellID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
- m_SpecialList[criteria->requiredType][criteria->bg_objective.objectiveId].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
- m_SpecialList[criteria->requiredType][criteria->honorable_kill_at_area.areaID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
- m_SpecialList[criteria->requiredType][criteria->learn_spell.spellID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
- m_SpecialList[criteria->requiredType][criteria->own_item.itemID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
- m_SpecialList[criteria->requiredType][criteria->learn_skill_level.skillID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
- m_SpecialList[criteria->requiredType][criteria->use_item.itemID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
- m_SpecialList[criteria->requiredType][criteria->own_item.itemID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
- {
- WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(criteria->explore_area.areaReference);
- if (!worldOverlayEntry)
- break;
-
- for (uint8 j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j)
- if (worldOverlayEntry->areatableID[j])
- {
- bool valid = true;
- for (uint8 i=0; i<j; ++i)
- if (worldOverlayEntry->areatableID[j] == worldOverlayEntry->areatableID[i])
- valid = false;
- if (valid)
- m_SpecialList[criteria->requiredType][worldOverlayEntry->areatableID[j]].push_back(criteria);
- }
- }
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
- m_SpecialList[criteria->requiredType][criteria->gain_reputation.factionID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
- m_SpecialList[criteria->requiredType][criteria->equip_epic_item.itemSlot].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
- m_SpecialList[criteria->requiredType][criteria->hk_class.classID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
- m_SpecialList[criteria->requiredType][criteria->hk_race.raceID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
- m_SpecialList[criteria->requiredType][criteria->do_emote.emoteID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
- m_SpecialList[criteria->requiredType][criteria->equip_item.itemID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
- m_SpecialList[criteria->requiredType][criteria->use_gameobject.goEntry].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
- m_SpecialList[criteria->requiredType][criteria->be_spell_target.spellID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
- m_SpecialList[criteria->requiredType][criteria->fish_in_gameobject.goEntry].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
- m_SpecialList[criteria->requiredType][criteria->learn_skillline_spell.skillLine].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
- m_SpecialList[criteria->requiredType][criteria->loot_type.lootType].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
- m_SpecialList[criteria->requiredType][criteria->cast_spell.spellID].push_back(criteria);
- break;
- case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
- m_SpecialList[criteria->requiredType][criteria->learn_skill_line.skillLine].push_back(criteria);
- break;
- }
+ m_AchievementCriteriasByCondition[criteria->additionalRequirements[0].additionalRequirement_type][criteria->additionalRequirements[0].additionalRequirement_value].push_back(criteria);
+ if (criteria->additionalRequirements[1].additionalRequirement_type != ACHIEVEMENT_CRITERIA_CONDITION_NONE &&
+ criteria->additionalRequirements[1].additionalRequirement_type != criteria->additionalRequirements[0].additionalRequirement_type)
+ m_AchievementCriteriasByCondition[criteria->additionalRequirements[1].additionalRequirement_type][criteria->additionalRequirements[1].additionalRequirement_value].push_back(criteria);
+
+ switch (criteria->requiredType)
+ {
+ case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
+ m_SpecialList[criteria->requiredType][criteria->kill_creature.creatureID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
+ m_SpecialList[criteria->requiredType][criteria->win_bg.bgMapID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
+ m_SpecialList[criteria->requiredType][criteria->reach_skill_level.skillID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
+ m_SpecialList[criteria->requiredType][criteria->complete_achievement.linkedAchievement].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
+ m_SpecialList[criteria->requiredType][criteria->complete_quests_in_zone.zoneID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
+ m_SpecialList[criteria->requiredType][criteria->complete_battleground.mapID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
+ m_SpecialList[criteria->requiredType][criteria->killed_by_creature.creatureEntry].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
+ m_SpecialList[criteria->requiredType][criteria->complete_quest.questID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
+ m_SpecialList[criteria->requiredType][criteria->be_spell_target.spellID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
+ m_SpecialList[criteria->requiredType][criteria->cast_spell.spellID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
+ m_SpecialList[criteria->requiredType][criteria->bg_objective.objectiveId].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
+ m_SpecialList[criteria->requiredType][criteria->honorable_kill_at_area.areaID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
+ m_SpecialList[criteria->requiredType][criteria->learn_spell.spellID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
+ m_SpecialList[criteria->requiredType][criteria->own_item.itemID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
+ m_SpecialList[criteria->requiredType][criteria->learn_skill_level.skillID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
+ m_SpecialList[criteria->requiredType][criteria->use_item.itemID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
+ m_SpecialList[criteria->requiredType][criteria->own_item.itemID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
+ {
+ WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(criteria->explore_area.areaReference);
+ if (!worldOverlayEntry)
+ break;
+
+ for (uint8 j = 0; j < MAX_WORLD_MAP_OVERLAY_AREA_IDX; ++j)
+ if (worldOverlayEntry->areatableID[j])
+ {
+ bool valid = true;
+ for (uint8 i=0; i<j; ++i)
+ if (worldOverlayEntry->areatableID[j] == worldOverlayEntry->areatableID[i])
+ valid = false;
+ if (valid)
+ m_SpecialList[criteria->requiredType][worldOverlayEntry->areatableID[j]].push_back(criteria);
+ }
+ }
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
+ m_SpecialList[criteria->requiredType][criteria->gain_reputation.factionID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
+ m_SpecialList[criteria->requiredType][criteria->equip_epic_item.itemSlot].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
+ m_SpecialList[criteria->requiredType][criteria->hk_class.classID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
+ m_SpecialList[criteria->requiredType][criteria->hk_race.raceID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
+ m_SpecialList[criteria->requiredType][criteria->do_emote.emoteID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
+ m_SpecialList[criteria->requiredType][criteria->equip_item.itemID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
+ m_SpecialList[criteria->requiredType][criteria->use_gameobject.goEntry].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
+ m_SpecialList[criteria->requiredType][criteria->be_spell_target.spellID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
+ m_SpecialList[criteria->requiredType][criteria->fish_in_gameobject.goEntry].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
+ m_SpecialList[criteria->requiredType][criteria->learn_skillline_spell.skillLine].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
+ m_SpecialList[criteria->requiredType][criteria->loot_type.lootType].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
+ m_SpecialList[criteria->requiredType][criteria->cast_spell.spellID].push_back(criteria);
+ break;
+ case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
+ m_SpecialList[criteria->requiredType][criteria->learn_skill_line.skillLine].push_back(criteria);
+ break;
+ }
if (criteria->timeLimit)
m_AchievementCriteriasByTimedType[criteria->timedType].push_back(criteria);