diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 73 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 9 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 25 |
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) |