diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Reputation/ReputationMgr.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Reputation/ReputationMgr.h | 1 |
3 files changed, 28 insertions, 7 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f2ecd746ffc..c2fe6978456 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6655,7 +6655,12 @@ void Player::RewardReputation(Quest const* quest) { for (uint8 i = 0; i < QUEST_REPUTATIONS_COUNT; ++i) { - if (!quest->RewardFactionId[i]) + uint32 rewardFactionId = quest->RewardFactionId[i]; + + if (!rewardFactionId) + continue; + + if (!GetReputationMgr().IsReputationAllowedForTeam(GetTeamId(), rewardFactionId)) continue; int32 rep = 0; @@ -6680,17 +6685,17 @@ void Player::RewardReputation(Quest const* quest) continue; if (quest->IsDaily()) - rep = CalculateReputationGain(REPUTATION_SOURCE_DAILY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus); + rep = CalculateReputationGain(REPUTATION_SOURCE_DAILY_QUEST, GetQuestLevel(quest), rep, rewardFactionId, noQuestBonus); else if (quest->IsWeekly()) - rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus); + rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, rewardFactionId, noQuestBonus); else if (quest->IsMonthly()) - rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus); + rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, rewardFactionId, noQuestBonus); else if (quest->IsRepeatable()) - rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus); + rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, rewardFactionId, noQuestBonus); else - rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], noQuestBonus); + rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, rewardFactionId, noQuestBonus); - if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->RewardFactionId[i])) + if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(rewardFactionId)) GetReputationMgr().ModifyReputation(factionEntry, rep); } } diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index b565d31dd3d..b870f408019 100644 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -67,6 +67,21 @@ bool ReputationMgr::IsAtWar(FactionEntry const* factionEntry) const return false; } +bool ReputationMgr::IsReputationAllowedForTeam(TeamId team, uint32 factionId) const +{ + // @hack some quests give reputation to Alliance-only AND Horde-only factions, but DBC data does not allow to identify faction-only reputations + if (team == TEAM_HORDE && ( + factionId == 1037 || // Alliance Vanguard + factionId == 946)) // Honor Hold + return false; + + if (team == TEAM_ALLIANCE && + factionId == 947) // Thrallmar + return false; + + return true; +} + int32 ReputationMgr::GetReputation(uint32 faction_id) const { FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id); diff --git a/src/server/game/Reputation/ReputationMgr.h b/src/server/game/Reputation/ReputationMgr.h index 8ecffa53483..0597cb609cd 100644 --- a/src/server/game/Reputation/ReputationMgr.h +++ b/src/server/game/Reputation/ReputationMgr.h @@ -97,6 +97,7 @@ class TC_GAME_API ReputationMgr bool IsAtWar(uint32 faction_id) const; bool IsAtWar(FactionEntry const* factionEntry) const; + bool IsReputationAllowedForTeam(TeamId team, uint32 factionId) const; int32 GetReputation(uint32 faction_id) const; int32 GetReputation(FactionEntry const* factionEntry) const; |