diff --git a/src/game/AchievementMgr.cpp b/src/game/AchievementMgr.cpp index 3e570fcb1..efe3ada1d 100644 --- a/src/game/AchievementMgr.cpp +++ b/src/game/AchievementMgr.cpp @@ -762,18 +762,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui } case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION: { - // skip faction check only at loading - if (miscvalue1 && GetPlayer()->GetReputationRank(miscvalue1) < REP_EXALTED) - continue; - - uint32 counter = 0; - FactionStateList const& factionStateList = GetPlayer()->GetReputationMgr().GetStateList(); - for (FactionStateList::const_iterator iter = factionStateList.begin(); iter!= factionStateList.end(); ++iter) - if(FactionEntry const *factionEntry = sFactionStore.LookupEntry(iter->second.ID)) - if(ReputationMgr::ReputationToRank(iter->second.Standing + GetPlayer()->GetReputationMgr().GetBaseReputation(factionEntry)) >= REP_EXALTED) - ++counter; - - SetCriteriaProgress(achievementCriteria, counter); + SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetExaltedFactionCount()); break; } case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP: @@ -866,6 +855,15 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui SetCriteriaProgress(achievementCriteria, spellCount); break; } + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION: + SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetReveredFactionCount()); + break; + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION: + SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetHonoredFactionCount()); + break; + case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS: + SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetVisibleFactionCount()); + break; case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2: { if (!miscvalue1 || miscvalue1 != achievementCriteria->cast_spell.spellID) @@ -930,9 +928,6 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui case ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION: case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED: - case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION: - case ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION: - case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS: case ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED: @@ -1067,6 +1062,9 @@ bool AchievementMgr::IsCompletedCriteria(AchievementCriteriaEntry const* achieve case ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION: + case ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION: + case ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALTH: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR: diff --git a/src/game/ReputationMgr.cpp b/src/game/ReputationMgr.cpp index 354389279..0ff702010 100644 --- a/src/game/ReputationMgr.cpp +++ b/src/game/ReputationMgr.cpp @@ -198,6 +198,10 @@ void ReputationMgr::SendVisible(FactionState const* faction) const void ReputationMgr::Initilize() { m_factions.clear(); + m_visibleFactionCount = 0; + m_honoredFactionCount = 0; + m_reveredFactionCount = 0; + m_exaltedFactionCount = 0; for(unsigned int i = 1; i < sFactionStore.GetNumRows(); i++) { @@ -212,6 +216,11 @@ void ReputationMgr::Initilize() newFaction.Flags = GetDefaultStateFlags(factionEntry); newFaction.Changed = true; + if( newFaction.Flags & FACTION_FLAG_VISIBLE ) + ++m_visibleFactionCount; + + UpdateRankCounters(REP_HOSTILE,GetBaseRank(factionEntry)); + m_factions[newFaction.ReputationListID] = newFaction; } } @@ -250,19 +259,27 @@ bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, in else if (standing < Reputation_Bottom) standing = Reputation_Bottom; + ReputationRank old_rank = ReputationToRank(itr->second.Standing + BaseRep); + ReputationRank new_rank = ReputationToRank(standing); + itr->second.Standing = standing - BaseRep; itr->second.Changed = true; SetVisible(&itr->second); - if(ReputationToRank(standing) <= REP_HOSTILE) + if(new_rank <= REP_HOSTILE) SetAtWar(&itr->second,true); SendState(&itr->second); + UpdateRankCounters(old_rank, new_rank); + m_player->ReputationChanged(factionEntry); + m_player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS, factionEntry->ID); m_player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION, factionEntry->ID); m_player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION,factionEntry->ID); + m_player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION,factionEntry->ID); + m_player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION,factionEntry->ID); return true; } @@ -303,6 +320,8 @@ void ReputationMgr::SetVisible(FactionState* faction) faction->Flags |= FACTION_FLAG_VISIBLE; faction->Changed = true; + ++m_visibleFactionCount; + SendVisible(faction); } @@ -385,6 +404,12 @@ void ReputationMgr::LoadFromDB(QueryResult *result) // update standing to current faction->Standing = int32(fields[1].GetUInt32()); + // update counters + int32 BaseRep = GetBaseReputation(factionEntry); + ReputationRank old_rank = ReputationToRank(BaseRep); + ReputationRank new_rank = ReputationToRank(BaseRep + faction->Standing); + UpdateRankCounters(old_rank,new_rank); + uint32 dbFactionFlags = fields[2].GetUInt32(); if( dbFactionFlags & FACTION_FLAG_VISIBLE ) @@ -431,3 +456,20 @@ void ReputationMgr::SaveToDB() } CharacterDatabase.CommitTransaction(); } + +void ReputationMgr::UpdateRankCounters( ReputationRank old_rank, ReputationRank new_rank ) +{ + if(old_rank >= REP_EXALTED) + --m_exaltedFactionCount; + if(old_rank >= REP_REVERED) + --m_reveredFactionCount; + if(old_rank >= REP_HONORED) + --m_honoredFactionCount; + + if(new_rank >= REP_EXALTED) + ++m_exaltedFactionCount; + if(new_rank >= REP_REVERED) + ++m_reveredFactionCount; + if(new_rank >= REP_HONORED) + ++m_honoredFactionCount; +} \ No newline at end of file diff --git a/src/game/ReputationMgr.h b/src/game/ReputationMgr.h index 99a1361ab..cb4c85fd5 100644 --- a/src/game/ReputationMgr.h +++ b/src/game/ReputationMgr.h @@ -56,7 +56,8 @@ class QueryResult; class ReputationMgr { public: // constructors and global modifiers - explicit ReputationMgr(Player* owner) : m_player(owner) {} + explicit ReputationMgr(Player* owner) : m_player(owner), + m_visibleFactionCount(0), m_honoredFactionCount(0), m_reveredFactionCount(0), m_exaltedFactionCount(0) {} ~ReputationMgr() {} void SaveToDB(); @@ -68,6 +69,11 @@ class ReputationMgr static ReputationRank ReputationToRank(int32 standing); public: // accessors + uint8 GetVisibleFactionCount() const { return m_visibleFactionCount; } + uint8 GetHonoredFactionCount() const { return m_honoredFactionCount; } + uint8 GetReveredFactionCount() const { return m_reveredFactionCount; } + uint8 GetExaltedFactionCount() const { return m_exaltedFactionCount; } + FactionStateList const& GetStateList() const { return m_factions; } FactionState const* GetState(FactionEntry const* factionEntry) const @@ -131,6 +137,10 @@ class ReputationMgr Player* m_player; FactionStateList m_factions; ForcedReactions m_forcedReactions; + uint8 m_visibleFactionCount :8; + uint8 m_honoredFactionCount :8; + uint8 m_reveredFactionCount :8; + uint8 m_exaltedFactionCount :8; }; #endif diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 667d32207..00681e776 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7546" + #define REVISION_NR "7547" #endif // __REVISION_NR_H__