[7547] Improvments in reputation achievements implememtaion.

* Speedup achievement checks at reputation updates.
* Implement
  - ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION
  - ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION
  - ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS
This commit is contained in:
VladimirMangos 2009-03-26 20:33:09 +03:00
parent b09df0aade
commit 18ec7c8011
4 changed files with 68 additions and 18 deletions

View file

@ -762,18 +762,7 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
} }
case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION: case ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION:
{ {
// skip faction check only at loading SetCriteriaProgress(achievementCriteria, GetPlayer()->GetReputationMgr().GetExaltedFactionCount());
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);
break; break;
} }
case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP: case ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP:
@ -866,6 +855,15 @@ void AchievementMgr::UpdateAchievementCriteria(AchievementCriteriaTypes type, ui
SetCriteriaProgress(achievementCriteria, spellCount); SetCriteriaProgress(achievementCriteria, spellCount);
break; 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: case ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2:
{ {
if (!miscvalue1 || miscvalue1 != achievementCriteria->cast_spell.spellID) 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_CREATE_AUCTION:
case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS: case ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED: 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_LOOT_EPIC_ITEM:
case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM: case ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM:
case ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED: 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_GOLD_SPENT_FOR_MAIL:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD: 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_HEALTH:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER:
case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR: case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_ARMOR:

View file

@ -198,6 +198,10 @@ void ReputationMgr::SendVisible(FactionState const* faction) const
void ReputationMgr::Initilize() void ReputationMgr::Initilize()
{ {
m_factions.clear(); m_factions.clear();
m_visibleFactionCount = 0;
m_honoredFactionCount = 0;
m_reveredFactionCount = 0;
m_exaltedFactionCount = 0;
for(unsigned int i = 1; i < sFactionStore.GetNumRows(); i++) for(unsigned int i = 1; i < sFactionStore.GetNumRows(); i++)
{ {
@ -212,6 +216,11 @@ void ReputationMgr::Initilize()
newFaction.Flags = GetDefaultStateFlags(factionEntry); newFaction.Flags = GetDefaultStateFlags(factionEntry);
newFaction.Changed = true; newFaction.Changed = true;
if( newFaction.Flags & FACTION_FLAG_VISIBLE )
++m_visibleFactionCount;
UpdateRankCounters(REP_HOSTILE,GetBaseRank(factionEntry));
m_factions[newFaction.ReputationListID] = newFaction; m_factions[newFaction.ReputationListID] = newFaction;
} }
} }
@ -250,19 +259,27 @@ bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, in
else if (standing < Reputation_Bottom) else if (standing < Reputation_Bottom)
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.Standing = standing - BaseRep;
itr->second.Changed = true; itr->second.Changed = true;
SetVisible(&itr->second); SetVisible(&itr->second);
if(ReputationToRank(standing) <= REP_HOSTILE) if(new_rank <= REP_HOSTILE)
SetAtWar(&itr->second,true); SetAtWar(&itr->second,true);
SendState(&itr->second); SendState(&itr->second);
UpdateRankCounters(old_rank, new_rank);
m_player->ReputationChanged(factionEntry); 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_REPUTATION, factionEntry->ID);
m_player->GetAchievementMgr().UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_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; return true;
} }
@ -303,6 +320,8 @@ void ReputationMgr::SetVisible(FactionState* faction)
faction->Flags |= FACTION_FLAG_VISIBLE; faction->Flags |= FACTION_FLAG_VISIBLE;
faction->Changed = true; faction->Changed = true;
++m_visibleFactionCount;
SendVisible(faction); SendVisible(faction);
} }
@ -385,6 +404,12 @@ void ReputationMgr::LoadFromDB(QueryResult *result)
// update standing to current // update standing to current
faction->Standing = int32(fields[1].GetUInt32()); 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(); uint32 dbFactionFlags = fields[2].GetUInt32();
if( dbFactionFlags & FACTION_FLAG_VISIBLE ) if( dbFactionFlags & FACTION_FLAG_VISIBLE )
@ -431,3 +456,20 @@ void ReputationMgr::SaveToDB()
} }
CharacterDatabase.CommitTransaction(); 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;
}

View file

@ -56,7 +56,8 @@ class QueryResult;
class ReputationMgr class ReputationMgr
{ {
public: // constructors and global modifiers 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() {} ~ReputationMgr() {}
void SaveToDB(); void SaveToDB();
@ -68,6 +69,11 @@ class ReputationMgr
static ReputationRank ReputationToRank(int32 standing); static ReputationRank ReputationToRank(int32 standing);
public: // accessors 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; } FactionStateList const& GetStateList() const { return m_factions; }
FactionState const* GetState(FactionEntry const* factionEntry) const FactionState const* GetState(FactionEntry const* factionEntry) const
@ -131,6 +137,10 @@ class ReputationMgr
Player* m_player; Player* m_player;
FactionStateList m_factions; FactionStateList m_factions;
ForcedReactions m_forcedReactions; ForcedReactions m_forcedReactions;
uint8 m_visibleFactionCount :8;
uint8 m_honoredFactionCount :8;
uint8 m_reveredFactionCount :8;
uint8 m_exaltedFactionCount :8;
}; };
#endif #endif

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "7546" #define REVISION_NR "7547"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__