mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 10:37:02 +00:00
[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:
parent
b09df0aade
commit
18ec7c8011
4 changed files with 68 additions and 18 deletions
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue