Skip to content

Commit

Permalink
Slight ReputationMgr modernization
Browse files Browse the repository at this point in the history
* Move longer method implementations into .cpp
* Additional pointer safety
* Add query method for player's "At War" preference
  • Loading branch information
Warlockbugs committed Jun 26, 2017
1 parent ed28337 commit 57519f0
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 29 deletions.
2 changes: 1 addition & 1 deletion src/game/Chat/Level2.cpp
Expand Up @@ -1565,7 +1565,7 @@ bool ChatHandler::HandleModifyRepCommand(char* args)
return false;
}

if (factionEntry->reputationListID < 0)
if (!factionEntry->HasReputation())
{
PSendSysMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name[GetSessionDbcLocale()], factionId);
SetSentErrorMessage(true);
Expand Down
83 changes: 70 additions & 13 deletions src/game/Reputation/ReputationMgr.cpp
Expand Up @@ -36,6 +36,17 @@ ReputationRank ReputationMgr::ReputationToRank(int32 standing)
return MIN_REPUTATION_RANK;
}

FactionState const* ReputationMgr::GetState(FactionEntry const* factionEntry) const
{
return (factionEntry && factionEntry->HasReputation()) ? GetState(RepListID(factionEntry->reputationListID)) : nullptr;
}

FactionState const* ReputationMgr::GetState(RepListID id) const
{
FactionStateList::const_iterator repItr = m_factions.find(id);
return repItr != m_factions.end() ? &repItr->second : nullptr;
}

int32 ReputationMgr::GetReputation(uint32 faction_id) const
{
FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id);
Expand All @@ -49,6 +60,17 @@ int32 ReputationMgr::GetReputation(uint32 faction_id) const
return GetReputation(factionEntry);
}

int32 ReputationMgr::GetReputation(FactionEntry const* factionEntry) const
{
if (!factionEntry)
return 0;

if (FactionState const* state = GetState(factionEntry))
return GetBaseReputation(factionEntry) + state->Standing;

return 0;
}

int32 ReputationMgr::GetBaseReputation(FactionEntry const* factionEntry) const
{
if (!factionEntry)
Expand All @@ -62,16 +84,28 @@ int32 ReputationMgr::GetBaseReputation(FactionEntry const* factionEntry) const
return idx >= 0 ? factionEntry->BaseRepValue[idx] : 0;
}

int32 ReputationMgr::GetReputation(FactionEntry const* factionEntry) const
bool ReputationMgr::IsAtWar(uint32 faction_id) const
{
// Faction without recorded reputation. Just ignore.
FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id);

if (!factionEntry)
return 0;
{
sLog.outError("ReputationMgr::IsAtWar: Can't get state of 'At War' flag of %s for unknown faction (faction id) #%u.", m_player->GetName(), faction_id);
return false;
}

return IsAtWar(factionEntry);
}

bool ReputationMgr::IsAtWar(FactionEntry const* factionEntry) const
{
if (!factionEntry)
return false;

if (FactionState const* state = GetState(factionEntry))
return GetBaseReputation(factionEntry) + state->Standing;
return (state->Flags & FACTION_FLAG_AT_WAR);

return 0;
return false;
}

ReputationRank ReputationMgr::GetRank(FactionEntry const* factionEntry) const
Expand All @@ -86,6 +120,15 @@ ReputationRank ReputationMgr::GetBaseRank(FactionEntry const* factionEntry) cons
return ReputationToRank(reputation);
}

ReputationRank const* ReputationMgr::GetForcedRankIfAny(FactionTemplateEntry const* factionTemplateEntry) const
{
if (!factionTemplateEntry)
return nullptr;

ForcedReactions::const_iterator forceItr = m_forcedReactions.find(factionTemplateEntry->faction);
return forceItr != m_forcedReactions.end() ? &forceItr->second : nullptr;
}

