void AchievementInterface::HandleAchievementCriteriaTalentResetCostTotal(uint32 cost) { AchievementCriteriaMap::iterator itr = objmgr.m_achievementCriteriaMap.find( ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS ); if(itr == objmgr.m_achievementCriteriaMap.end()) return; AchievementCriteriaSet * acs = itr->second; if( !acs ) // We have no achievements for this criteria :( return; AchievementCriteriaSet::iterator citr = acs->begin(); for(; citr != acs->end(); ++citr) { AchievementCriteriaEntry * ace = (*citr); uint32 AchievementID = ace->referredAchievement; AchievementEntry * pAchievementEntry = dbcAchievement.LookupEntryForced(AchievementID); if(!pAchievementEntry) continue; AchievementCriteriaEntry * compareCriteria = NULL; AchievementData * ad = GetAchievementDataByAchievementID(AchievementID); if(ad->completed) continue; // Figure out our associative ID. for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) { compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] ); if( compareCriteria == ace ) { ad->counter[i] = ad->counter[i] + cost; SendCriteriaUpdate(ad, i); break; } } if( CanCompleteAchievement(ad) ) EventAchievementEarned(ad); } }
void AchievementMgr::SetCriteriaProgress(AchievementCriteriaEntry const* entry, uint32 newValue, bool relative) { sLog.outDetail("AchievementMgr::SetCriteriaProgress(%u, %u)", entry->ID, newValue); CriteriaProgress *progress = NULL; CriteriaProgressMap::iterator iter = m_criteriaProgress.find(entry->ID); if(iter == m_criteriaProgress.end()) { progress = &m_criteriaProgress[entry->ID]; progress->counter = newValue; progress->date = time(NULL); } else { progress = &iter->second; if(relative) newValue += progress->counter; if(progress->counter == newValue) return; progress->counter = newValue; } progress->changed = true; if(entry->timeLimit) { time_t now = time(NULL); if(progress->date + entry->timeLimit < now) { progress->counter = 1; } // also it seems illogical, the timeframe will be extended at every criteria update progress->date = now; } SendCriteriaUpdate(entry->ID,progress); }
void AchievementInterface::HandleAchievementCriteriaConditionDeath() { // We died, so reset all our achievements that have ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH if( !m_achivementDataMap.size() ) return; map<uint32,AchievementData*>::iterator itr = m_achivementDataMap.begin(); for(; itr != m_achivementDataMap.end(); ++itr) { AchievementData * ad = itr->second; if(ad->completed) continue; AchievementEntry * ae = dbcAchievement.LookupEntry( ad->id ); for(uint32 i = 0; i < ad->num_criterias; ++i) { uint32 CriteriaID = ae->AssociatedCriteria[i]; AchievementCriteriaEntry * ace = dbcAchivementCriteria.LookupEntry( CriteriaID ); if( ad->counter[i] && ace->raw.additionalRequirement1_type & ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH ) { ad->counter[i] = 0; SendCriteriaUpdate(ad, i); break; } } } }
void AchievementInterface::HandleAchievementCriteriaLevelUp(uint32 level) { AchievementCriteriaMap::iterator itr = objmgr.m_achievementCriteriaMap.find( ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL ); if(itr == objmgr.m_achievementCriteriaMap.end()) return; AchievementCriteriaSet * acs = itr->second; if( !acs ) // We have no achievements for this criteria :( return; AchievementCriteriaSet::iterator citr = acs->begin(); for(; citr != acs->end(); ++citr) { AchievementCriteriaEntry * ace = (*citr); uint32 AchievementID = ace->referredAchievement; uint32 ReqLevel = ace->reach_level.level; AchievementEntry * pAchievementEntry = dbcAchievement.LookupEntryForced(AchievementID); if(!pAchievementEntry) continue; if( level < ReqLevel ) continue; // Realm first to 80 stuff has race and class requirements. Let the hacking begin. if( string(pAchievementEntry->name).find("Realm First!") != string::npos ) { static const char* classNames[] = { "", "Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Death Knight", "Shaman", "Mage", "Warlock", "", "Druid" }; static const char* raceNames[] = { "", "Human", "Orc", "Dwarf", "Night Elf", "Forsaken", "Tauren", "Gnome", "Troll", "", "Blood Elf", "Draenei" }; uint32 ReqClass = 0; uint32 ReqRace = 0; for(uint32 i = 0; i < 12; ++i) { if(strlen(classNames[i]) > 0 && string(pAchievementEntry->name).find(classNames[i]) != string::npos ) { // We require this class ReqClass = i; break; } } for(uint32 i = 0; i < 12; ++i) { if(strlen(raceNames[i]) > 0 && string(pAchievementEntry->name).find(raceNames[i]) != string::npos ) { // We require this race ReqRace = i; break; } } if( ReqClass && m_player->getClass() != ReqClass ) continue; if( ReqRace && m_player->getRace() != ReqRace ) continue; } AchievementCriteriaEntry * compareCriteria = NULL; AchievementData * ad = GetAchievementDataByAchievementID(AchievementID); if(ad->completed) continue; // Figure out our associative ID. for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) { compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] ); if( compareCriteria == ace ) { ad->counter[i] = m_player->getLevel() > ReqLevel ? ReqLevel : m_player->getLevel(); SendCriteriaUpdate(ad, i); break; } } if( CanCompleteAchievement(ad) ) EventAchievementEarned(ad); } }
void AchievementInterface::HandleAchievementCriteriaWinBattleground(uint32 bgMapId, uint32 scoreMargin, uint32 time, CBattleground* bg) { AchievementCriteriaMap::iterator itr = objmgr.m_achievementCriteriaMap.find( ACHIEVEMENT_CRITERIA_TYPE_WIN_BG ); if(itr == objmgr.m_achievementCriteriaMap.end()) return; AchievementCriteriaSet * acs = itr->second; if( !acs ) // We have no achievements for this criteria :( return; AchievementCriteriaSet::iterator citr = acs->begin(); for(; citr != acs->end(); ++citr) { AchievementCriteriaEntry * ace = (*citr); uint32 AchievementID = ace->referredAchievement; uint32 ReqBGMap = ace->win_bg.bgMapID; uint32 ReqCount = ace->win_bg.winCount; AchievementEntry * pAchievementEntry = dbcAchievement.LookupEntryForced(AchievementID); if(!pAchievementEntry) continue; // Wrong BG, continue on, kids. if( ReqBGMap != bgMapId ) continue; AchievementCriteriaEntry * compareCriteria = NULL; AchievementData * ad = GetAchievementDataByAchievementID(AchievementID); if(ad->completed) continue; ad->completionTimeLast = time; // Figure out our associative ID. for(uint32 i = 0; i < pAchievementEntry->AssociatedCriteriaCount; ++i) { compareCriteria = dbcAchivementCriteria.LookupEntry( pAchievementEntry->AssociatedCriteria[i] ); if( compareCriteria == ace ) { if( compareCriteria->raw.additionalRequirement1_type && scoreMargin < compareCriteria->raw.additionalRequirement1_type ) // BG Score Requirement. continue; // AV stuff :P if( bg->GetType() == BATTLEGROUND_ALTERAC_VALLEY ) { AlteracValley* pAV(TO_ALTERACVALLEY(bg)); if( pAchievementEntry->ID == 225 || pAchievementEntry->ID == 1164) // AV: Everything Counts { continue; // We do not support mines yet in AV } if( pAchievementEntry->ID == 220 ) // AV: Stormpike Perfection { bool failure = false; // We must control all Alliance nodes and Horde nodes (towers only) for(uint32 i = 0; i < AV_NUM_CONTROL_POINTS; ++i) { if( pAV->GetNode(i)->IsGraveyard() ) continue; if( pAV->GetNode(i)->GetState() != AV_NODE_STATE_ALLIANCE_CONTROLLED ) failure = true; } if( failure ) continue; } if( pAchievementEntry->ID == 873 ) // AV: Frostwolf Perfection { bool failure = false; // We must control all Alliance nodes and Horde nodes (towers only) for(uint32 i = 0; i < AV_NUM_CONTROL_POINTS; ++i) { if( pAV->GetNode(i)->IsGraveyard() ) continue; if( pAV->GetNode(i)->GetState() != AV_NODE_STATE_HORDE_CONTROLLED ) failure = true; } if( failure ) continue; } } ad->counter[i] = ad->counter[i] + 1; SendCriteriaUpdate(ad, i); break; } } if( CanCompleteAchievement(ad) ) EventAchievementEarned(ad); } }