diff options
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Reputation/ReputationMgr.cpp | 64 | ||||
-rw-r--r-- | src/server/game/Reputation/ReputationMgr.h | 32 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_character.cpp | 12 | ||||
-rw-r--r-- | src/server/scripts/Commands/cs_lookup.cpp | 12 |
5 files changed, 64 insertions, 58 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index b488ee6d8e5..8369422829f 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2959,7 +2959,7 @@ bool WorldObject::IsValidAttackTarget(WorldObject const* target, SpellInfo const if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate))) if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->Faction)) if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry)) - if (!(repState->Flags & FACTION_FLAG_AT_WAR)) + if (!repState->Flags.HasFlag(ReputationFlags::AtWar)) return false; } diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index 3c8a3be12af..2adf518faaf 100644 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -89,7 +89,7 @@ bool ReputationMgr::IsAtWar(FactionEntry const* factionEntry) const return false; if (FactionState const* factionState = GetState(factionEntry)) - return (factionState->Flags & FACTION_FLAG_AT_WAR) != 0; + return factionState->Flags.HasFlag(ReputationFlags::AtWar); return false; } @@ -188,13 +188,13 @@ void ReputationMgr::ApplyForceReaction(uint32 faction_id, ReputationRank rank, b _forcedReactions.erase(faction_id); } -uint32 ReputationMgr::GetDefaultStateFlags(FactionEntry const* factionEntry) const +ReputationFlags ReputationMgr::GetDefaultStateFlags(FactionEntry const* factionEntry) const { int32 dataIndex = GetFactionDataIndexForRaceAndClass(factionEntry); if (dataIndex < 0) - return 0; + return ReputationFlags::None; - return factionEntry->ReputationFlags[dataIndex]; + return static_cast<ReputationFlags>(factionEntry->ReputationFlags[dataIndex]); } void ReputationMgr::SendForceReactions() @@ -264,7 +264,7 @@ void ReputationMgr::SendInitialReputations() } // fill in encountered data - data << uint8(itr->second.Flags); + data << uint8(itr->second.Flags.AsUnderlyingType()); data << uint32(itr->second.Standing); itr->second.needSend = false; @@ -316,7 +316,7 @@ void ReputationMgr::Initialize() newFaction.needSend = true; newFaction.needSave = true; - if (newFaction.Flags & FACTION_FLAG_VISIBLE) + if (newFaction.Flags.HasFlag(ReputationFlags::Visible)) ++_visibleFactionCount; UpdateRankCounters(REP_HOSTILE, GetBaseRank(factionEntry)); @@ -359,7 +359,7 @@ bool ReputationMgr::SetReputation(FactionEntry const* factionEntry, int32 standi { FactionStateList::iterator parentState = _factions.find(parent->ReputationIndex); // some team factions have own reputation standing, in this case do not spill to other sub-factions - if (parentState != _factions.end() && (parentState->second.Flags & FACTION_FLAG_SPECIAL)) + if (parentState != _factions.end() && parentState->second.Flags.HasFlag(ReputationFlags::HeaderShowsBar)) { SetOneFactionReputation(parent, int32(spillOverRepOut), incremental); } @@ -476,15 +476,17 @@ void ReputationMgr::SetVisible(FactionEntry const* factionEntry) void ReputationMgr::SetVisible(FactionState* faction) { // always invisible or hidden faction can't be make visible - // except if faction has FACTION_FLAG_SPECIAL - if (faction->Flags & (FACTION_FLAG_INVISIBLE_FORCED|FACTION_FLAG_HIDDEN) && !(faction->Flags & FACTION_FLAG_SPECIAL)) + if (faction->Flags.HasFlag(ReputationFlags::Hidden)) + return; + + if (faction->Flags.HasFlag(ReputationFlags::Header) && !faction->Flags.HasFlag(ReputationFlags::HeaderShowsBar)) return; // already set - if (faction->Flags & FACTION_FLAG_VISIBLE) + if (faction->Flags.HasFlag(ReputationFlags::Visible)) return; - faction->Flags |= FACTION_FLAG_VISIBLE; + faction->Flags |= ReputationFlags::Visible; faction->needSend = true; faction->needSave = true; @@ -500,7 +502,7 @@ void ReputationMgr::SetAtWar(RepListID repListID, bool on) return; // always invisible or hidden faction can't change war state - if (itr->second.Flags & (FACTION_FLAG_INVISIBLE_FORCED|FACTION_FLAG_HIDDEN)) + if (itr->second.Flags.HasFlag(ReputationFlags::Hidden | ReputationFlags::Header)) return; SetAtWar(&itr->second, on); @@ -509,17 +511,17 @@ void ReputationMgr::SetAtWar(RepListID repListID, bool on) void ReputationMgr::SetAtWar(FactionState* faction, bool atWar) const { // Do not allow to declare war to our own faction. But allow for rival factions (eg Aldor vs Scryer). - if (atWar && (faction->Flags & FACTION_FLAG_PEACE_FORCED) && !(faction->Flags & FACTION_FLAG_RIVAL) && GetRank(sFactionStore.AssertEntry(faction->ID)) > REP_HATED) + if (atWar && faction->Flags.HasFlag(ReputationFlags::Peaceful) && GetRank(sFactionStore.AssertEntry(faction->ID)) > REP_HATED) return; // already set - if (((faction->Flags & FACTION_FLAG_AT_WAR) != 0) == atWar) + if (faction->Flags.HasFlag(ReputationFlags::AtWar) == atWar) return; if (atWar) - faction->Flags |= FACTION_FLAG_AT_WAR; + faction->Flags |= ReputationFlags::AtWar; else - faction->Flags &= ~FACTION_FLAG_AT_WAR; + faction->Flags &= ~ReputationFlags::AtWar; faction->needSend = true; faction->needSave = true; @@ -537,17 +539,17 @@ void ReputationMgr::SetInactive(RepListID repListID, bool on) void ReputationMgr::SetInactive(FactionState* faction, bool inactive) const { // 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))) + if (faction->Flags.HasFlag(ReputationFlags::Hidden | ReputationFlags::Header) || !faction->Flags.HasFlag(ReputationFlags::Visible)) return; // already set - if (((faction->Flags & FACTION_FLAG_INACTIVE) != 0) == inactive) + if (faction->Flags.HasFlag(ReputationFlags::Inactive) == inactive) return; if (inactive) - faction->Flags |= FACTION_FLAG_INACTIVE; + faction->Flags |= ReputationFlags::Inactive; else - faction->Flags &= ~FACTION_FLAG_INACTIVE; + faction->Flags &= ~ReputationFlags::Inactive; faction->needSend = true; faction->needSave = true; @@ -580,21 +582,21 @@ void ReputationMgr::LoadFromDB(PreparedQueryResult result) ReputationRank new_rank = ReputationToRank(factionEntry, BaseRep + faction->Standing); UpdateRankCounters(old_rank, new_rank); - uint32 dbFactionFlags = fields[2].GetUInt16(); + EnumFlag<ReputationFlags> dbFactionFlags = static_cast<ReputationFlags>(fields[2].GetUInt16()); - if (dbFactionFlags & FACTION_FLAG_VISIBLE) - SetVisible(faction); // have internal checks for forced invisibility + if (dbFactionFlags.HasFlag(ReputationFlags::Visible)) + SetVisible(faction); // have internal checks for forced invisibility - if (dbFactionFlags & FACTION_FLAG_INACTIVE) - SetInactive(faction, true); // have internal checks for visibility requirement + if (dbFactionFlags.HasFlag(ReputationFlags::Inactive)) + SetInactive(faction, true); // have internal checks for visibility requirement - if (dbFactionFlags & FACTION_FLAG_AT_WAR) // DB at war - SetAtWar(faction, true); // have internal checks for FACTION_FLAG_PEACE_FORCED - else // DB not at war + if (dbFactionFlags.HasFlag(ReputationFlags::AtWar)) // DB at war + SetAtWar(faction, true); // have internal checks for ReputationFlags::Peaceful + else // DB not at war { // allow remove if visible (and then not FACTION_FLAG_INVISIBLE_FORCED or FACTION_FLAG_HIDDEN) - if (faction->Flags & FACTION_FLAG_VISIBLE) - SetAtWar(faction, false); // have internal checks for FACTION_FLAG_PEACE_FORCED + if (faction->Flags.HasFlag(ReputationFlags::Visible)) + SetAtWar(faction, false); // have internal checks for ReputationFlags::Peaceful } // set atWar for hostile @@ -628,7 +630,7 @@ void ReputationMgr::SaveToDB(CharacterDatabaseTransaction trans) stmt->setUInt32(0, _player->GetGUID().GetCounter()); stmt->setUInt16(1, uint16(itr->second.ID)); stmt->setInt32(2, itr->second.Standing); - stmt->setUInt16(3, uint16(itr->second.Flags)); + stmt->setUInt16(3, itr->second.Flags.AsUnderlyingType()); trans->Append(stmt); itr->second.needSave = false; diff --git a/src/server/game/Reputation/ReputationMgr.h b/src/server/game/Reputation/ReputationMgr.h index d2490dae1ba..a7478d396b5 100644 --- a/src/server/game/Reputation/ReputationMgr.h +++ b/src/server/game/Reputation/ReputationMgr.h @@ -19,10 +19,12 @@ #define __TRINITY_REPUTATION_MGR_H #include "Common.h" -#include "SharedDefines.h" +#include "EnumFlag.h" #include "Language.h" +#include "DatabaseEnvFwd.h" #include "DBCStructure.h" -#include "QueryResult.h" +#include "SharedDefines.h" +#include <set> #include <map> static uint32 ReputationRankStrIndex[MAX_REPUTATION_RANK] = @@ -31,26 +33,28 @@ static uint32 ReputationRankStrIndex[MAX_REPUTATION_RANK] = LANG_REP_FRIENDLY, LANG_REP_HONORED, LANG_REP_REVERED, LANG_REP_EXALTED }; -enum FactionFlags +enum class ReputationFlags : uint8 { - FACTION_FLAG_NONE = 0x00, // no faction flag - FACTION_FLAG_VISIBLE = 0x01, // makes visible in client (set or can be set at interaction with target of this faction) - FACTION_FLAG_AT_WAR = 0x02, // enable AtWar-button in client. player controlled (except opposition team always war state), Flag only set on initial creation - FACTION_FLAG_HIDDEN = 0x04, // hidden faction from reputation pane in client (player can gain reputation, but this update not sent to client) - FACTION_FLAG_INVISIBLE_FORCED = 0x08, // always overwrite FACTION_FLAG_VISIBLE and hide faction in rep.list, used for hide opposite team factions - FACTION_FLAG_PEACE_FORCED = 0x10, // always overwrite FACTION_FLAG_AT_WAR, used for prevent war with own team factions - FACTION_FLAG_INACTIVE = 0x20, // player controlled, state stored in characters.data (CMSG_SET_FACTION_INACTIVE) - FACTION_FLAG_RIVAL = 0x40, // flag for the two competing outland factions - FACTION_FLAG_SPECIAL = 0x80 // horde and alliance home cities and their northrend allies have this flag + None = 0x0000, + Visible = 0x0001, // makes visible in client (set or can be set at interaction with target of this faction) + AtWar = 0x0002, // enable AtWar-button in client. player controlled (except opposition team always war state), Flag only set on initial creation + Hidden = 0x0004, // hidden faction from reputation pane in client (player can gain reputation, but this update not sent to client) + Header = 0x0008, // Display as header in UI + Peaceful = 0x0010, + Inactive = 0x0020, // player controlled (CMSG_SET_FACTION_INACTIVE) + ShowPropagated = 0x0040, + HeaderShowsBar = 0x0080 // Header has its own reputation bar }; +DEFINE_ENUM_FLAG(ReputationFlags); + typedef uint32 RepListID; struct FactionState { uint32 ID; RepListID ReputationListID; int32 Standing; - uint8 Flags; + EnumFlag<ReputationFlags> Flags = ReputationFlags::None; bool needSend; bool needSave; }; @@ -135,7 +139,7 @@ class TC_GAME_API ReputationMgr private: // internal helper functions void Initialize(); - uint32 GetDefaultStateFlags(FactionEntry const* factionEntry) const; + ReputationFlags GetDefaultStateFlags(FactionEntry const* factionEntry) const; bool SetReputation(FactionEntry const* factionEntry, int32 standing, bool incremental, bool spillOverOnly); void SetVisible(FactionState* faction); void SetAtWar(FactionState* faction, bool atWar) const; diff --git a/src/server/scripts/Commands/cs_character.cpp b/src/server/scripts/Commands/cs_character.cpp index 9a35f6f1c68..6b8fa1b2093 100644 --- a/src/server/scripts/Commands/cs_character.cpp +++ b/src/server/scripts/Commands/cs_character.cpp @@ -566,17 +566,17 @@ public: ss << ' ' << rankName << " (" << target->GetReputationMgr().GetReputation(factionEntry) << ')'; - if (faction.Flags & FACTION_FLAG_VISIBLE) + if (faction.Flags.HasFlag(ReputationFlags::Visible)) ss << handler->GetTrinityString(LANG_FACTION_VISIBLE); - if (faction.Flags & FACTION_FLAG_AT_WAR) + if (faction.Flags.HasFlag(ReputationFlags::AtWar)) ss << handler->GetTrinityString(LANG_FACTION_ATWAR); - if (faction.Flags & FACTION_FLAG_PEACE_FORCED) + if (faction.Flags.HasFlag(ReputationFlags::Peaceful)) ss << handler->GetTrinityString(LANG_FACTION_PEACE_FORCED); - if (faction.Flags & FACTION_FLAG_HIDDEN) + if (faction.Flags.HasFlag(ReputationFlags::Hidden)) ss << handler->GetTrinityString(LANG_FACTION_HIDDEN); - if (faction.Flags & FACTION_FLAG_INVISIBLE_FORCED) + if (faction.Flags.HasFlag(ReputationFlags::Header)) ss << handler->GetTrinityString(LANG_FACTION_INVISIBLE_FORCED); - if (faction.Flags & FACTION_FLAG_INACTIVE) + if (faction.Flags.HasFlag(ReputationFlags::Inactive)) ss << handler->GetTrinityString(LANG_FACTION_INACTIVE); handler->SendSysMessage(ss.str().c_str()); diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index d9d02aab36c..75ecd1b56fe 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -367,17 +367,17 @@ public: ss << ' ' << rankName << "|h|r (" << target->GetReputationMgr().GetReputation(factionEntry) << ')'; - if (factionState->Flags & FACTION_FLAG_VISIBLE) + if (factionState->Flags.HasFlag(ReputationFlags::Visible)) ss << handler->GetTrinityString(LANG_FACTION_VISIBLE); - if (factionState->Flags & FACTION_FLAG_AT_WAR) + if (factionState->Flags.HasFlag(ReputationFlags::AtWar)) ss << handler->GetTrinityString(LANG_FACTION_ATWAR); - if (factionState->Flags & FACTION_FLAG_PEACE_FORCED) + if (factionState->Flags.HasFlag(ReputationFlags::Peaceful)) ss << handler->GetTrinityString(LANG_FACTION_PEACE_FORCED); - if (factionState->Flags & FACTION_FLAG_HIDDEN) + if (factionState->Flags.HasFlag(ReputationFlags::Hidden)) ss << handler->GetTrinityString(LANG_FACTION_HIDDEN); - if (factionState->Flags & FACTION_FLAG_INVISIBLE_FORCED) + if (factionState->Flags.HasFlag(ReputationFlags::Header)) ss << handler->GetTrinityString(LANG_FACTION_INVISIBLE_FORCED); - if (factionState->Flags & FACTION_FLAG_INACTIVE) + if (factionState->Flags.HasFlag(ReputationFlags::Inactive)) ss << handler->GetTrinityString(LANG_FACTION_INACTIVE); } else |