aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Reputation/ReputationMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Reputation/ReputationMgr.cpp')
-rw-r--r--src/server/game/Reputation/ReputationMgr.cpp139
1 files changed, 93 insertions, 46 deletions
diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp
index c289357654d..3c8a3be12af 100644
--- a/src/server/game/Reputation/ReputationMgr.cpp
+++ b/src/server/game/Reputation/ReputationMgr.cpp
@@ -19,6 +19,7 @@
#include "DatabaseEnv.h"
#include "DBCStores.h"
#include "Log.h"
+#include "MapUtils.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "ScriptMgr.h"
@@ -26,21 +27,47 @@
#include "WorldPacket.h"
#include "WorldSession.h"
-const int32 ReputationMgr::PointsInRank[MAX_REPUTATION_RANK] = {36000, 3000, 3000, 3000, 6000, 12000, 21000, 1000};
+std::set<int32> const ReputationMgr::ReputationRankThresholds =
+{
+ -42000,
+ // Hated
+ -6000,
+ // Hostile
+ -3000,
+ // Unfriendly
+ 0,
+ // Neutral
+ 3000,
+ // Friendly
+ 9000,
+ // Honored
+ 21000,
+ // Revered
+ 42000,
+ // Exalted
+ 43000
+};
const int32 ReputationMgr::Reputation_Cap = 42999;
const int32 ReputationMgr::Reputation_Bottom = -42000;
-ReputationRank ReputationMgr::ReputationToRank(int32 standing)
+ReputationRank ReputationMgr::ReputationToRank(FactionEntry const* /*factionEntry*/, int32 standing)
{
- int32 limit = Reputation_Cap + 1;
- for (int i = MAX_REPUTATION_RANK-1; i >= MIN_REPUTATION_RANK; --i)
+ auto itr = ReputationRankThresholds.begin();
+ auto end = ReputationRankThresholds.end();
+ int32 rank = -1;
+ while (itr != end && standing >= *itr)
{
- limit -= PointsInRank[i];
- if (standing >= limit)
- return ReputationRank(i);
+ ++rank;
+ ++itr;
}
- return MIN_REPUTATION_RANK;
+
+ return ReputationRank(rank);
+}
+
+FactionState const* ReputationMgr::GetState(FactionEntry const* factionEntry) const
+{
+ return factionEntry->CanHaveReputation() ? GetState(factionEntry->ReputationIndex) : nullptr;
}
bool ReputationMgr::IsAtWar(uint32 faction_id) const
@@ -96,24 +123,21 @@ int32 ReputationMgr::GetReputation(uint32 faction_id) const
int32 ReputationMgr::GetBaseReputation(FactionEntry const* factionEntry) const
{
- if (!factionEntry)
+ int32 dataIndex = GetFactionDataIndexForRaceAndClass(factionEntry);
+ if (dataIndex < 0)
return 0;
- uint32 raceMask = _player->GetRaceMask();
- uint32 classMask = _player->GetClassMask();
- for (int i=0; i < 4; i++)
- {
- if ((factionEntry->ReputationRaceMask[i] & raceMask ||
- (factionEntry->ReputationRaceMask[i] == 0 &&
- factionEntry->ReputationClassMask[i] != 0)) &&
- (factionEntry->ReputationClassMask[i] & classMask ||
- factionEntry->ReputationClassMask[i] == 0))
+ return factionEntry->ReputationBase[dataIndex];
+}
- return factionEntry->ReputationBase[i];
- }
+int32 ReputationMgr::GetMinReputation(FactionEntry const* /*factionEntry*/) const
+{
+ return Reputation_Bottom;
+}
- // in faction.dbc exist factions with (RepListId >=0, listed in character reputation list) with all ReputationRaceMask[i] == 0
- return 0;
+int32 ReputationMgr::GetMaxReputation(FactionEntry const* /*factionEntry*/) const
+{
+ return Reputation_Cap;
}
int32 ReputationMgr::GetReputation(FactionEntry const* factionEntry) const
@@ -131,13 +155,29 @@ int32 ReputationMgr::GetReputation(FactionEntry const* factionEntry) const
ReputationRank ReputationMgr::GetRank(FactionEntry const* factionEntry) const
{
int32 reputation = GetReputation(factionEntry);
- return ReputationToRank(reputation);
+ return ReputationToRank(factionEntry, reputation);
}
ReputationRank ReputationMgr::GetBaseRank(FactionEntry const* factionEntry) const
{
int32 reputation = GetBaseReputation(factionEntry);
- return ReputationToRank(reputation);
+ return ReputationToRank(factionEntry, reputation);
+}
+
+std::string ReputationMgr::GetReputationRankName(FactionEntry const* factionEntry) const
+{
+ ReputationRank rank = GetRank(factionEntry);
+ return sObjectMgr->GetTrinityString(ReputationRankStrIndex[rank], _player->GetSession()->GetSessionDbcLocale());
+}
+
+ReputationRank const* ReputationMgr::GetForcedRankIfAny(FactionTemplateEntry const* factionTemplateEntry) const
+{
+ return GetForcedRankIfAny(factionTemplateEntry->Faction);
+}
+
+ReputationRank const* ReputationMgr::GetForcedRankIfAny(uint32 factionId) const
+{
+ return Trinity::Containers::MapGetValuePtr(_forcedReactions, factionId);
}
void ReputationMgr::ApplyForceReaction(uint32 faction_id, ReputationRank rank, bool apply)
@@ -150,22 +190,11 @@ void ReputationMgr::ApplyForceReaction(uint32 faction_id, ReputationRank rank, b
uint32 ReputationMgr::GetDefaultStateFlags(FactionEntry const* factionEntry) const
{
- if (!factionEntry)
+ int32 dataIndex = GetFactionDataIndexForRaceAndClass(factionEntry);
+ if (dataIndex < 0)
return 0;
- uint32 raceMask = _player->GetRaceMask();
- uint32 classMask = _player->GetClassMask();
- for (int i=0; i < 4; i++)
- {
- if ((factionEntry->ReputationRaceMask[i] & raceMask ||
- (factionEntry->ReputationRaceMask[i] == 0 &&
- factionEntry->ReputationClassMask[i] != 0)) &&
- (factionEntry->ReputationClassMask[i] & classMask ||
- factionEntry->ReputationClassMask[i] == 0))
-
- return factionEntry->ReputationFlags[i];
- }
- return 0;
+ return factionEntry->ReputationFlags[dataIndex];
}
void ReputationMgr::SendForceReactions()
@@ -385,13 +414,13 @@ bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, in
standing += itr->second.Standing + BaseRep;
}
- if (standing > Reputation_Cap)
- standing = Reputation_Cap;
- else if (standing < Reputation_Bottom)
- standing = Reputation_Bottom;
+ if (standing > GetMaxReputation(factionEntry))
+ standing = GetMaxReputation(factionEntry);
+ else if (standing < GetMinReputation(factionEntry))
+ standing = GetMinReputation(factionEntry);
- ReputationRank old_rank = ReputationToRank(itr->second.Standing + BaseRep);
- ReputationRank new_rank = ReputationToRank(standing);
+ ReputationRank old_rank = ReputationToRank(factionEntry, itr->second.Standing + BaseRep);
+ ReputationRank new_rank = ReputationToRank(factionEntry, standing);
itr->second.Standing = standing - BaseRep;
itr->second.needSend = true;
@@ -547,8 +576,8 @@ void ReputationMgr::LoadFromDB(PreparedQueryResult result)
// update counters
int32 BaseRep = GetBaseReputation(factionEntry);
- ReputationRank old_rank = ReputationToRank(BaseRep);
- ReputationRank new_rank = ReputationToRank(BaseRep + faction->Standing);
+ ReputationRank old_rank = ReputationToRank(factionEntry, BaseRep);
+ ReputationRank new_rank = ReputationToRank(factionEntry, BaseRep + faction->Standing);
UpdateRankCounters(old_rank, new_rank);
uint32 dbFactionFlags = fields[2].GetUInt16();
@@ -623,3 +652,21 @@ void ReputationMgr::UpdateRankCounters(ReputationRank old_rank, ReputationRank n
if (new_rank >= REP_HONORED)
++_honoredFactionCount;
}
+
+int32 ReputationMgr::GetFactionDataIndexForRaceAndClass(FactionEntry const* factionEntry) const
+{
+ if (!factionEntry)
+ return -1;
+
+ uint32 raceMask = _player->GetRaceMask();
+ uint32 classMask = _player->GetClassMask();
+ for (int32 i = 0; i < 4; i++)
+ {
+ if ((factionEntry->ReputationRaceMask[i] & raceMask || (!factionEntry->ReputationRaceMask[i] && factionEntry->ReputationClassMask[i] != 0))
+ && (factionEntry->ReputationClassMask[i] & classMask || factionEntry->ReputationClassMask[i] == 0))
+
+ return i;
+ }
+
+ return -1;
+}