diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-09-24 00:21:31 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-09-24 00:21:31 +0200 |
commit | c56d18287dad88b214b4a33ccd785484b165acbe (patch) | |
tree | d63a7b88ba52ff1afe0b705fbf341282c6881f3b /src/server | |
parent | 5fad0fb43af8498c1ae6d4bc79f47fe318d391c8 (diff) |
Core/Auras: Corrected SPELL_AURA_MOD_HONOR_GAIN_PCT implementation - it should only increase honor gains from some sources
Diffstat (limited to 'src/server')
10 files changed, 43 insertions, 21 deletions
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 9c2468a95c9..1f55c0ccb86 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -576,7 +576,7 @@ void Battleground::RewardHonorToTeam(uint32 Honor, Team team) { for (BattlegroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) if (Player* player = _GetPlayerForTeam(team, itr, "RewardHonorToTeam")) - UpdatePlayerScore(player, SCORE_BONUS_HONOR, Honor); + UpdatePlayerScore(player, SCORE_BONUS_HONOR, Honor, true, HonorGainSource::TeamContribution); } void Battleground::RewardReputationToTeam(uint32 faction_id, uint32 Reputation, Team team) @@ -726,7 +726,11 @@ void Battleground::EndBattleground(Team winner) if (BattlegroundMgr::IsRandomBattleground(bgPlayer->queueTypeId.BattlemasterListId) || BattlegroundMgr::IsBGWeekend(BattlegroundTypeId(bgPlayer->queueTypeId.BattlemasterListId))) { - UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(winnerKills)); + HonorGainSource source = HonorGainSource::BGCompletion; + if (!player->GetRandomWinner()) + source = BattlegroundMgr::IsRandomBattleground(bgPlayer->queueTypeId.BattlemasterListId) ? HonorGainSource::RandomBGCompletion : HonorGainSource::HolidayBGCompletion; + + UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(winnerKills), true, source); if (!player->GetRandomWinner()) { player->SetRandomWinner(true); @@ -756,7 +760,7 @@ void Battleground::EndBattleground(Team winner) { if (BattlegroundMgr::IsRandomBattleground(bgPlayer->queueTypeId.BattlemasterListId) || BattlegroundMgr::IsBGWeekend(BattlegroundTypeId(bgPlayer->queueTypeId.BattlemasterListId))) - UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(loserKills)); + UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(loserKills), true, HonorGainSource::BGCompletion); } } @@ -1279,14 +1283,14 @@ BattlegroundScore const* Battleground::GetBattlegroundScore(Player* player) cons return Trinity::Containers::MapGetValuePtr(PlayerScores, player->GetGUID()); } -bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor) +bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor, Optional<HonorGainSource> source) { BattlegroundScoreMap::const_iterator itr = PlayerScores.find(player->GetGUID()); if (itr == PlayerScores.end()) // player not found... return false; if (type == SCORE_BONUS_HONOR && doAddHonor && isBattleground()) - player->RewardHonor(nullptr, 1, value); // RewardHonor calls UpdatePlayerScore with doAddHonor = false + player->RewardHonor(nullptr, 1, value, source.value_or(HonorGainSource::Kill)); // RewardHonor calls UpdatePlayerScore with doAddHonor = false else itr->second->UpdateScore(type, value); diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index b1dad05c67f..32b6075e94a 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -21,6 +21,7 @@ #include "DBCEnums.h" #include "Duration.h" #include "ObjectGuid.h" +#include "Optional.h" #include "Position.h" #include "SharedDefines.h" #include "UniqueTrackablePtr.h" @@ -43,6 +44,7 @@ struct BattlegroundScore; struct BattlegroundTemplate; struct PVPDifficultyEntry; struct WorldSafeLocsEntry; +enum class HonorGainSource : uint8; namespace WorldPackets { @@ -378,7 +380,7 @@ class TC_GAME_API Battleground BattlegroundScore const* GetBattlegroundScore(Player* player) const; - bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true); + bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true, Optional<HonorGainSource> source = {}); void UpdatePvpStat(Player* player, uint32 pvpStatId, uint32 value); static TeamId GetTeamIndexByTeamId(Team team) { return team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; } diff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp index 742d97761bf..8197fc36158 100644 --- a/src/server/game/Entities/Player/KillRewarder.cpp +++ b/src/server/game/Entities/Player/KillRewarder.cpp @@ -134,7 +134,7 @@ inline void KillRewarder::_RewardHonor(Player* player) { // Rewarded player must be alive. if (player->IsAlive()) - player->RewardHonor(_victim, _count, -1, true); + player->RewardHonor(_victim, _count, -1, HonorGainSource::Kill); } inline void KillRewarder::_RewardXP(Player* player, float rate) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3e2c88b1036..b40f949e0d3 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6746,7 +6746,7 @@ void Player::UpdateHonorFields() ///Calculate the amount of honor gained based on the victim ///and the size of the group for which the honor is divided ///An exact honor value can also be given (overriding the calcs) -bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvptoken) +bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, HonorGainSource source) { // do not reward honor in arenas, but enable onkill spellproc if (InArena()) @@ -6847,7 +6847,7 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto honor_f /= groupsize; // apply honor multiplier from aura (not stacking-get highest) - AddPct(honor_f, GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HONOR_GAIN_PCT)); + AddPct(honor_f, GetMaxPositiveAuraModifierByMiscMask(SPELL_AURA_MOD_HONOR_GAIN_PCT_FROM_SOURCE, 1 << AsUnderlyingType(source))); honor_f += _restMgr->GetRestBonusFor(REST_TYPE_HONOR, honor_f); } @@ -6873,11 +6873,11 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto { if (Battleground* bg = GetBattleground()) { - bg->UpdatePlayerScore(this, SCORE_BONUS_HONOR, honor, false); //false: prevent looping + bg->UpdatePlayerScore(this, SCORE_BONUS_HONOR, honor, false, source); //false: prevent looping } } - if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE) && pvptoken) + if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE) && source == HonorGainSource::Kill) { if (!victim || victim == this || victim->HasAuraType(SPELL_AURA_NO_PVP_CREDIT)) return true; @@ -7828,7 +7828,7 @@ void Player::DuelComplete(DuelCompleteType type) // Honor points after duel (the winner) - ImpConfig if (uint32 amount = sWorld->getIntConfig(CONFIG_HONOR_AFTER_DUEL)) - opponent->RewardHonor(nullptr, 1, amount); + opponent->RewardHonor(nullptr, 1, amount, HonorGainSource::Kill); break; default: @@ -15091,7 +15091,7 @@ void Player::RewardQuest(Quest const* quest, LootItemType rewardType, uint32 rew // honor reward if (uint32 honor = quest->CalculateHonorGain(GetLevel())) - RewardHonor(nullptr, 0, honor); + RewardHonor(nullptr, 0, honor, HonorGainSource::Quest); // title reward if (quest->GetRewTitle()) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index c12d6cf311d..51c91183d20 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -336,6 +336,22 @@ enum ActionButtonType ACTION_BUTTON_ITEM = 0x80 }; +enum class HonorGainSource : uint8 +{ + Kill = 0, + Quest = 1, + ArenaCompletion = 2, + BGCompletion = 3, + LFG = 4, + TeamContribution = 5, + RankedBGCompletion = 6, + RatedArenaCompletion = 7, + ArenaSkirmishCompletion = 8, + RandomBGCompletion = 9, + HolidayBGCompletion = 10, + Spell = 11, +}; + enum ReputationSource { REPUTATION_SOURCE_KILL, @@ -2360,7 +2376,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> /*** PVP SYSTEM ***/ /*********************************************************/ void UpdateHonorFields(); - bool RewardHonor(Unit* victim, uint32 groupsize, int32 honor = -1, bool pvptoken = false); + bool RewardHonor(Unit* victim, uint32 groupsize, int32 honor = -1, HonorGainSource source = HonorGainSource::Kill); void ResetHonorStats(); uint32 GetMaxPersonalArenaRatingRequirement(uint32 minarenaslot) const; diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index f9c2201fac4..235335828cf 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -296,7 +296,7 @@ enum AuraType : uint32 SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS = 209, SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS = 210, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK = 211, - SPELL_AURA_MOD_HONOR_GAIN_PCT = 212, + SPELL_AURA_MOD_HONOR_GAIN_PCT_FROM_SOURCE = 212, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT = 213, SPELL_AURA_214 = 214, SPELL_AURA_ARENA_PREPARATION = 215, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 9cb6d4da85d..eed12ec0830 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -281,7 +281,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleAuraModIncreaseFlightSpeed, //209 SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS &AuraEffect::HandleAuraModIncreaseFlightSpeed, //210 SPELL_AURA_MOD_VEHICLE_SPEED_ALWAYS &AuraEffect::HandleAuraModIncreaseFlightSpeed, //211 SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACK - &AuraEffect::HandleNoImmediateEffect, //212 SPELL_AURA_MOD_HONOR_GAIN_PCT implemented in Player::RewardHonor + &AuraEffect::HandleNoImmediateEffect, //212 SPELL_AURA_MOD_HONOR_GAIN_PCT_FROM_SOURCE implemented in Player::RewardHonor &AuraEffect::HandleNoImmediateEffect, //213 SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT implemented in Player::RewardRage &AuraEffect::HandleNULL, //214 Tamed Pet Passive &AuraEffect::HandleArenaPreparation, //215 SPELL_AURA_ARENA_PREPARATION diff --git a/src/server/scripts/Battlegrounds/StrandOfTheAncients/battleground_strand_of_the_ancients.cpp b/src/server/scripts/Battlegrounds/StrandOfTheAncients/battleground_strand_of_the_ancients.cpp index dba78903864..feb9c4334d1 100644 --- a/src/server/scripts/Battlegrounds/StrandOfTheAncients/battleground_strand_of_the_ancients.cpp +++ b/src/server/scripts/Battlegrounds/StrandOfTheAncients/battleground_strand_of_the_ancients.cpp @@ -664,7 +664,7 @@ struct battleground_strand_of_the_ancients : BattlegroundScript { battleground->UpdatePvpStat(player, PVP_STAT_GATES_DESTROYED, 1); if (rewardHonor) - battleground->UpdatePlayerScore(player, SCORE_BONUS_HONOR, battleground->GetBonusHonorFromKill(1)); + battleground->UpdatePlayerScore(player, SCORE_BONUS_HONOR, battleground->GetBonusHonorFromKill(1), true, HonorGainSource::TeamContribution); } } } diff --git a/src/server/scripts/Commands/cs_honor.cpp b/src/server/scripts/Commands/cs_honor.cpp index 16aaa5b6bc8..29e325bf65d 100644 --- a/src/server/scripts/Commands/cs_honor.cpp +++ b/src/server/scripts/Commands/cs_honor.cpp @@ -72,7 +72,7 @@ public: if (handler->HasLowerSecurity(target, ObjectGuid::Empty)) return false; - target->RewardHonor(nullptr, 1, amount); + target->RewardHonor(nullptr, 1, amount, HonorGainSource::Spell); return true; } @@ -91,7 +91,7 @@ public: if (handler->HasLowerSecurity(player, ObjectGuid::Empty)) return false; - handler->GetSession()->GetPlayer()->RewardHonor(target, 1); + handler->GetSession()->GetPlayer()->RewardHonor(target, 1, -1, HonorGainSource::Kill); return true; } diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp index eec207ecba8..692662e5d89 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp @@ -107,7 +107,7 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 trigger, bool /*ente // reward player player->CastSpell(player, SI_TRACES_OF_SILITHYST, true); // add 19 honor - player->RewardHonor(nullptr, 1, 19); + player->RewardHonor(nullptr, 1, 19, HonorGainSource::TeamContribution); // add 20 cenarion circle repu player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), 20); // complete quest @@ -133,7 +133,7 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 trigger, bool /*ente // reward player player->CastSpell(player, SI_TRACES_OF_SILITHYST, true); // add 19 honor - player->RewardHonor(nullptr, 1, 19); + player->RewardHonor(nullptr, 1, 19, HonorGainSource::TeamContribution); // add 20 cenarion circle repu player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), 20); // complete quest |