aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Player/Player.cpp73
-rw-r--r--src/server/game/Entities/Player/Player.h9
-rw-r--r--src/server/game/Spells/SpellEffects.cpp25
3 files changed, 70 insertions, 37 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 93caebab6f6..d8f0850c462 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6477,34 +6477,61 @@ ReputationRank Player::GetReputationRank(uint32 faction) const
return GetReputationMgr().GetRank(factionEntry);
}
-//Calculate total reputation percent player gain with quest/creature level
-int32 Player::CalculateReputationGain(uint32 creatureOrQuestLevel, int32 rep, int32 faction, bool for_quest, bool noQuestBonus)
+// Calculate total reputation percent player gain with quest/creature level
+int32 Player::CalculateReputationGain(ReputationSource source, int32 rep, int32 faction, uint32 creatureOrQuestLevel, bool noAuraBonus)
{
float percent = 100.0f;
- // Get the generic rate first
- if (RepRewardRate const * repData = sObjectMgr.GetRepRewardRate(faction))
+ float repMod = noAuraBonus ? 0.0f : (float)GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN);
+
+ // faction specific auras only seem to apply to kills
+ if (source == REPUTATION_SOURCE_KILL)
+ repMod += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, faction);
+
+ percent += rep > 0 ? repMod : -repMod;
+
+ float rate = 1.0f;
+ switch (source)
{
- float repRate = for_quest ? repData->quest_rate : repData->creature_rate;
- percent *= repRate;
+ case REPUTATION_SOURCE_KILL:
+ rate = sWorld.getConfig(RATE_REPUTATION_LOWLEVEL_KILL);
+ break;
+ case REPUTATION_SOURCE_QUEST:
+ rate = sWorld.getConfig(RATE_REPUTATION_LOWLEVEL_QUEST);
+ break;
}
- float rate = for_quest ? sWorld.getRate(RATE_REPUTATION_LOWLEVEL_QUEST) : sWorld.getRate(RATE_REPUTATION_LOWLEVEL_KILL);
-
if (rate != 1.0f && creatureOrQuestLevel <= Trinity::XP::GetGrayLevel(getLevel()))
percent *= rate;
- float repMod = noQuestBonus ? 0.0f : (float)GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN);
+ if (percent <= 0.0f)
+ return 0;
- if (!for_quest)
- repMod += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, faction);
+ // Multiply result with the faction specific rate
+ if (const RepRewardRate *repData = sObjectMgr.GetRepRewardRate(faction))
+ {
+ float repRate = 0.0f;
+ switch (source)
+ {
+ case REPUTATION_SOURCE_KILL:
+ repRate = repData->creature_rate;
+ break;
+ case REPUTATION_SOURCE_QUEST:
+ repRate = repData->quest_rate;
+ break;
+ case REPUTATION_SOURCE_SPELL:
+ repRate = repData->spell_rate;
+ break;
+ }
- percent += rep > 0 ? repMod : -repMod;
+ // for custom, a rate of 0.0 will totally disable reputation gain for this faction/type
+ if (repRate <= 0.0f)
+ return 0;
- if (percent <= 0.0f)
- return 0;
+ percent *= repRate;
+ }
- return int32(rep*percent/100);
+ return int32(sWorld.getConfig(RATE_REPUTATION_GAIN) * rep * percent / 100.0f);
}
//Calculates how many reputation points player gains in victim's enemy factions
@@ -6556,7 +6583,7 @@ void Player::RewardReputation(Unit *pVictim, float rate)
if (Rep->repfaction1 && (!Rep->team_dependent || team == ALLIANCE))
{
- int32 donerep1 = CalculateReputationGain(pVictim->getLevel(), Rep->repvalue1, ChampioningFaction ? ChampioningFaction : Rep->repfaction1, false);
+ int32 donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, Rep->repvalue1, Rep->repfaction1, pVictim->getLevel());
donerep1 = int32(donerep1*(rate + favored_rep_mult));
FactionEntry const *factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->repfaction1);
uint32 current_reputation_rank1 = GetReputationMgr().GetRank(factionEntry1);
@@ -6574,7 +6601,7 @@ void Player::RewardReputation(Unit *pVictim, float rate)
if (Rep->repfaction2 && (!Rep->team_dependent || team == HORDE))
{
- int32 donerep2 = CalculateReputationGain(pVictim->getLevel(), Rep->repvalue2, ChampioningFaction ? ChampioningFaction : Rep->repfaction2, false);
+ int32 donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, Rep->repvalue2, Rep->repfaction2, pVictim->getLevel());
donerep2 = int32(donerep2*(rate + favored_rep_mult));
FactionEntry const *factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->repfaction2);
uint32 current_reputation_rank2 = GetReputationMgr().GetRank(factionEntry2);
@@ -6601,7 +6628,7 @@ void Player::RewardReputation(Quest const *pQuest)
continue;
if (pQuest->RewRepValue[i])
{
- int32 rep = CalculateReputationGain(GetQuestLevel(pQuest), pQuest->RewRepValue[i]/100, pQuest->RewRepFaction[i], true, true);
+ int32 rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, pQuest->RewRepValue[i] / 100, pQuest->RewRepFaction[i], GetQuestLevel(pQuest), true);
if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(pQuest->RewRepFaction[i]))
GetReputationMgr().ModifyReputation(factionEntry, rep);
}
@@ -6612,13 +6639,13 @@ void Player::RewardReputation(Quest const *pQuest)
if (const QuestFactionRewEntry *pRow = sQuestFactionRewardStore.LookupEntry(row))
{
- int32 repPoints = pRow->QuestRewFactionValue[field];
+ int32 repPoints = pRow->QuestRewFactionValue[field];
- if (!repPoints)
- continue;
+ if (!repPoints)
+ continue;
- repPoints = CalculateReputationGain(GetQuestLevel(pQuest), repPoints, pQuest->RewRepFaction[i], true);
- if (const FactionEntry* factionEntry = sFactionStore.LookupEntry(pQuest->RewRepFaction[i]))
+ repPoints = CalculateReputationGain(REPUTATION_SOURCE_QUEST, repPoints, pQuest->RewRepFaction[i], GetQuestLevel(pQuest));
+ if (const FactionEntry* factionEntry = sFactionStore.LookupEntry(pQuest->RewRepFaction[i]))
GetReputationMgr().ModifyReputation(factionEntry, repPoints);
}
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 43aaad82a78..8e6a52c9d3a 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -800,6 +800,13 @@ enum PlayerDelayedOperations
DELAYED_END
};
+enum ReputationSource
+{
+ REPUTATION_SOURCE_KILL,
+ REPUTATION_SOURCE_QUEST,
+ REPUTATION_SOURCE_SPELL
+};
+
// Player summoning auto-decline time (in secs)
#define MAX_PLAYER_SUMMON_DELAY (2*MINUTE)
#define MAX_MONEY_AMOUNT (0x7FFFFFFF-1)
@@ -1923,6 +1930,7 @@ class Player : public Unit, public GridObject<Player>
ReputationRank GetReputationRank(uint32 faction_id) const;
void RewardReputation(Unit *pVictim, float rate);
void RewardReputation(Quest const *pQuest);
+ int32 CalculateReputationGain(ReputationSource source, int32 rep, int32 faction, uint32 creatureOrQuestLevel = 0, bool noAuraBonus = false);
void UpdateSkillsForLevel();
void UpdateSkillsToMaxSkillsForLevel(); // for .levelup
@@ -2597,7 +2605,6 @@ class Player : public Unit, public GridObject<Player>
void RefundItem(Item* item);
void UpdateKnownCurrencies(uint32 itemId, bool apply);
- int32 CalculateReputationGain(uint32 creatureOrQuestLevel, int32 rep, int32 faction, bool for_quest, bool noQuestBonus = false);
void AdjustQuestReqItemCount(Quest const* pQuest, QuestStatusData& questStatusData);
bool IsCanDelayTeleport() const { return m_bCanDelayTeleport; }
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index a72e9e83401..ed41f43af6f 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -6536,26 +6536,25 @@ void Spell::EffectLeap(uint32 i)
void Spell::EffectReputation(uint32 i)
{
- if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER)
+ if (!unitTarget)
return;
- Player *_player = (Player*)unitTarget;
-
- int32 rep_change = damage;//+1; // field store reputation change -1
+ if (Player *_player = unitTarget->ToPlayer())
+ {
+ int32 rep_change = damage;//+1; // field store reputation change -1
+ uint32 faction_id = m_spellInfo->EffectMiscValue[i];
- uint32 faction_id = m_spellInfo->EffectMiscValue[i];
+ FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id);
+ if (!factionEntry)
+ return;
- FactionEntry const* factionEntry = sFactionStore.LookupEntry(faction_id);
+ if (RepRewardRate const * repData = sObjectMgr.GetRepRewardRate(faction_id))
+ rep_change = (float)rep_change * repData->spell_rate;
- if (!factionEntry)
- return;
+ rep_change = _player->CalculateReputationGain(REPUTATION_SOURCE_SPELL, rep_change, faction_id);
- if (RepRewardRate const * repData = sObjectMgr.GetRepRewardRate(faction_id))
- {
- rep_change = (float)rep_change * repData->spell_rate;
+ _player->GetReputationMgr().ModifyReputation(factionEntry, rep_change);
}
-
- _player->GetReputationMgr().ModifyReputation(factionEntry, rep_change);
}
void Spell::EffectQuestComplete(uint32 i)