From b3b42d29adfe2ee8d64da3994cae08996c55514d Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Mon, 8 Dec 2025 14:03:10 -0500 Subject: [PATCH] Core/Auras: Corrected SPELL_AURA_MOD_HONOR_GAIN_PCT implementation - it should only increase honor gains from some sources Port From (https://github.com/TrinityCore/TrinityCore/commit/c56d18287dad88b214b4a33ccd785484b165acbe) --- Source/Framework/Constants/PlayerConst.cs | 16 ++++++++++++++++ .../Framework/Constants/Spells/SpellAuraConst.cs | 2 +- Source/Game/BattleGrounds/BattleGround.cs | 14 +++++++++----- Source/Game/Chat/Commands/HonorCommands.cs | 4 ++-- Source/Game/Entities/Player/KillRewarder.cs | 2 +- Source/Game/Entities/Player/Player.Combat.cs | 2 +- Source/Game/Entities/Player/Player.PvP.cs | 8 ++++---- Source/Game/Entities/Player/Player.Quest.cs | 2 +- 8 files changed, 35 insertions(+), 15 deletions(-) diff --git a/Source/Framework/Constants/PlayerConst.cs b/Source/Framework/Constants/PlayerConst.cs index 707d506a1..1d7dfdc4b 100644 --- a/Source/Framework/Constants/PlayerConst.cs +++ b/Source/Framework/Constants/PlayerConst.cs @@ -1005,4 +1005,20 @@ namespace Framework.Constants CharacterContentpushIndex = 8, CharacterQuestCompletedIndex = 9, } + + public enum HonorGainSource + { + Kill = 0, + Quest = 1, + ArenaCompletion = 2, + BGCompletion = 3, + LFG = 4, + TeamContribution = 5, + RankedBGCompletion = 6, + RatedArenaCompletion = 7, + ArenaSkirmishCompletion = 8, + RandomBGCompletion = 9, + HolidayBGCompletion = 10, + Spell = 11, + } } diff --git a/Source/Framework/Constants/Spells/SpellAuraConst.cs b/Source/Framework/Constants/Spells/SpellAuraConst.cs index 9c02ef6cd..0580ed75d 100644 --- a/Source/Framework/Constants/Spells/SpellAuraConst.cs +++ b/Source/Framework/Constants/Spells/SpellAuraConst.cs @@ -219,7 +219,7 @@ namespace Framework.Constants ModMountedFlightSpeedAlways = 209, ModVehicleSpeedAlways = 210, ModFlightSpeedNotStack = 211, - ModHonorGainPct = 212, + ModHonorGainPctFromSource = 212, ModRageFromDamageDealt = 213, Unk214 = 214, ArenaPreparation = 215, diff --git a/Source/Game/BattleGrounds/BattleGround.cs b/Source/Game/BattleGrounds/BattleGround.cs index 6cb5185b0..1934124ee 100644 --- a/Source/Game/BattleGrounds/BattleGround.cs +++ b/Source/Game/BattleGrounds/BattleGround.cs @@ -525,7 +525,7 @@ namespace Game.BattleGrounds { Player player = _GetPlayerForTeam(team, pair, "RewardHonorToTeam"); if (player != null) - UpdatePlayerScore(player, ScoreType.BonusHonor, Honor); + UpdatePlayerScore(player, ScoreType.BonusHonor, Honor, true, HonorGainSource.TeamContribution); } } @@ -683,7 +683,11 @@ namespace Game.BattleGrounds if (Global.BattlegroundMgr.IsRandomBattleground((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId) || Global.BattlegroundMgr.IsBGWeekend((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId)) { - UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(winnerKills)); + HonorGainSource source = HonorGainSource.BGCompletion; + if (!player.GetRandomWinner()) + source = Global.BattlegroundMgr.IsRandomBattleground((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId) ? HonorGainSource.RandomBGCompletion : HonorGainSource.HolidayBGCompletion; + + UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(winnerKills), true, source); if (!player.GetRandomWinner()) { player.SetRandomWinner(true); @@ -716,7 +720,7 @@ namespace Game.BattleGrounds { if (Global.BattlegroundMgr.IsRandomBattleground((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId) || Global.BattlegroundMgr.IsBGWeekend((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId)) - UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(loserKills)); + UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(loserKills), true, HonorGainSource.BGCompletion); } } @@ -1233,14 +1237,14 @@ namespace Game.BattleGrounds return PlayerScores.LookupByKey(player.GetGUID()); } - public bool UpdatePlayerScore(Player player, ScoreType type, uint value, bool doAddHonor = true) + public bool UpdatePlayerScore(Player player, ScoreType type, uint value, bool doAddHonor = true, HonorGainSource? source = null) { var bgScore = PlayerScores.LookupByKey(player.GetGUID()); if (bgScore == null) // player not found... return false; if (type == ScoreType.BonusHonor && doAddHonor && IsBattleground()) - player.RewardHonor(null, 1, (int)value); + player.RewardHonor(null, 1, (int)value, source.GetValueOrDefault(HonorGainSource.Kill)); else bgScore.UpdateScore(type, value); diff --git a/Source/Game/Chat/Commands/HonorCommands.cs b/Source/Game/Chat/Commands/HonorCommands.cs index 6781d00b9..3f63079d9 100644 --- a/Source/Game/Chat/Commands/HonorCommands.cs +++ b/Source/Game/Chat/Commands/HonorCommands.cs @@ -45,7 +45,7 @@ namespace Game.Chat.Commands if (handler.HasLowerSecurity(target, ObjectGuid.Empty)) return false; - target.RewardHonor(null, 1, amount); + target.RewardHonor(null, 1, amount, HonorGainSource.Spell); return true; } @@ -65,7 +65,7 @@ namespace Game.Chat.Commands if (handler.HasLowerSecurity(player, ObjectGuid.Empty)) return false; - handler.GetPlayer().RewardHonor(target, 1); + handler.GetPlayer().RewardHonor(target, 1, -1, HonorGainSource.Kill); return true; } } diff --git a/Source/Game/Entities/Player/KillRewarder.cs b/Source/Game/Entities/Player/KillRewarder.cs index 714e3c280..42a744190 100644 --- a/Source/Game/Entities/Player/KillRewarder.cs +++ b/Source/Game/Entities/Player/KillRewarder.cs @@ -147,7 +147,7 @@ namespace Game.Entities { // Rewarded player must be alive. if (player.IsAlive()) - player.RewardHonor(_victim, _count, -1, true); + player.RewardHonor(_victim, _count, -1, HonorGainSource.Kill); } void _RewardXP(Player player, float rate) diff --git a/Source/Game/Entities/Player/Player.Combat.cs b/Source/Game/Entities/Player/Player.Combat.cs index a74aaf95b..5a6a0d675 100644 --- a/Source/Game/Entities/Player/Player.Combat.cs +++ b/Source/Game/Entities/Player/Player.Combat.cs @@ -478,7 +478,7 @@ namespace Game.Entities // Honor points after duel (the winner) - ImpConfig int amount = WorldConfig.GetIntValue(WorldCfg.HonorAfterDuel); if (amount != 0) - opponent.RewardHonor(null, 1, amount); + opponent.RewardHonor(null, 1, amount, HonorGainSource.Kill); break; default: diff --git a/Source/Game/Entities/Player/Player.PvP.cs b/Source/Game/Entities/Player/Player.PvP.cs index 379751450..84fbd89e9 100644 --- a/Source/Game/Entities/Player/Player.PvP.cs +++ b/Source/Game/Entities/Player/Player.PvP.cs @@ -45,7 +45,7 @@ namespace Game.Entities m_lastHonorUpdateTime = now; } - public bool RewardHonor(Unit victim, uint groupsize, int honor = -1, bool pvptoken = false) + public bool RewardHonor(Unit victim, uint groupsize, int honor = -1, HonorGainSource source = HonorGainSource.Kill) { // do not reward honor in arenas, but enable onkill spellproc if (InArena()) @@ -146,7 +146,7 @@ namespace Game.Entities honor_f /= groupsize; // apply honor multiplier from aura (not stacking-get highest) - MathFunctions.AddPct(ref honor_f, GetMaxPositiveAuraModifier(AuraType.ModHonorGainPct)); + MathFunctions.AddPct(ref honor_f, GetMaxPositiveAuraModifierByMiscMask(AuraType.ModHonorGainPctFromSource, 1u << (int)source)); honor_f += _restMgr.GetRestBonusFor(RestTypes.Honor, (uint)honor_f); } @@ -173,11 +173,11 @@ namespace Game.Entities Battleground bg = GetBattleground(); if (bg != null) { - bg.UpdatePlayerScore(this, ScoreType.BonusHonor, (uint)honor, false); //false: prevent looping + bg.UpdatePlayerScore(this, ScoreType.BonusHonor, (uint)honor, false, source); //false: prevent looping } } - if (WorldConfig.GetBoolValue(WorldCfg.PvpTokenEnable) && pvptoken) + if (WorldConfig.GetBoolValue(WorldCfg.PvpTokenEnable) && source == HonorGainSource.Kill) { if (victim == null || victim == this || victim.HasAuraType(AuraType.NoPvpCredit)) return true; diff --git a/Source/Game/Entities/Player/Player.Quest.cs b/Source/Game/Entities/Player/Player.Quest.cs index dd60ad1b2..277b4baa5 100644 --- a/Source/Game/Entities/Player/Player.Quest.cs +++ b/Source/Game/Entities/Player/Player.Quest.cs @@ -1118,7 +1118,7 @@ namespace Game.Entities // honor reward uint honor = quest.CalculateHonorGain(GetLevel()); if (honor != 0) - RewardHonor(null, 0, (int)honor); + RewardHonor(null, 0, (int)honor, HonorGainSource.Quest); // title reward if (quest.RewardTitleId != 0)