Core/Achievements: ported criteria asset union refactor
This commit is contained in:
1 parent
2bef0ce3f6
commit
03328fe84e
2 files changed
+157
-646
No files matched your search
@@ -488,7 +488,7 @@ void AchievementMgr<T>::ResetAchievementCriteria(AchievementCriteriaTypes type,
|
||||
{
|
||||
AchievementCriteriaEntry const* achievementCriteria = (*i);
|
||||
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->Achievement_ID);
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->ReferredAchievement);
|
||||
if (!achievement)
|
||||
continue;
|
||||
|
||||
@@ -497,9 +497,9 @@ void AchievementMgr<T>::ResetAchievementCriteria(AchievementCriteriaTypes type,
|
||||
continue;
|
||||
|
||||
for (uint8 j = 0; j < MAX_CRITERIA_REQUIREMENTS; ++j)
|
||||
if (achievementCriteria->additionalRequirements[j].additionalRequirement_type == miscValue1 &&
|
||||
(!achievementCriteria->additionalRequirements[j].additionalRequirement_value ||
|
||||
achievementCriteria->additionalRequirements[j].additionalRequirement_value == miscValue2))
|
||||
if (achievementCriteria->AdditionalRequirements[j].Type == miscValue1 &&
|
||||
(!achievementCriteria->AdditionalRequirements[j].Asset ||
|
||||
achievementCriteria->AdditionalRequirements[j].Asset == miscValue2))
|
||||
{
|
||||
RemoveCriteriaProgress(achievementCriteria);
|
||||
break;
|
||||
@@ -713,7 +713,7 @@ void AchievementMgr<Player>::LoadFromDB(PreparedQueryResult achievementResult, P
|
||||
continue;
|
||||
}
|
||||
|
||||
if (criteria->Timer_time && time_t(date + criteria->Timer_time) < GameTime::GetGameTime())
|
||||
if (criteria->StartTimer && time_t(date + criteria->StartTimer) < GameTime::GetGameTime())
|
||||
continue;
|
||||
|
||||
CriteriaProgress& progress = m_criteriaProgress[id];
|
||||
@@ -775,7 +775,7 @@ void AchievementMgr<Guild>::LoadFromDB(PreparedQueryResult achievementResult, Pr
|
||||
continue;
|
||||
}
|
||||
|
||||
if (criteria->Timer_time && time_t(date + criteria->Timer_time) < GameTime::GetGameTime())
|
||||
if (criteria->StartTimer && time_t(date + criteria->StartTimer) < GameTime::GetGameTime())
|
||||
continue;
|
||||
|
||||
CriteriaProgress& progress = m_criteriaProgress[id];
|
||||
@@ -942,7 +942,7 @@ void AchievementMgr<Player>::SendCriteriaUpdate(AchievementCriteriaEntry const*
|
||||
data.appendPackGUID(progress->counter);
|
||||
|
||||
data << GetOwner()->GetPackGUID();
|
||||
if (!entry->Timer_time)
|
||||
if (!entry->StartTimer)
|
||||
data << uint32(0);
|
||||
else
|
||||
data << uint32(timedCompleted ? 1 : 0); // this are some flags, 1 is for keeping the counter at 0 in client
|
||||
@@ -1160,10 +1160,10 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i != achievementCriteriaList.end(); ++i)
|
||||
{
|
||||
AchievementCriteriaEntry const* achievementCriteria = (*i);
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->Achievement_ID);
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementCriteria->ReferredAchievement);
|
||||
if (!achievement)
|
||||
{
|
||||
TC_LOG_ERROR("achievement", "UpdateAchievementCriteria: Achievement %u not found!", achievementCriteria->Achievement_ID);
|
||||
TC_LOG_ERROR("achievement", "UpdateAchievementCriteria: Achievement %u not found!", achievementCriteria->ReferredAchievement);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -1279,11 +1279,11 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
SetCriteriaProgress(achievementCriteria, referencePlayer->getLevel(), referencePlayer);
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
|
||||
if (uint32 skillvalue = referencePlayer->GetBaseSkillValue(achievementCriteria->reach_skill_level.skillID))
|
||||
if (uint32 skillvalue = referencePlayer->GetBaseSkillValue(achievementCriteria->Asset.SkillID))
|
||||
SetCriteriaProgress(achievementCriteria, skillvalue, referencePlayer);
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
||||
if (uint32 maxSkillvalue = referencePlayer->GetPureMaxSkillValue(achievementCriteria->learn_skill_level.skillID))
|
||||
if (uint32 maxSkillvalue = referencePlayer->GetPureMaxSkillValue(achievementCriteria->Asset.SkillID))
|
||||
SetCriteriaProgress(achievementCriteria, maxSkillvalue, referencePlayer);
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
|
||||
@@ -1327,7 +1327,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
for (RewardedQuestSet::const_iterator itr = rewQuests.begin(); itr != rewQuests.end(); ++itr)
|
||||
{
|
||||
Quest const* quest = sObjectMgr->GetQuestTemplate(*itr);
|
||||
if (quest && quest->GetZoneOrSort() >= 0 && uint32(quest->GetZoneOrSort()) == achievementCriteria->complete_quests_in_zone.zoneID)
|
||||
if (quest && quest->GetZoneOrSort() >= 0 && uint32(quest->GetZoneOrSort()) == achievementCriteria->Asset.ZoneID)
|
||||
++counter;
|
||||
}
|
||||
SetCriteriaProgress(achievementCriteria, counter, referencePlayer);
|
||||
@@ -1357,7 +1357,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
|
||||
{
|
||||
int32 reputation = referencePlayer->GetReputationMgr().GetReputation(achievementCriteria->gain_reputation.factionID);
|
||||
int32 reputation = referencePlayer->GetReputationMgr().GetReputation(achievementCriteria->Asset.FactionID);
|
||||
if (reputation > 0)
|
||||
SetCriteriaProgress(achievementCriteria, reputation, referencePlayer);
|
||||
break;
|
||||
@@ -1373,7 +1373,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellIter.first);
|
||||
for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter)
|
||||
{
|
||||
if (skillIter->second->SkillLine == achievementCriteria->learn_skillline_spell.skillLine)
|
||||
if (skillIter->second->SkillLine == achievementCriteria->Asset.SkillID)
|
||||
{
|
||||
// do not add couter twice if by any chance skill is listed twice in dbc (eg. skill 777 and spell 22717)
|
||||
++spellCount;
|
||||
@@ -1400,7 +1400,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
{
|
||||
SkillLineAbilityMapBounds bounds = sSpellMgr->GetSkillLineAbilityMapBounds(spellIter.first);
|
||||
for (SkillLineAbilityMap::const_iterator skillIter = bounds.first; skillIter != bounds.second; ++skillIter)
|
||||
if (skillIter->second->SkillLine == achievementCriteria->learn_skill_line.skillLine)
|
||||
if (skillIter->second->SkillLine == achievementCriteria->Asset.SkillID)
|
||||
{
|
||||
// do not add couter twice if by any chance skill is listed twice in dbc (eg. skill 777 and spell 22717)
|
||||
++spellCount;
|
||||
@@ -1430,7 +1430,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING:
|
||||
{
|
||||
uint32 reqTeamType = achievementCriteria->highest_team_rating.teamtype;
|
||||
uint32 reqTeamType = achievementCriteria->Asset.TeamType;
|
||||
|
||||
if (miscValue1)
|
||||
{
|
||||
@@ -1460,7 +1460,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type,
|
||||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING:
|
||||
{
|
||||
uint32 reqTeamType = achievementCriteria->highest_personal_rating.teamtype;
|
||||
uint32 reqTeamType = achievementCriteria->Asset.TeamType;
|
||||
|
||||
if (miscValue1)
|
||||
{
|
||||
@@ -1553,138 +1553,81 @@ bool AchievementMgr<T>::IsCompletedCriteria(AchievementCriteriaEntry const* achi
|
||||
switch (AchievementCriteriaTypes(achievementCriteria->Type))
|
||||
{
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
|
||||
return progress->counter >= achievementCriteria->win_bg.winCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||
return progress->counter >= achievementCriteria->kill_creature.creatureCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHAEOLOGY_PROJECTS:
|
||||
return progress->counter >= achievementCriteria->archaeology.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL:
|
||||
return progress->counter >= achievementCriteria->reach_level.level;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
|
||||
return progress->counter >= achievementCriteria->reach_skill_level.skillLevel;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD:
|
||||
return progress->counter >= 1;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE:
|
||||
return progress->counter >= achievementCriteria->raw.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT:
|
||||
return progress->counter >= achievementCriteria->complete_quest_count.totalQuestCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY:
|
||||
return progress->counter >= achievementCriteria->complete_daily_quest_daily.numberOfDays;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
|
||||
return progress->counter >= achievementCriteria->complete_quests_in_zone.questCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE:
|
||||
return progress->counter >= achievementCriteria->healing_done.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST:
|
||||
return progress->counter >= achievementCriteria->complete_daily_quest.questCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING:
|
||||
return progress->counter >= achievementCriteria->fall_without_dying.fallHeight;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
|
||||
return progress->counter >= achievementCriteria->complete_quest.questCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
|
||||
return progress->counter >= achievementCriteria->be_spell_target.spellCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
|
||||
return progress->counter >= achievementCriteria->cast_spell.castCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
|
||||
return progress->counter >= achievementCriteria->bg_objective.completeCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
|
||||
return progress->counter >= achievementCriteria->honorable_kill_at_area.killCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
|
||||
return progress->counter >= 1;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD:
|
||||
return progress->counter >= achievementCriteria->honorable_kill.killCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD:
|
||||
return progress->counter >= achievementCriteria->raw.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
|
||||
return progress->counter >= achievementCriteria->own_item.itemCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
||||
return progress->counter >= achievementCriteria->win_rated_arena.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING:
|
||||
return progress->counter >= achievementCriteria->highest_personal_rating.PersonalRating;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
||||
return progress->counter >= (achievementCriteria->learn_skill_level.skillLevel * 75);
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
|
||||
return progress->counter >= achievementCriteria->use_item.itemCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
|
||||
return progress->counter >= achievementCriteria->loot_item.itemCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
|
||||
return progress->counter >= 1;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS:
|
||||
return progress->counter >= achievementCriteria->raw.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT:
|
||||
return progress->counter >= achievementCriteria->buy_bank_slot.numberOfSlots;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
|
||||
return progress->counter >= achievementCriteria->gain_reputation.reputationAmount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE:
|
||||
return progress->counter >= achievementCriteria->guild_challenge.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
|
||||
return progress->counter >= achievementCriteria->gain_exalted_reputation.numberOfExaltedFactions;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
|
||||
return progress->counter >= achievementCriteria->visit_barber.numberOfVisits;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
|
||||
return progress->counter >= achievementCriteria->equip_epic_item.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
|
||||
return progress->counter >= achievementCriteria->roll_greed_on_loot.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
|
||||
return progress->counter >= achievementCriteria->hk_class.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
|
||||
return progress->counter >= achievementCriteria->hk_race.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
|
||||
return progress->counter >= achievementCriteria->do_emote.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
|
||||
return progress->counter >= achievementCriteria->equip_item.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS:
|
||||
return progress->counter >= achievementCriteria->guild_gold_repairs.goldInCopper;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD:
|
||||
return progress->counter >= achievementCriteria->quest_reward_money.goldInCopper;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY:
|
||||
return progress->counter >= achievementCriteria->loot_money.goldInCopper;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
|
||||
return progress->counter >= achievementCriteria->use_gameobject.useCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL:
|
||||
return progress->counter >= achievementCriteria->special_pvp_kill.killCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
|
||||
return progress->counter >= achievementCriteria->fish_in_gameobject.lootCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
|
||||
return progress->counter >= achievementCriteria->learn_skillline_spell.spellCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL:
|
||||
return progress->counter >= achievementCriteria->win_duel.duelCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
|
||||
if (!achievementCriteria->loot_epic_item.count)
|
||||
return false;
|
||||
return progress->counter >= achievementCriteria->loot_epic_item.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
||||
return progress->counter >= achievementCriteria->loot_type.lootTypeCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
|
||||
return progress->counter >= achievementCriteria->learn_skill_line.spellCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS:
|
||||
return progress->counter >= achievementCriteria->raw.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD:
|
||||
return progress->counter >= achievementCriteria->raw.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CURRENCY:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL:
|
||||
return progress->counter >= achievementCriteria->Amount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
|
||||
return progress->counter >= 1;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
||||
return progress->counter >= (achievementCriteria->Amount * 75);
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS:
|
||||
return progress->counter >= 9000;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS:
|
||||
return progress->counter >= achievementCriteria->use_lfg.dungeonsComplete;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS:
|
||||
return progress->counter >= achievementCriteria->get_killing_blow.killCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CURRENCY:
|
||||
return progress->counter >= achievementCriteria->currencyGain.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD:
|
||||
return progress->counter >= achievementCriteria->raw.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL:
|
||||
return progress->counter >= achievementCriteria->catch_from_pool.catchCount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
|
||||
return achievementCriteria->win_arena.count && progress->counter >= achievementCriteria->win_arena.count;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
|
||||
return achievementCriteria->Amount && progress->counter >= achievementCriteria->Amount;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN:
|
||||
return true;
|
||||
// handle all statistic-only criteria here
|
||||
// handle all statistic-only criteria here
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
|
||||
@@ -1718,7 +1661,6 @@ bool AchievementMgr<T>::IsCompletedCriteria(AchievementCriteriaEntry const* achi
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1745,8 +1687,8 @@ bool AchievementMgr<T>::IsCompletedAchievement(AchievementEntry const* entry)
|
||||
return false;
|
||||
|
||||
// for achievement with referenced achievement criterias get from referenced and counter from self
|
||||
uint32 achievementForTestId = entry->Shares_criteria ? entry->Shares_criteria : entry->ID;
|
||||
uint32 achievementForTestCount = entry->Minimum_criteria;
|
||||
uint32 achievementForTestId = entry->SharesCriteria ? entry->SharesCriteria : entry->ID;
|
||||
uint32 achievementForTestCount = entry->MinimumCriteria;
|
||||
|
||||
AchievementCriteriaEntryList const* cList = sAchievementMgr->GetAchievementCriteriaByAchievement(achievementForTestId);
|
||||
if (!cList)
|
||||
@@ -1768,7 +1710,7 @@ bool AchievementMgr<T>::IsCompletedAchievement(AchievementEntry const* entry)
|
||||
count += progress->counter;
|
||||
|
||||
// for counters, field4 contains the main count requirement
|
||||
if (count >= criteria->raw.count)
|
||||
if (count >= criteria->Amount)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -1816,7 +1758,7 @@ void AchievementMgr<T>::SetCriteriaProgress(AchievementCriteriaEntry const* entr
|
||||
{
|
||||
// Don't allow to cheat - doing timed achievements without timer active
|
||||
TimedAchievementMap::iterator timedIter = m_timedAchievements.find(entry->ID);
|
||||
if (entry->Timer_time && timedIter == m_timedAchievements.end())
|
||||
if (entry->StartTimer && timedIter == m_timedAchievements.end())
|
||||
return;
|
||||
|
||||
TC_LOG_DEBUG("achievement", "SetCriteriaProgress(%u, " UI64FMTD ") for (%s)",
|
||||
@@ -1827,7 +1769,7 @@ void AchievementMgr<T>::SetCriteriaProgress(AchievementCriteriaEntry const* entr
|
||||
{
|
||||
// not create record for 0 counter but allow it for timed achievements
|
||||
// we will need to send 0 progress to client to start the timer
|
||||
if (changeValue == 0 && !entry->Timer_time)
|
||||
if (changeValue == 0 && !entry->StartTimer)
|
||||
return;
|
||||
|
||||
progress = &m_criteriaProgress[entry->ID];
|
||||
@@ -1854,7 +1796,7 @@ void AchievementMgr<T>::SetCriteriaProgress(AchievementCriteriaEntry const* entr
|
||||
}
|
||||
|
||||
// not update (not mark as changed) if counter will have same value
|
||||
if (progress->counter == newValue && !entry->Timer_time)
|
||||
if (progress->counter == newValue && !entry->StartTimer)
|
||||
return;
|
||||
|
||||
progress->counter = newValue;
|
||||
@@ -1863,14 +1805,14 @@ void AchievementMgr<T>::SetCriteriaProgress(AchievementCriteriaEntry const* entr
|
||||
progress->changed = true;
|
||||
progress->date = GameTime::GetGameTime(); // set the date to the latest update.
|
||||
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(entry->Achievement_ID);
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(entry->ReferredAchievement);
|
||||
uint32 timeElapsed = 0;
|
||||
bool criteriaComplete = IsCompletedCriteria(entry, achievement);
|
||||
|
||||
if (entry->Timer_time)
|
||||
if (entry->StartTimer)
|
||||
{
|
||||
// Client expects this in packet
|
||||
timeElapsed = entry->Timer_time - (timedIter->second/IN_MILLISECONDS);
|
||||
timeElapsed = entry->StartTimer - (timedIter->second/IN_MILLISECONDS);
|
||||
|
||||
// Remove the timer, we wont need it anymore
|
||||
if (criteriaComplete)
|
||||
@@ -1917,16 +1859,16 @@ void AchievementMgr<Player>::StartTimedAchievement(AchievementCriteriaTimedTypes
|
||||
AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetTimedAchievementCriteriaByType(type);
|
||||
for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i != achievementCriteriaList.end(); ++i)
|
||||
{
|
||||
if ((*i)->Timer_asset_ID != entry)
|
||||
if ((*i)->StartAsset != entry)
|
||||
continue;
|
||||
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement((*i)->Achievement_ID);
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement((*i)->ReferredAchievement);
|
||||
if (m_timedAchievements.find((*i)->ID) == m_timedAchievements.end() && !IsCompletedCriteria(*i, achievement))
|
||||
{
|
||||
// Start the timer
|
||||
if ((*i)->Timer_time * IN_MILLISECONDS > timeLost)
|
||||
if ((*i)->StartTimer * IN_MILLISECONDS > timeLost)
|
||||
{
|
||||
m_timedAchievements[(*i)->ID] = (*i)->Timer_time * IN_MILLISECONDS - timeLost;
|
||||
m_timedAchievements[(*i)->ID] = (*i)->StartTimer * IN_MILLISECONDS - timeLost;
|
||||
|
||||
// and at client too
|
||||
SetCriteriaProgress(*i, 0, GetOwner(), PROGRESS_SET);
|
||||
@@ -1941,7 +1883,7 @@ void AchievementMgr<T>::RemoveTimedAchievement(AchievementCriteriaTimedTypes typ
|
||||
AchievementCriteriaEntryList const& achievementCriteriaList = sAchievementMgr->GetTimedAchievementCriteriaByType(type);
|
||||
for (AchievementCriteriaEntryList::const_iterator i = achievementCriteriaList.begin(); i != achievementCriteriaList.end(); ++i)
|
||||
{
|
||||
if ((*i)->Timer_asset_ID != entry)
|
||||
if ((*i)->StartAsset != entry)
|
||||
continue;
|
||||
|
||||
TimedAchievementMap::iterator timedIter = m_timedAchievements.find((*i)->ID);
|
||||
@@ -2411,7 +2353,7 @@ bool AchievementMgr<T>::CanUpdateCriteria(AchievementCriteriaEntry const* criter
|
||||
return false;
|
||||
}
|
||||
|
||||
if (achievement->Instance_ID != -1 && referencePlayer->GetMapId() != uint32(achievement->Instance_ID))
|
||||
if (achievement->MapID != -1 && referencePlayer->GetMapId() != uint32(achievement->MapID))
|
||||
{
|
||||
TC_LOG_TRACE("achievement", "CanUpdateCriteria: (Id: %u Type %s Achievement %u) Wrong map",
|
||||
criteria->ID, AchievementGlobalMgr::GetCriteriaTypeString(criteria->Type), achievement->ID);
|
||||
@@ -2462,13 +2404,13 @@ bool AchievementMgr<T>::ConditionsSatisfied(AchievementCriteriaEntry const* crit
|
||||
{
|
||||
for (uint32 i = 0; i < MAX_CRITERIA_REQUIREMENTS; ++i)
|
||||
{
|
||||
if (!criteria->additionalRequirements[i].additionalRequirement_type)
|
||||
if (!criteria->AdditionalRequirements[i].Type)
|
||||
continue;
|
||||
|
||||
switch (criteria->additionalRequirements[i].additionalRequirement_type)
|
||||
switch (criteria->AdditionalRequirements[i].Type)
|
||||
{
|
||||
case ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP:
|
||||
if (referencePlayer->GetMapId() != criteria->additionalRequirements[i].additionalRequirement_value)
|
||||
if (referencePlayer->GetMapId() != criteria->AdditionalRequirements[i].Asset)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_CONDITION_NOT_IN_GROUP:
|
||||
@@ -2554,7 +2496,7 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE:
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT:
|
||||
if (m_completedAchievements.find(achievementCriteria->complete_achievement.linkedAchievement) == m_completedAchievements.end())
|
||||
if (m_completedAchievements.find(achievementCriteria->Asset.AchievementID) == m_completedAchievements.end())
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD:
|
||||
@@ -2562,33 +2504,33 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
|
||||
if (!miscValue1 || achievementCriteria->win_bg.bgMapID != referencePlayer->GetMapId())
|
||||
if (!miscValue1 || achievementCriteria->Asset.MapID != referencePlayer->GetMapId())
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||
if (!miscValue1 || achievementCriteria->kill_creature.creatureID != miscValue1)
|
||||
if (!miscValue1 || achievementCriteria->Asset.CreatureID != miscValue1)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL:
|
||||
// update at loading or specific skill update
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->reach_skill_level.skillID)
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->Asset.SkillID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL:
|
||||
// update at loading or specific skill update
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_level.skillID)
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->Asset.SkillID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE:
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->complete_quests_in_zone.zoneID)
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->Asset.ZoneID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND:
|
||||
if (!miscValue1 || referencePlayer->GetMapId() != achievementCriteria->complete_battleground.mapID)
|
||||
if (!miscValue1 || referencePlayer->GetMapId() != achievementCriteria->Asset.MapID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP:
|
||||
if (!miscValue1 || referencePlayer->GetMapId() != achievementCriteria->death_at_map.mapID)
|
||||
if (!miscValue1 || referencePlayer->GetMapId() != achievementCriteria->Asset.MapID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DEATH:
|
||||
@@ -2599,7 +2541,7 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
bool notfit = false;
|
||||
for (int j = 0; j < MAX_ARENA_SLOT; ++j)
|
||||
{
|
||||
if (achievIdByArenaSlot[j] == achievementCriteria->Achievement_ID)
|
||||
if (achievIdByArenaSlot[j] == achievementCriteria->ReferredAchievement)
|
||||
{
|
||||
Battleground* bg = referencePlayer->GetBattleground();
|
||||
if (!bg || !bg->isArena() || ArenaTeam::GetSlotByType(bg->GetArenaType()) != j)
|
||||
@@ -2624,7 +2566,7 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
bool found = false;
|
||||
for (int j = 0; achievIdForDungeon[j][0]; ++j)
|
||||
{
|
||||
if (achievIdForDungeon[j][0] == achievementCriteria->Achievement_ID)
|
||||
if (achievIdForDungeon[j][0] == achievementCriteria->ReferredAchievement)
|
||||
{
|
||||
if (map->IsRaid())
|
||||
{
|
||||
@@ -2653,12 +2595,12 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
return false;
|
||||
|
||||
//FIXME: work only for instances where max == min for players
|
||||
if (((InstanceMap*)map)->GetMaxPlayers() != achievementCriteria->death_in_dungeon.manLimit)
|
||||
if (((InstanceMap*)map)->GetMaxPlayers() != achievementCriteria->Asset.GroupSize)
|
||||
return false;
|
||||
break;
|
||||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->killed_by_creature.creatureEntry)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.CreatureID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER:
|
||||
@@ -2666,7 +2608,7 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM:
|
||||
if (!miscValue1 || miscValue2 != achievementCriteria->death_from.type)
|
||||
if (!miscValue1 || miscValue2 != achievementCriteria->Asset.DamageType)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST:
|
||||
@@ -2674,13 +2616,13 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
// if miscValues != 0, it contains the questID.
|
||||
if (miscValue1)
|
||||
{
|
||||
if (miscValue1 != achievementCriteria->complete_quest.questID)
|
||||
if (miscValue1 != achievementCriteria->Asset.QuestID)
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
// login case.
|
||||
if (!referencePlayer->GetQuestRewardStatus(achievementCriteria->complete_quest.questID))
|
||||
if (!referencePlayer->GetQuestRewardStatus(achievementCriteria->Asset.QuestID))
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2691,42 +2633,42 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->be_spell_target.spellID)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.SpellID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->cast_spell.spellID)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.SpellID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL:
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->learn_spell.spellID)
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->Asset.SpellID)
|
||||
return false;
|
||||
|
||||
if (!referencePlayer->HasSpell(achievementCriteria->learn_spell.spellID))
|
||||
if (!referencePlayer->HasSpell(achievementCriteria->Asset.SpellID))
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE:
|
||||
// miscValue1 = itemId - miscValue2 = count of item loot
|
||||
// miscValue3 = loot_type (note: 0 = LOOT_CORPSE and then it ignored)
|
||||
if (!miscValue1 || !miscValue2 || !miscValue3 || miscValue3 != achievementCriteria->loot_type.lootType)
|
||||
if (!miscValue1 || !miscValue2 || !miscValue3 || miscValue3 != achievementCriteria->Asset.LootType)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM:
|
||||
if (miscValue1 && achievementCriteria->own_item.itemID != miscValue1)
|
||||
if (miscValue1 && achievementCriteria->Asset.ItemID != miscValue1)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM:
|
||||
if (!miscValue1 || achievementCriteria->use_item.itemID != miscValue1)
|
||||
if (!miscValue1 || achievementCriteria->Asset.ItemID != miscValue1)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->own_item.itemID)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.ItemID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA:
|
||||
{
|
||||
WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(achievementCriteria->explore_area.areaReference);
|
||||
WorldMapOverlayEntry const* worldOverlayEntry = sWorldMapOverlayStore.LookupEntry(achievementCriteria->Asset.WorldMapOverlayID);
|
||||
if (!worldOverlayEntry)
|
||||
break;
|
||||
|
||||
@@ -2754,23 +2696,23 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
break;
|
||||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION:
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->gain_reputation.factionID)
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->Asset.FactionID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->guild_challenge.flag)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.GuildChallengeType)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM:
|
||||
// miscValue1 = itemid miscValue2 = itemSlot
|
||||
if (!miscValue1 || miscValue2 != achievementCriteria->equip_epic_item.itemSlot)
|
||||
if (!miscValue1 || miscValue2 != achievementCriteria->Asset.ItemSlot)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT:
|
||||
{
|
||||
// miscValue1 = itemid miscValue2 = diced value
|
||||
if (!miscValue1 || miscValue2 != achievementCriteria->roll_greed_on_loot.rollValue)
|
||||
if (!miscValue1 || miscValue2 != achievementCriteria->Asset.RollValue)
|
||||
return false;
|
||||
|
||||
ItemTemplate const* proto = sObjectMgr->GetItemTemplate(uint32(miscValue1));
|
||||
@@ -2779,7 +2721,7 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
break;
|
||||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->do_emote.emoteID)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.EmoteID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE:
|
||||
@@ -2787,9 +2729,9 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
if (!miscValue1)
|
||||
return false;
|
||||
|
||||
if (achievementCriteria->additionalRequirements[0].additionalRequirement_type == ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP)
|
||||
if (achievementCriteria->AdditionalRequirements[0].Type == ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP)
|
||||
{
|
||||
if (referencePlayer->GetMapId() != achievementCriteria->additionalRequirements[0].additionalRequirement_value)
|
||||
if (referencePlayer->GetMapId() != achievementCriteria->AdditionalRequirements[0].Asset)
|
||||
return false;
|
||||
|
||||
// map specific case (BG in fact) expected player targeted damage/heal
|
||||
@@ -2799,19 +2741,19 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM:
|
||||
// miscValue1 = item_id
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->equip_item.itemID)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.ItemID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->use_gameobject.goEntry)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.GameObjectID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->fish_in_gameobject.goEntry)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.GameObjectID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS:
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->learn_skillline_spell.skillLine)
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->Asset.SkillID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM:
|
||||
@@ -2822,32 +2764,32 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteriaEntry const* ac
|
||||
break;
|
||||
}
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE:
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->learn_skill_line.skillLine)
|
||||
if (miscValue1 && miscValue1 != achievementCriteria->Asset.SkillID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->hk_class.classID)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.ClassID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HK_RACE:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->hk_race.raceID)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.RaceID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->bg_objective.objectiveId)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.ObjectiveId)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA:
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->honorable_kill_at_area.areaID)
|
||||
if (!miscValue1 || miscValue1 != achievementCriteria->Asset.AreaID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CURRENCY:
|
||||
if (!miscValue1 || !miscValue2 || int64(miscValue2) < 0
|
||||
|| miscValue1 != achievementCriteria->currencyGain.currency)
|
||||
|| miscValue1 != achievementCriteria->Asset.CurrencyID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA:
|
||||
if (miscValue1 != achievementCriteria->win_arena.mapID)
|
||||
if (miscValue1 != achievementCriteria->Asset.MapID)
|
||||
return false;
|
||||
break;
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL:
|
||||
@@ -3324,17 +3266,17 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList()
|
||||
if (!criteria)
|
||||
continue;
|
||||
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->Achievement_ID);
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(criteria->ReferredAchievement);
|
||||
|
||||
m_AchievementCriteriaListByAchievement[criteria->Achievement_ID].push_back(criteria);
|
||||
m_AchievementCriteriaListByAchievement[criteria->ReferredAchievement].push_back(criteria);
|
||||
|
||||
if (achievement && achievement->Flags & ACHIEVEMENT_FLAG_GUILD)
|
||||
++guildCriterias, m_GuildAchievementCriteriasByType[criteria->Type].push_back(criteria);
|
||||
else
|
||||
++criterias, m_AchievementCriteriasByType[criteria->Type].push_back(criteria);
|
||||
|
||||
if (criteria->Timer_time)
|
||||
m_AchievementCriteriasByTimedType[criteria->Timer_start_event].push_back(criteria);
|
||||
if (criteria->StartTimer)
|
||||
m_AchievementCriteriasByTimedType[criteria->StartEvent].push_back(criteria);
|
||||
}
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u achievement criteria and %u guild achievement crieteria in %u ms.", criterias, guildCriterias, GetMSTimeDiffToNow(oldMSTime));
|
||||
@@ -3355,20 +3297,20 @@ void AchievementGlobalMgr::LoadAchievementReferenceList()
|
||||
for (uint32 entryId = 0; entryId < sAchievementStore.GetNumRows(); ++entryId)
|
||||
{
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(entryId);
|
||||
if (!achievement || !achievement->Shares_criteria)
|
||||
if (!achievement || !achievement->SharesCriteria)
|
||||
continue;
|
||||
|
||||
m_AchievementListByReferencedId[achievement->Shares_criteria].push_back(achievement);
|
||||
m_AchievementListByReferencedId[achievement->SharesCriteria].push_back(achievement);
|
||||
++count;
|
||||
}
|
||||
|
||||
// Once Bitten, Twice Shy (10 player) - Icecrown Citadel
|
||||
if (AchievementEntry const* achievement = sAchievementMgr->GetAchievement(4539))
|
||||
const_cast<AchievementEntry*>(achievement)->Instance_ID = 631; // Correct map requirement (currently has Ulduar)
|
||||
const_cast<AchievementEntry*>(achievement)->MapID = 631; // Correct map requirement (currently has Ulduar)
|
||||
|
||||
// Straw That Broke the Camel's Back - Halls of Origination
|
||||
if (AchievementEntry const* achievement = sAchievementMgr->GetAchievement(5294))
|
||||
const_cast<AchievementEntry*>(achievement)->Instance_ID = 644; // Correct map requirement
|
||||
const_cast<AchievementEntry*>(achievement)->MapID = 644; // Correct map requirement
|
||||
|
||||
TC_LOG_INFO("server.loading", ">> Loaded %u achievement references in %u ms.", count, GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ struct AchievementEntry
|
||||
{
|
||||
uint32 ID; // 0
|
||||
int32 Faction; // 1 -1=all, 0=horde, 1=alliance
|
||||
int32 Instance_ID; // 2 -1=none
|
||||
int32 MapID; // 2 -1=none
|
||||
//uint32 Supercedes; // 3 its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin)
|
||||
char* Title; // 4
|
||||
//char* Description; // 5
|
||||
@@ -43,8 +43,8 @@ struct AchievementEntry
|
||||
uint32 Flags; // 9
|
||||
//uint32 IconID; // 10 icon (from SpellIcon.dbc)
|
||||
//char* Reward; // 11
|
||||
uint32 Minimum_criteria; // 12 - need this count of completed criterias (own or referenced achievement criterias)
|
||||
uint32 Shares_criteria; // 13 - referenced achievement (counting of all completed criterias)
|
||||
uint32 MinimumCriteria; // 12 - need this count of completed criterias (own or referenced achievement criterias)
|
||||
uint32 SharesCriteria; // 13 - referenced achievement (counting of all completed criterias)
|
||||
};
|
||||
|
||||
struct AchievementCategoryEntry
|
||||
@@ -58,562 +58,131 @@ struct AchievementCategoryEntry
|
||||
struct AchievementCriteriaEntry
|
||||
{
|
||||
uint32 ID; // 0
|
||||
uint32 Achievement_ID; // 1
|
||||
uint32 ReferredAchievement; // 1
|
||||
uint32 Type; // 2
|
||||
|
||||
union
|
||||
{
|
||||
uint32 ID;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0
|
||||
/// @todo also used for player deaths..
|
||||
struct
|
||||
{
|
||||
uint32 creatureID; // 3
|
||||
uint64 creatureCount; // 4
|
||||
} kill_creature;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20
|
||||
uint32 CreatureID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1
|
||||
struct
|
||||
{
|
||||
uint32 bgMapID; // 3
|
||||
uint64 winCount; // 4
|
||||
} win_bg;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHAEOLOGY_PROJECTS = 3
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint32 count; // 4
|
||||
} archaeology;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL = 125
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 level; // 4
|
||||
} reach_level;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP = 16
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33
|
||||
uint32 MapID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7
|
||||
struct
|
||||
{
|
||||
uint32 skillID; // 3
|
||||
uint64 skillLevel; // 4
|
||||
} reach_skill_level;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112
|
||||
uint32 SkillID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
|
||||
struct
|
||||
{
|
||||
uint32 linkedAchievement; // 3
|
||||
} complete_achievement;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 totalQuestCount; // 4
|
||||
} complete_quest_count;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 numberOfDays; // 4
|
||||
} complete_daily_quest_daily;
|
||||
uint32 AchievementID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11
|
||||
struct
|
||||
{
|
||||
uint32 zoneID; // 3
|
||||
uint64 questCount; // 4
|
||||
} complete_quests_in_zone;
|
||||
uint32 ZoneID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12
|
||||
struct
|
||||
{
|
||||
uint32 currency;
|
||||
uint64 count;
|
||||
} currencyGain;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 questCount; // 4
|
||||
} complete_daily_quest;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15
|
||||
struct
|
||||
{
|
||||
uint32 mapID; // 3
|
||||
} complete_battleground;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP = 16
|
||||
struct
|
||||
{
|
||||
uint32 mapID; // 3
|
||||
} death_at_map;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12
|
||||
uint32 CurrencyID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18
|
||||
struct
|
||||
{
|
||||
uint32 manLimit; // 3
|
||||
} death_in_dungeon;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19
|
||||
struct
|
||||
{
|
||||
uint32 groupSize; // 3 can be 5, 10 or 25
|
||||
} complete_raid;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20
|
||||
struct
|
||||
{
|
||||
uint32 creatureEntry; // 3
|
||||
} killed_by_creature;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 fallHeight; // 4
|
||||
} fall_without_dying;
|
||||
uint32 GroupSize;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26
|
||||
struct
|
||||
{
|
||||
uint32 type; // 3, see enum EnviromentalDamage
|
||||
} death_from;
|
||||
uint32 DamageType;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27
|
||||
struct
|
||||
{
|
||||
uint32 questID; // 3
|
||||
uint64 questCount; // 4
|
||||
} complete_quest;
|
||||
uint32 QuestID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2 = 69
|
||||
struct
|
||||
{
|
||||
uint32 spellID; // 3
|
||||
uint64 spellCount; // 4
|
||||
} be_spell_target;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL = 29
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110
|
||||
struct
|
||||
{
|
||||
uint32 spellID; // 3
|
||||
uint64 castCount; // 4
|
||||
} cast_spell;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34
|
||||
uint32 SpellID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
|
||||
struct
|
||||
{
|
||||
uint32 objectiveId; // 3
|
||||
uint64 completeCount; // 4
|
||||
} bg_objective;
|
||||
uint32 ObjectiveId;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31
|
||||
struct
|
||||
{
|
||||
uint32 areaID; // 3 Reference to AreaTable.dbc
|
||||
uint64 killCount; // 4
|
||||
} honorable_kill_at_area;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32
|
||||
struct
|
||||
{
|
||||
uint32 mapID; // 3 Reference to Map.dbc
|
||||
uint64 count; // 4 Number of times that the arena must be won.
|
||||
} win_arena;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33
|
||||
struct
|
||||
{
|
||||
uint32 mapID; // 3 Reference to Map.dbc
|
||||
} play_arena;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34
|
||||
struct
|
||||
{
|
||||
uint32 spellID; // 3 Reference to Map.dbc
|
||||
} learn_spell;
|
||||
uint32 AreaID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36
|
||||
struct
|
||||
{
|
||||
uint32 itemID; // 3
|
||||
uint64 itemCount; // 4
|
||||
} own_item;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 count; // 4
|
||||
} win_rated_arena;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57
|
||||
uint32 ItemID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38
|
||||
struct
|
||||
{
|
||||
uint32 teamtype; // 3 {2, 3, 5}
|
||||
} highest_team_rating;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39
|
||||
struct
|
||||
{
|
||||
uint32 teamtype; // 3 {2, 3, 5}
|
||||
uint64 teamrating; // 4
|
||||
} reach_team_rating;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39
|
||||
struct
|
||||
{
|
||||
uint32 teamtype; // 3 {2, 3, 5}
|
||||
uint64 PersonalRating; // 4
|
||||
} highest_personal_rating;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
|
||||
struct
|
||||
{
|
||||
uint32 skillID; // 3
|
||||
uint64 skillLevel; // 4 apprentice=1, journeyman=2, expert=3, artisan=4, master=5, grand master=6
|
||||
} learn_skill_level;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41
|
||||
struct
|
||||
{
|
||||
uint32 itemID; // 3
|
||||
uint64 itemCount; // 4
|
||||
} use_item;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42
|
||||
struct
|
||||
{
|
||||
uint32 itemID; // 3
|
||||
uint64 itemCount; // 4
|
||||
} loot_item;
|
||||
uint32 TeamType;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43
|
||||
struct
|
||||
{
|
||||
/// @todo This rank is _NOT_ the index from AreaTable.dbc
|
||||
uint32 areaReference; // 3
|
||||
} explore_area;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK = 44
|
||||
struct
|
||||
{
|
||||
/// @todo This rank is _NOT_ the index from CharTitles.dbc
|
||||
uint32 rank; // 3
|
||||
} own_rank;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT = 45
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 numberOfSlots; // 4
|
||||
} buy_bank_slot;
|
||||
uint32 WorldMapOverlayID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46
|
||||
struct
|
||||
{
|
||||
uint32 factionID; // 3
|
||||
uint64 reputationAmount; // 4 Total reputation amount, so 42000 = exalted
|
||||
} gain_reputation;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION= 47
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 numberOfExaltedFactions; // 4
|
||||
} gain_exalted_reputation;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP = 48
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 numberOfVisits; // 4
|
||||
} visit_barber;
|
||||
uint32 FactionID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49
|
||||
/// @todo where is the required itemlevel stored?
|
||||
struct
|
||||
{
|
||||
uint32 itemSlot; // 3
|
||||
uint64 count; // 4
|
||||
} equip_epic_item;
|
||||
uint32 ItemSlot;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50
|
||||
struct
|
||||
{
|
||||
uint32 rollValue; // 3
|
||||
uint64 count; // 4
|
||||
} roll_need_on_loot;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51
|
||||
struct
|
||||
{
|
||||
uint32 rollValue; // 3
|
||||
uint64 count; // 4
|
||||
} roll_greed_on_loot;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51
|
||||
uint32 RollValue;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52
|
||||
struct
|
||||
{
|
||||
uint32 classID; // 3
|
||||
uint64 count; // 4
|
||||
} hk_class;
|
||||
uint32 ClassID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53
|
||||
struct
|
||||
{
|
||||
uint32 raceID; // 3
|
||||
uint64 count; // 4
|
||||
} hk_race;
|
||||
uint32 RaceID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54
|
||||
/// @todo where is the information about the target stored?
|
||||
struct
|
||||
{
|
||||
uint32 emoteID; // 3 enum TextEmotes
|
||||
uint64 count; // 4 count of emotes, always required special target or requirements
|
||||
} do_emote;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 count; // 4
|
||||
} healing_done;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint64 killCount;
|
||||
} get_killing_blow;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57
|
||||
struct
|
||||
{
|
||||
uint32 itemID; // 3
|
||||
uint64 count; // 4
|
||||
} equip_item;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD= 62
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 goldInCopper; // 4
|
||||
} quest_reward_money;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 goldInCopper; // 4
|
||||
} loot_money;
|
||||
uint32 EmoteID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68
|
||||
struct
|
||||
{
|
||||
uint32 goEntry; // 3
|
||||
uint64 useCount; // 4
|
||||
} use_gameobject;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL = 70
|
||||
/// @todo are those special criteria stored in the dbc or do we have to add another sql table?
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 killCount; // 4
|
||||
} special_pvp_kill;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72
|
||||
struct
|
||||
{
|
||||
uint32 goEntry; // 3
|
||||
uint64 lootCount; // 4
|
||||
} fish_in_gameobject;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75
|
||||
struct
|
||||
{
|
||||
uint32 skillLine; // 3
|
||||
uint64 spellCount; // 4
|
||||
} learn_skillline_spell;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 duelCount; // 4
|
||||
} win_duel;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM = 90
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint32 count; // 4
|
||||
} loot_epic_item;
|
||||
uint32 GameObjectID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96
|
||||
struct
|
||||
{
|
||||
uint32 powerType; // 3 mana=0, 1=rage, 3=energy, 6=runic power
|
||||
} highest_power;
|
||||
uint32 PowerType;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97
|
||||
struct
|
||||
{
|
||||
uint32 statType; // 3 4=spirit, 3=int, 2=stamina, 1=agi, 0=strength
|
||||
} highest_stat;
|
||||
uint32 StatType;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98
|
||||
struct
|
||||
{
|
||||
uint32 spellSchool; // 3
|
||||
} highest_spellpower;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING = 100
|
||||
struct
|
||||
{
|
||||
uint32 ratingType; // 3
|
||||
} highest_rating;
|
||||
uint32 SpellSchool;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109
|
||||
struct
|
||||
{
|
||||
uint32 lootType; // 3 3=fishing, 2=pickpocket, 4=disentchant
|
||||
uint64 lootTypeCount; // 4
|
||||
} loot_type;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112
|
||||
struct
|
||||
{
|
||||
uint32 skillLine; // 3
|
||||
uint64 spellCount; // 4
|
||||
} learn_skill_line;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint64 killCount; // 4
|
||||
} honorable_kill;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS = 124
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint32 goldCount;
|
||||
} spent_gold_guild_repairs;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL = 125
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint32 level;
|
||||
} reach_guild_level;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD = 126
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint32 itemsCount;
|
||||
} craft_items_guild;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL = 127
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint32 catchCount;
|
||||
} catch_from_pool;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS = 128
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint32 slotsCount;
|
||||
} buy_guild_bank_slots;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS = 129
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint32 pointsCount;
|
||||
} earn_guild_achievement_points;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_BATTLEGROUND = 130
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint32 winCount;
|
||||
} win_rated_battleground;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD = 134
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint32 questCount;
|
||||
} complete_quests_guild;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD = 135
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint32 killCount;
|
||||
} honorable_kills_guild;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD = 136
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint32 count;
|
||||
} kill_creature_type_guild;
|
||||
uint32 LootType;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE = 138
|
||||
struct
|
||||
{
|
||||
uint32 flag; // 1: Guild Dungeon, 2:Guild raid, 3:Guild battleground
|
||||
uint32 count;
|
||||
} guild_challenge;
|
||||
uint32 GuildChallengeType;
|
||||
} Asset;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 unused; // 3
|
||||
uint32 goldInCopper; // 4
|
||||
} guild_gold_repairs;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 unused;
|
||||
uint64 dungeonsComplete;
|
||||
} use_lfg;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 field3; // 3 main requirement
|
||||
uint64 count; // 4 main requirement count
|
||||
} raw;
|
||||
};
|
||||
uint32 Amount;
|
||||
|
||||
struct
|
||||
{
|
||||
uint32 additionalRequirement_type;
|
||||
uint32 additionalRequirement_value;
|
||||
} additionalRequirements[MAX_CRITERIA_REQUIREMENTS];
|
||||
uint32 Type;
|
||||
uint32 Asset;
|
||||
} AdditionalRequirements[MAX_CRITERIA_REQUIREMENTS];
|
||||
|
||||
char* Description; // 9
|
||||
uint32 Flags; // 10
|
||||
uint32 Timer_start_event; // 11 Only appears with timed achievements, seems to be the type of starting a timed Achievement, only type 1 and some of type 6 need manual starting
|
||||
uint32 Flags; // 10
|
||||
uint32 StartEvent; // 11 Only appears with timed achievements, seems to be the type of starting a timed Achievement, only type 1 and some of type 6 need manual starting
|
||||
// 1: ByEventId(?) (serverside IDs), 2: ByQuestId, 5: ByCastSpellId(?)
|
||||
// 6: BySpellIdTarget(some of these are unknown spells, some not, some maybe spells)
|
||||
// 7: ByKillNpcId, 9: ByUseItemId
|
||||
uint32 Timer_asset_ID; // 12 Alway appears with timed events, used internally to start the achievement, store
|
||||
uint32 Timer_time; // 13 time limit in seconds
|
||||
uint32 Ui_order; // 14 also used in achievement shift-links as index in state bitmask
|
||||
uint32 StartAsset; // 12 Alway appears with timed events, used internally to start the achievement, store
|
||||
uint32 StartTimer; // 13 time limit in seconds
|
||||
uint32 OrderIndex; // 14 also used in achievement shift-links as index in state bitmask
|
||||
uint32 RequiredWorldStateID; // 15
|
||||
int32 RequiredWorldStateValue; // 16
|
||||
uint32 AdditionalConditionType[MAX_ADDITIONAL_CRITERIA_CONDITIONS]; // 17-19
|
||||
|
||||
Reference in new issue
Block a user