void ReputationMgr::ApplyForceReaction(uint32 faction_id, ReputationRank rank, bool apply)
{
if (apply)
Expand Down Expand Up @@ -212,7 +255,7 @@ void ReputationMgr::Initialize()
{
FactionEntry const* factionEntry = sFactionStore.LookupEntry(i);

if (factionEntry && (factionEntry->reputationListID >= 0))
if (factionEntry && (factionEntry->HasReputation()))
{
FactionState newFaction;
newFaction.ID = factionEntry->ID;
Expand All @@ -234,8 +277,10 @@ void ReputationMgr::Initialize()

void ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standing, bool incremental)
{
bool anyRankIncreased = false;
if (!factionEntry)
return;

bool anyRankIncreased = false;
// if spillover definition exists in DB, override DBC
if (const RepSpilloverTemplate* repTemplate = sObjectMgr.GetRepSpilloverTemplate(factionEntry->ID))
{
Expand Down Expand Up @@ -296,7 +341,7 @@ void ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi
}
}
// spillover done, update faction itself
FactionStateList::iterator faction = m_factions.find(factionEntry->reputationListID);
FactionStateList::iterator faction = m_factions.find(RepListID(factionEntry->reputationListID));
if (faction != m_factions.end())
{
if (SetOneFactionReputation(factionEntry, standing, incremental))
Expand All @@ -309,7 +354,10 @@ void ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi

bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, int32 standing, bool incremental)
{
FactionStateList::iterator itr = m_factions.find(factionEntry->reputationListID);
if (!factionEntry)
return false;

FactionStateList::iterator itr = m_factions.find(RepListID(factionEntry->reputationListID));
if (itr != m_factions.end())
{
FactionState& faction = itr->second;
Expand Down Expand Up @@ -354,7 +402,7 @@ bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, in

void ReputationMgr::SetVisible(FactionTemplateEntry const* factionTemplateEntry)
{
if (!factionTemplateEntry->faction)
if (!factionTemplateEntry || !factionTemplateEntry->faction)
return;

if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
Expand All @@ -363,10 +411,10 @@ void ReputationMgr::SetVisible(FactionTemplateEntry const* factionTemplateEntry)

void ReputationMgr::SetVisible(FactionEntry const* factionEntry)
{
if (factionEntry->reputationListID < 0)
if (!factionEntry || !factionEntry->HasReputation())
return;

FactionStateList::iterator itr = m_factions.find(factionEntry->reputationListID);
FactionStateList::iterator itr = m_factions.find(RepListID(factionEntry->reputationListID));
if (itr == m_factions.end())
return;

Expand All @@ -375,6 +423,9 @@ void ReputationMgr::SetVisible(FactionEntry const* factionEntry)

void ReputationMgr::SetVisible(FactionState* faction)
{
if (!faction)
return;

// always invisible or hidden faction can't be make visible
if (faction->Flags & (FACTION_FLAG_INVISIBLE_FORCED | FACTION_FLAG_HIDDEN))
return;
Expand Down Expand Up @@ -407,6 +458,9 @@ void ReputationMgr::SetAtWar(RepListID repListID, bool on)

void ReputationMgr::SetAtWar(FactionState* faction, bool atWar)
{
if (!faction)
return;

// not allow declare war to faction unless already hated or less
if (atWar && (faction->Flags & FACTION_FLAG_PEACE_FORCED) && ReputationToRank(faction->Standing) > REP_HATED)
return;
Expand Down Expand Up @@ -435,6 +489,9 @@ void ReputationMgr::SetInactive(RepListID repListID, bool on)

void ReputationMgr::SetInactive(FactionState* faction, bool inactive)
{
if (!faction)
return;

// always invisible or hidden faction can't be inactive
if (inactive && ((faction->Flags & (FACTION_FLAG_INVISIBLE_FORCED | FACTION_FLAG_HIDDEN)) || !(faction->Flags & FACTION_FLAG_VISIBLE)))
return;
Expand Down Expand Up @@ -466,7 +523,7 @@ void ReputationMgr::LoadFromDB(QueryResult* result)
Field* fields = result->Fetch();

FactionEntry const* factionEntry = sFactionStore.LookupEntry(fields[0].GetUInt32());
if (factionEntry && (factionEntry->reputationListID >= 0))
if (factionEntry && factionEntry->HasReputation())
{
FactionState* faction = &m_factions[factionEntry->reputationListID];

Expand Down
21 changes: 6 additions & 15 deletions src/game/Reputation/ReputationMgr.h
Expand Up @@ -78,29 +78,20 @@ class ReputationMgr

FactionStateList const& GetStateList() const { return m_factions; }

FactionState const* GetState(FactionEntry const* factionEntry) const
{
return factionEntry->reputationListID >= 0 ? GetState(factionEntry->reputationListID) : nullptr;
}

FactionState const* GetState(RepListID id) const
{
FactionStateList::const_iterator repItr = m_factions.find(id);
return repItr != m_factions.end() ? &repItr->second : nullptr;
}
FactionState const* GetState(FactionEntry const* factionEntry) const;
FactionState const* GetState(RepListID id) const;

int32 GetReputation(uint32 faction_id) const;
int32 GetReputation(FactionEntry const* factionEntry) const;
int32 GetBaseReputation(FactionEntry const* factionEntry) const;

bool IsAtWar(uint32 faction_id) const;
bool IsAtWar(FactionEntry const* factionEntry) const;

ReputationRank GetRank(FactionEntry const* factionEntry) const;
ReputationRank GetBaseRank(FactionEntry const* factionEntry) const;

ReputationRank const* GetForcedRankIfAny(FactionTemplateEntry const* factionTemplateEntry) const
{
ForcedReactions::const_iterator forceItr = m_forcedReactions.find(factionTemplateEntry->faction);
return forceItr != m_forcedReactions.end() ? &forceItr->second : nullptr;
}
ReputationRank const* GetForcedRankIfAny(FactionTemplateEntry const* factionTemplateEntry) const;

public: // modifiers
void SetReputation(FactionEntry const* factionEntry, int32 standing)
Expand Down
1 change: 1 addition & 0 deletions src/game/Server/DBCStructure.h
Expand Up @@ -915,6 +915,7 @@ struct FactionEntry

return -1;
}
bool HasReputation() const { return reputationListID >= 0; }
};

/*
Expand Down

0 comments on commit 57519f0

Please sign in to comment.