From f63e6f0df7c0625e828789134ca15195afcf710f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCssig?= Date: Sat, 1 Feb 2025 14:40:40 +0100 Subject: [PATCH 01/10] Added new hooks for repuation gaining to the player --- .../pendings/changes_1738413856259593500.md | 3 +++ src/server/game/Entities/Player/Player.cpp | 10 ++++++++++ .../Scripting/ScriptDefines/PlayerScript.cpp | 20 +++++++++++++++++++ .../Scripting/ScriptDefines/PlayerScript.h | 18 +++++++++++++++++ src/server/game/Scripting/ScriptMgr.h | 6 ++++++ src/server/game/Spells/SpellEffects.cpp | 2 ++ 6 files changed, 59 insertions(+) create mode 100644 doc/changelog/pendings/changes_1738413856259593500.md diff --git a/doc/changelog/pendings/changes_1738413856259593500.md b/doc/changelog/pendings/changes_1738413856259593500.md new file mode 100644 index 00000000000000..f93ee50122f30b --- /dev/null +++ b/doc/changelog/pendings/changes_1738413856259593500.md @@ -0,0 +1,3 @@ +### Added + +- new hooks OnBeforeReputationGained for Unit, Quest, Spell and ReputationSource, ReputationSource is called before a more detailed verion which contains an instance of the object diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fa9d9b5b2bb64b..3a07779ccc1e72 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -6006,6 +6006,8 @@ void Player::RewardReputation(Unit* victim) if (Rep->RepFaction1 && (!Rep->TeamDependent || teamId == TEAM_ALLIANCE)) { float donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast(Rep->RepValue1), ChampioningFaction ? ChampioningFaction : Rep->RepFaction1); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, static_cast(Rep->RepValue1), donerep1, ReputationSource::REPUTATION_SOURCE_KILL); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, static_cast(Rep->RepValue1), donerep1, victim); FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction1); if (factionEntry1) @@ -6017,6 +6019,8 @@ void Player::RewardReputation(Unit* victim) if (Rep->RepFaction2 && (!Rep->TeamDependent || teamId == TEAM_HORDE)) { float donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast(Rep->RepValue2), ChampioningFaction ? ChampioningFaction : Rep->RepFaction2); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, static_cast(Rep->RepValue1), donerep2, ReputationSource::REPUTATION_SOURCE_KILL); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, static_cast(Rep->RepValue1), donerep2, victim); FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction2); if (factionEntry2) @@ -6056,24 +6060,30 @@ void Player::RewardReputation(Quest const* quest) if (quest->IsDaily()) { rep = CalculateReputationGain(REPUTATION_SOURCE_DAILY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::REPUTATION_SOURCE_DAILY_QUEST); } else if (quest->IsWeekly()) { rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::REPUTATION_SOURCE_WEEKLY_QUEST); } else if (quest->IsMonthly()) { rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::REPUTATION_SOURCE_MONTHLY_QUEST); } else if (quest->IsRepeatable()) { rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::REPUTATION_SOURCE_REPEATABLE_QUEST); } else { rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::REPUTATION_SOURCE_QUEST); } + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, quest); if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(quest->RewardFactionId[i])) { GetReputationMgr().ModifyReputation(factionEntry, rep, quest->HasSpecialFlag(QUEST_SPECIAL_FLAGS_NO_REP_SPILLOVER)); diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index 30d8021c6ca0b9..492d500f3faad0 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -129,6 +129,26 @@ void ScriptMgr::OnGivePlayerXP(Player* player, uint32& amount, Unit* victim, uin CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_GIVE_EXP, script->OnGiveXP(player, amount, victim, xpSource)); } +void ScriptMgr::OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Unit* victim) +{ + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_REPUTATION_CHANGE_UNIT, script->OnBeforeReputationChange(player, factionId, amount, victim)); +} + +void ScriptMgr::OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Quest const* quest) +{ + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_REPUTATION_CHANGE_QUEST, script->OnBeforeReputationChange(player, factionId, amount, quest)); +} + +void ScriptMgr::OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Spell* spell) +{ + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_REPUTATION_CHANGE_SPELL, script->OnBeforeReputationChange(player, factionId, amount, spell)); +} + +void ScriptMgr::OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, ReputationSource reputationSource) +{ + CALL_ENABLED_HOOKS(PlayerScript, PLAYERHOOK_ON_BEFORE_REPUTATION_CHANGE_SOURCE, script->OnBeforeReputationChange(player, factionId, amount, reputationSource)); +} + bool ScriptMgr::OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental) { CALL_ENABLED_BOOLEAN_HOOKS(PlayerScript, PLAYERHOOK_ON_REPUTATION_CHANGE, !script->OnReputationChange(player, factionID, standing, incremental)); diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index 388203b4095a96..adc9a425182aa2 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -26,6 +26,8 @@ #include "AchievementMgr.h" #include "KillRewarder.h" +enum ReputationSource; + enum PlayerHook { PLAYERHOOK_ON_PLAYER_JUST_DIED, @@ -48,6 +50,10 @@ enum PlayerHook PLAYERHOOK_ON_MONEY_CHANGED, PLAYERHOOK_ON_BEFORE_LOOT_MONEY, PLAYERHOOK_ON_GIVE_EXP, + PLAYERHOOK_ON_BEFORE_REPUTATION_CHANGE_UNIT, + PLAYERHOOK_ON_BEFORE_REPUTATION_CHANGE_QUEST, + PLAYERHOOK_ON_BEFORE_REPUTATION_CHANGE_SPELL, + PLAYERHOOK_ON_BEFORE_REPUTATION_CHANGE_SOURCE, PLAYERHOOK_ON_REPUTATION_CHANGE, PLAYERHOOK_ON_REPUTATION_RANK_CHANGE, PLAYERHOOK_ON_LEARN_SPELL, @@ -271,6 +277,18 @@ class PlayerScript : public ScriptObject // Called when a player gains XP (before anything is given) virtual void OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/, uint8 /*xpSource*/) { } + // Called before a player gains or looses Reputation + virtual void OnBeforeReputationChange(Player* player, uint32 factionId, float& amount, Unit* victim) {} + + // Called before a player gains or looses Reputation + virtual void OnBeforeReputationChange(Player* player, uint32 factionId, float& amount, Quest const* quest) {} + + // Called before a player gains or looses Reputation + virtual void OnBeforeReputationChange(Player* player, uint32 factionId, float& amount, Spell* spell) {} + + // Called before a player gains or looses Reputation + virtual void OnBeforeReputationChange(Player* player, uint32 factionId, float& amount, ReputationSource reputationSource) {} + // Called when a player's reputation changes (before it is actually changed) virtual bool OnReputationChange(Player* /*player*/, uint32 /*factionID*/, int32& /*standing*/, bool /*incremental*/) { return true; } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 44382936a4d7fa..88878aa5f66f6e 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -90,6 +90,8 @@ struct OutdoorPvPData; struct TargetInfo; struct SpellModifier; +enum ReputationSource; + namespace Acore::ChatCommands { struct ChatCommandBuilder; @@ -311,6 +313,10 @@ class ScriptMgr void OnPlayerMoneyChanged(Player* player, int32& amount); void OnBeforeLootMoney(Player* player, Loot* loot); void OnGivePlayerXP(Player* player, uint32& amount, Unit* victim, uint8 xpSource); + void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Unit* victim); + void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Quest const* quest); + void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Spell* spell); + void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, ReputationSource reputationSource); bool OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental); void OnPlayerReputationRankChange(Player* player, uint32 factionID, ReputationRank newRank, ReputationRank oldRank, bool increased); void OnPlayerLearnSpell(Player* player, uint32 spellID); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index e34918ac19b6db..d736c1d8797e2f 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4748,6 +4748,8 @@ void Spell::EffectReputation(SpellEffIndex effIndex) return; repChange = player->CalculateReputationGain(REPUTATION_SOURCE_SPELL, 0, repChange, factionId); + ScriptMgr::instance()->OnBeforePlayerReputationChange(player, factionId, repChange, ReputationSource::REPUTATION_SOURCE_SPELL); + ScriptMgr::instance()->OnBeforePlayerReputationChange(player, factionId, repChange, this); player->GetReputationMgr().ModifyReputation(factionEntry, repChange); } From 25614ba09f683756060c522bb0f6e4ff57e37b4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCssig?= Date: Sun, 2 Feb 2025 21:40:34 +0100 Subject: [PATCH 02/10] Fixed compile errors --- src/server/game/Entities/Player/Player.cpp | 60 +++++++++---------- src/server/game/Entities/Player/Player.h | 12 +--- src/server/game/Reputation/ReputationSource.h | 29 +++++++++ .../Scripting/ScriptDefines/PlayerScript.h | 5 +- src/server/game/Scripting/ScriptMgr.h | 3 +- src/server/game/Spells/SpellEffects.cpp | 4 +- 6 files changed, 65 insertions(+), 48 deletions(-) create mode 100644 src/server/game/Reputation/ReputationSource.h diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 3a07779ccc1e72..6e39c69dc49054 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5904,7 +5904,7 @@ float Player::CalculateReputationGain(ReputationSource source, uint32 creatureOr float repMod = noQuestBonus ? 0.0f : float(GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN)); // faction specific auras only seem to apply to kills - if (source == REPUTATION_SOURCE_KILL) + if (source == ReputationSource::Kill) repMod += GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, faction); percent += rep > 0.f ? repMod : -repMod; @@ -5912,17 +5912,17 @@ float Player::CalculateReputationGain(ReputationSource source, uint32 creatureOr float rate; switch (source) { - case REPUTATION_SOURCE_KILL: + case ReputationSource::Kill: rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_KILL); break; - case REPUTATION_SOURCE_QUEST: - case REPUTATION_SOURCE_DAILY_QUEST: - case REPUTATION_SOURCE_WEEKLY_QUEST: - case REPUTATION_SOURCE_MONTHLY_QUEST: - case REPUTATION_SOURCE_REPEATABLE_QUEST: + case ReputationSource::Quest: + case ReputationSource::DailyQuest: + case ReputationSource::WeeklyQuest: + case ReputationSource::MonthlyQuest: + case ReputationSource::RepeatableQuest: rate = sWorld->getRate(RATE_REPUTATION_LOWLEVEL_QUEST); break; - case REPUTATION_SOURCE_SPELL: + case ReputationSource::Spell: default: rate = 1.0f; break; @@ -5940,25 +5940,25 @@ float Player::CalculateReputationGain(ReputationSource source, uint32 creatureOr float repRate = 0.0f; switch (source) { - case REPUTATION_SOURCE_KILL: + case ReputationSource::Kill: repRate = repData->creatureRate; break; - case REPUTATION_SOURCE_QUEST: + case ReputationSource::Quest: repRate = repData->questRate; break; - case REPUTATION_SOURCE_DAILY_QUEST: + case ReputationSource::DailyQuest: repRate = repData->questDailyRate; break; - case REPUTATION_SOURCE_WEEKLY_QUEST: + case ReputationSource::WeeklyQuest: repRate = repData->questWeeklyRate; break; - case REPUTATION_SOURCE_MONTHLY_QUEST: + case ReputationSource::MonthlyQuest: repRate = repData->questMonthlyRate; break; - case REPUTATION_SOURCE_REPEATABLE_QUEST: + case ReputationSource::RepeatableQuest: repRate = repData->questRepeatableRate; break; - case REPUTATION_SOURCE_SPELL: + case ReputationSource::Spell: repRate = repData->spellRate; break; } @@ -5970,7 +5970,7 @@ float Player::CalculateReputationGain(ReputationSource source, uint32 creatureOr percent *= repRate; } - if (source != REPUTATION_SOURCE_SPELL && GetsRecruitAFriendBonus(false)) + if (source != ReputationSource::Spell && GetsRecruitAFriendBonus(false)) percent *= 1.0f + sWorld->getRate(RATE_REPUTATION_RECRUIT_A_FRIEND_BONUS); return CalculatePct(rep, percent); @@ -6005,8 +6005,8 @@ void Player::RewardReputation(Unit* victim) if (Rep->RepFaction1 && (!Rep->TeamDependent || teamId == TEAM_ALLIANCE)) { - float donerep1 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast(Rep->RepValue1), ChampioningFaction ? ChampioningFaction : Rep->RepFaction1); - ScriptMgr::instance()->OnBeforePlayerReputationChange(this, static_cast(Rep->RepValue1), donerep1, ReputationSource::REPUTATION_SOURCE_KILL); + float donerep1 = CalculateReputationGain(ReputationSource::Kill, victim->GetLevel(), static_cast(Rep->RepValue1), ChampioningFaction ? ChampioningFaction : Rep->RepFaction1); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, static_cast(Rep->RepValue1), donerep1, ReputationSource::Kill); ScriptMgr::instance()->OnBeforePlayerReputationChange(this, static_cast(Rep->RepValue1), donerep1, victim); FactionEntry const* factionEntry1 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction1); @@ -6018,8 +6018,8 @@ void Player::RewardReputation(Unit* victim) if (Rep->RepFaction2 && (!Rep->TeamDependent || teamId == TEAM_HORDE)) { - float donerep2 = CalculateReputationGain(REPUTATION_SOURCE_KILL, victim->GetLevel(), static_cast(Rep->RepValue2), ChampioningFaction ? ChampioningFaction : Rep->RepFaction2); - ScriptMgr::instance()->OnBeforePlayerReputationChange(this, static_cast(Rep->RepValue1), donerep2, ReputationSource::REPUTATION_SOURCE_KILL); + float donerep2 = CalculateReputationGain(ReputationSource::Kill, victim->GetLevel(), static_cast(Rep->RepValue2), ChampioningFaction ? ChampioningFaction : Rep->RepFaction2); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, static_cast(Rep->RepValue1), donerep2, ReputationSource::Kill); ScriptMgr::instance()->OnBeforePlayerReputationChange(this, static_cast(Rep->RepValue1), donerep2, victim); FactionEntry const* factionEntry2 = sFactionStore.LookupEntry(ChampioningFaction ? ChampioningFaction : Rep->RepFaction2); @@ -6059,28 +6059,28 @@ void Player::RewardReputation(Quest const* quest) if (quest->IsDaily()) { - rep = CalculateReputationGain(REPUTATION_SOURCE_DAILY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); - ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::REPUTATION_SOURCE_DAILY_QUEST); + rep = CalculateReputationGain(ReputationSource::DailyQuest, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::DailyQuest); } else if (quest->IsWeekly()) { - rep = CalculateReputationGain(REPUTATION_SOURCE_WEEKLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); - ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::REPUTATION_SOURCE_WEEKLY_QUEST); + rep = CalculateReputationGain(ReputationSource::WeeklyQuest, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::WeeklyQuest); } else if (quest->IsMonthly()) { - rep = CalculateReputationGain(REPUTATION_SOURCE_MONTHLY_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); - ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::REPUTATION_SOURCE_MONTHLY_QUEST); + rep = CalculateReputationGain(ReputationSource::MonthlyQuest, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::MonthlyQuest); } else if (quest->IsRepeatable()) { - rep = CalculateReputationGain(REPUTATION_SOURCE_REPEATABLE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); - ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::REPUTATION_SOURCE_REPEATABLE_QUEST); + rep = CalculateReputationGain(ReputationSource::RepeatableQuest, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::RepeatableQuest); } else { - rep = CalculateReputationGain(REPUTATION_SOURCE_QUEST, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); - ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::REPUTATION_SOURCE_QUEST); + rep = CalculateReputationGain(ReputationSource::Quest, GetQuestLevel(quest), rep, quest->RewardFactionId[i], false); + ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, ReputationSource::Quest); } ScriptMgr::instance()->OnBeforePlayerReputationChange(this, quest->RewardFactionId[i], rep, quest); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ae87e6aceb6fd7..066bd14837461a 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -36,6 +36,7 @@ #include "PlayerSettings.h" #include "PlayerTaxi.h" #include "QuestDef.h" +#include "ReputationSource.h" #include "SpellAuras.h" #include "SpellInfo.h" #include "TradeData.h" @@ -234,17 +235,6 @@ enum ActionButtonType ACTION_BUTTON_ITEM = 0x80 }; -enum ReputationSource -{ - REPUTATION_SOURCE_KILL, - REPUTATION_SOURCE_QUEST, - REPUTATION_SOURCE_DAILY_QUEST, - REPUTATION_SOURCE_WEEKLY_QUEST, - REPUTATION_SOURCE_MONTHLY_QUEST, - REPUTATION_SOURCE_REPEATABLE_QUEST, - REPUTATION_SOURCE_SPELL -}; - enum QuestSound { QUEST_SOUND_FAILURE = 847 diff --git a/src/server/game/Reputation/ReputationSource.h b/src/server/game/Reputation/ReputationSource.h new file mode 100644 index 00000000000000..e710dae2f68590 --- /dev/null +++ b/src/server/game/Reputation/ReputationSource.h @@ -0,0 +1,29 @@ +#ifndef __ACORE_REPUTATION_SOURCE_H +#define __ACORE_REPUTATION_SOURCE_H +#include "Define.h" + +/** + * @brief This enum represent all known sources a character can get reputation + */ +enum class ReputationSource : uint8 { + /// The player killed an enemy + Kill, + /// The player turned in a quest + Quest, + /// The player turned in a daily quest + DailyQuest, + /// The player turned in a weekly quest + WeeklyQuest, + /// The player turned in a montly quest + MonthlyQuest, + /// The player turned in a repeatable quest + RepeatableQuest, + /// The player used a spell + Spell, + /// The player get reputation by a console command + Console, + /// The player get some reputation by server configuration + Config +}; + +#endif diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index adc9a425182aa2..4c3921f844c598 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -18,6 +18,7 @@ #ifndef SCRIPT_OBJECT_PLAYER_SCRIPT_H_ #define SCRIPT_OBJECT_PLAYER_SCRIPT_H_ +#include "ReputationSource.h" #include "ScriptObject.h" #include "SharedDefines.h" #include @@ -26,8 +27,6 @@ #include "AchievementMgr.h" #include "KillRewarder.h" -enum ReputationSource; - enum PlayerHook { PLAYERHOOK_ON_PLAYER_JUST_DIED, @@ -287,7 +286,7 @@ class PlayerScript : public ScriptObject virtual void OnBeforeReputationChange(Player* player, uint32 factionId, float& amount, Spell* spell) {} // Called before a player gains or looses Reputation - virtual void OnBeforeReputationChange(Player* player, uint32 factionId, float& amount, ReputationSource reputationSource) {} + virtual void OnBeforeReputationChange(Player* /*player*/, uint32 /*factionId*/, float& /*amount*/, ReputationSource /*reputationSource*/) {} // Called when a player's reputation changes (before it is actually changed) virtual bool OnReputationChange(Player* /*player*/, uint32 /*factionID*/, int32& /*standing*/, bool /*incremental*/) { return true; } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 88878aa5f66f6e..25a4916e115d68 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -32,6 +32,7 @@ #include "LFGMgr.h" #include "ObjectMgr.h" #include "PetDefines.h" +#include "ReputationSource.h" #include "SharedDefines.h" #include "Tuples.h" #include "Weather.h" @@ -90,8 +91,6 @@ struct OutdoorPvPData; struct TargetInfo; struct SpellModifier; -enum ReputationSource; - namespace Acore::ChatCommands { struct ChatCommandBuilder; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index d736c1d8797e2f..7ddaf1c5e89cfc 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4747,8 +4747,8 @@ void Spell::EffectReputation(SpellEffIndex effIndex) if (!factionEntry) return; - repChange = player->CalculateReputationGain(REPUTATION_SOURCE_SPELL, 0, repChange, factionId); - ScriptMgr::instance()->OnBeforePlayerReputationChange(player, factionId, repChange, ReputationSource::REPUTATION_SOURCE_SPELL); + repChange = player->CalculateReputationGain(ReputationSource::Spell, 0, repChange, factionId); + ScriptMgr::instance()->OnBeforePlayerReputationChange(player, factionId, repChange, ReputationSource::Spell); ScriptMgr::instance()->OnBeforePlayerReputationChange(player, factionId, repChange, this); player->GetReputationMgr().ModifyReputation(factionEntry, repChange); } From f42e624584de9fbefb0f17f8848c138389e82902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCssig?= Date: Sun, 2 Feb 2025 21:41:22 +0100 Subject: [PATCH 03/10] Added doxygen documentation --- .../Scripting/ScriptDefines/PlayerScript.h | 54 ++++++++++++++++--- src/server/game/Scripting/ScriptMgr.h | 48 +++++++++++++++++ 2 files changed, 95 insertions(+), 7 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index 4c3921f844c598..dedce4637c9ab5 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -276,16 +276,56 @@ class PlayerScript : public ScriptObject // Called when a player gains XP (before anything is given) virtual void OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/, uint8 /*xpSource*/) { } - // Called before a player gains or looses Reputation - virtual void OnBeforeReputationChange(Player* player, uint32 factionId, float& amount, Unit* victim) {} + /** + * @brief Called before a player gains or looses Reputation + * + * @param [in] player instance of the current player + * @param [in] factionId id of the faction which reputation changes + * @param[in,out] amount the amount of reputation the player gets or loses + * @param[in] victim the unit which was killed to gain reputation + * + * @remark avoid hooking both versions of this event ReputationSource is a more generic one
+ * ReputationSource is called first + */ + virtual void OnBeforeReputationChange(Player* /*player*/, uint32 /*factionId*/, float& /*amount*/, Unit* /*victim*/ ) {} - // Called before a player gains or looses Reputation - virtual void OnBeforeReputationChange(Player* player, uint32 factionId, float& amount, Quest const* quest) {} + /** + * @brief Called before a player gains or looses Reputation + * + * @param [in] player instance of the current player + * @param [in] factionId id of the faction which reputation changes + * @param[in,out] amount the amount of reputation the player gets or loses + * @param[in] quest the quest which was turn in to gain reputation + * + * @remark avoid hooking both versions of this event ReputationSource is a more generic one
+ * ReputationSource is called first + */ + virtual void OnBeforeReputationChange(Player* /*player*/, uint32 /*factionId*/ , float& /*amount*/, Quest const* /*quest*/) {} - // Called before a player gains or looses Reputation - virtual void OnBeforeReputationChange(Player* player, uint32 factionId, float& amount, Spell* spell) {} + /** + * @brief Called before a player gains or looses Reputation + * + * @param [in] player instance of the current player + * @param [in] factionId id of the faction which reputation changes + * @param[in,out] amount the amount of reputation the player gets or loses + * @param[in] spell the spell which was used to gain reputation + * + * @remark avoid hooking both versions of this event ReputationSource is a more generic one
+ * ReputationSource is called first + */ + virtual void OnBeforeReputationChange(Player* /*player*/, uint32 /*factionId*/, float& /*amount*/ , Spell* /*spell*/) {} - // Called before a player gains or looses Reputation + /** + * @brief Called before a player gains or looses Reputation + * + * @param [in] player instance of the current player + * @param [in] factionId id of the faction which reputation changes + * @param[in,out] amount the amount of reputation the player gets or loses + * @param[in] reputationSource an enum which determinate the source used to gain or loose reputation + * + * @remark avoid hooking both versions of this event ReputationSource is a more generic one
+ * ReputationSource is called first + */ virtual void OnBeforeReputationChange(Player* /*player*/, uint32 /*factionId*/, float& /*amount*/, ReputationSource /*reputationSource*/) {} // Called when a player's reputation changes (before it is actually changed) diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 25a4916e115d68..2319b28ba003fd 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -312,9 +312,57 @@ class ScriptMgr void OnPlayerMoneyChanged(Player* player, int32& amount); void OnBeforeLootMoney(Player* player, Loot* loot); void OnGivePlayerXP(Player* player, uint32& amount, Unit* victim, uint8 xpSource); + + /** + * @brief Called before a player gains or looses Reputation + * + * @param [in] player instance of the current player + * @param [in] factionId id of the faction which reputation changes + * @param[in,out] amount the amount of reputation the player gets or loses + * @param[in] victim the unit which was killed to gain reputation + * + * @remark avoid hooking both versions of this event ReputationSource is a more generic one
+ * ReputationSource is called first + */ void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Unit* victim); + + /** + * @brief Called before a player gains or looses Reputation + * + * @param [in] player instance of the current player + * @param [in] factionId id of the faction which reputation changes + * @param[in,out] amount the amount of reputation the player gets or loses + * @param[in] quest the quest which was turn in to gain reputation + * + * @remark avoid hooking both versions of this event ReputationSource is a more generic one
+ * ReputationSource is called first + */ void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Quest const* quest); + + /** + * @brief Called before a player gains or looses Reputation + * + * @param [in] player instance of the current player + * @param [in] factionId id of the faction which reputation changes + * @param[in,out] amount the amount of reputation the player gets or loses + * @param[in] spell the spell which was used to gain reputation + * + * @remark avoid hooking both versions of this event ReputationSource is a more generic one
+ * ReputationSource is called first + */ void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Spell* spell); + + /** + * @brief Called before a player gains or looses Reputation + * + * @param [in] player instance of the current player + * @param [in] factionId id of the faction which reputation changes + * @param[in,out] amount the amount of reputation the player gets or loses + * @param[in] reputationSource an enum which determinate the source used to gain or loose reputation + * + * @remark avoid hooking both versions of this event ReputationSource is a more generic one
+ * ReputationSource is called first + */ void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, ReputationSource reputationSource); bool OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental); void OnPlayerReputationRankChange(Player* player, uint32 factionID, ReputationRank newRank, ReputationRank oldRank, bool increased); From 7d184aedae0df656040bfaacc83099da37a726f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCssig?= Date: Sun, 2 Feb 2025 21:44:34 +0100 Subject: [PATCH 04/10] update changelog to reflect changes to ReputationSource --- doc/changelog/pendings/changes_1738528920336381600.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 doc/changelog/pendings/changes_1738528920336381600.md diff --git a/doc/changelog/pendings/changes_1738528920336381600.md b/doc/changelog/pendings/changes_1738528920336381600.md new file mode 100644 index 00000000000000..c0c6635abb9f18 --- /dev/null +++ b/doc/changelog/pendings/changes_1738528920336381600.md @@ -0,0 +1,7 @@ +### How to upgrade + +enum ReputationSource is replaced by an enum class inside a new headerfile +If you want to use ReputationSource in your files you have to use `#include "ReputationSource.h` instead of `Player.h` +Names also changed to match naming convention + + From 89ae833cd36525616c3d2a3b5e97d99c28f31159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCssig?= Date: Sun, 2 Feb 2025 21:51:22 +0100 Subject: [PATCH 05/10] fixed whitespace coding style issues --- .../Scripting/ScriptDefines/PlayerScript.h | 20 ++++++++----------- src/server/game/Scripting/ScriptMgr.h | 18 ++++++++--------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index dedce4637c9ab5..c22b429e72f358 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -283,9 +283,8 @@ class PlayerScript : public ScriptObject * @param [in] factionId id of the faction which reputation changes * @param[in,out] amount the amount of reputation the player gets or loses * @param[in] victim the unit which was killed to gain reputation - * - * @remark avoid hooking both versions of this event ReputationSource is a more generic one
- * ReputationSource is called first + * @remark avoid hooking both versions of this event ReputationSource is a more generic one.
+ * ReputationSource is called first. */ virtual void OnBeforeReputationChange(Player* /*player*/, uint32 /*factionId*/, float& /*amount*/, Unit* /*victim*/ ) {} @@ -296,9 +295,8 @@ class PlayerScript : public ScriptObject * @param [in] factionId id of the faction which reputation changes * @param[in,out] amount the amount of reputation the player gets or loses * @param[in] quest the quest which was turn in to gain reputation - * - * @remark avoid hooking both versions of this event ReputationSource is a more generic one
- * ReputationSource is called first + * @remark avoid hooking both versions of this event ReputationSource is a more generic one.
+ * ReputationSource is called first. */ virtual void OnBeforeReputationChange(Player* /*player*/, uint32 /*factionId*/ , float& /*amount*/, Quest const* /*quest*/) {} @@ -309,9 +307,8 @@ class PlayerScript : public ScriptObject * @param [in] factionId id of the faction which reputation changes * @param[in,out] amount the amount of reputation the player gets or loses * @param[in] spell the spell which was used to gain reputation - * - * @remark avoid hooking both versions of this event ReputationSource is a more generic one
- * ReputationSource is called first + * @remark avoid hooking both versions of this event ReputationSource is a more generic one.
+ * ReputationSource is called first. */ virtual void OnBeforeReputationChange(Player* /*player*/, uint32 /*factionId*/, float& /*amount*/ , Spell* /*spell*/) {} @@ -322,9 +319,8 @@ class PlayerScript : public ScriptObject * @param [in] factionId id of the faction which reputation changes * @param[in,out] amount the amount of reputation the player gets or loses * @param[in] reputationSource an enum which determinate the source used to gain or loose reputation - * - * @remark avoid hooking both versions of this event ReputationSource is a more generic one
- * ReputationSource is called first + * @remark avoid hooking both versions of this event ReputationSource is a more generic one.
+ * ReputationSource is called first. */ virtual void OnBeforeReputationChange(Player* /*player*/, uint32 /*factionId*/, float& /*amount*/, ReputationSource /*reputationSource*/) {} diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 2319b28ba003fd..2cddffca73b451 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -321,8 +321,8 @@ class ScriptMgr * @param[in,out] amount the amount of reputation the player gets or loses * @param[in] victim the unit which was killed to gain reputation * - * @remark avoid hooking both versions of this event ReputationSource is a more generic one
- * ReputationSource is called first + * @remark avoid hooking both versions of this event ReputationSource is a more generic one.
+ * ReputationSource is called first. */ void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Unit* victim); @@ -333,9 +333,8 @@ class ScriptMgr * @param [in] factionId id of the faction which reputation changes * @param[in,out] amount the amount of reputation the player gets or loses * @param[in] quest the quest which was turn in to gain reputation - * - * @remark avoid hooking both versions of this event ReputationSource is a more generic one
- * ReputationSource is called first + * @remark avoid hooking both versions of this event ReputationSource is a more generic one.
+ * ReputationSource is called first. */ void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Quest const* quest); @@ -346,9 +345,8 @@ class ScriptMgr * @param [in] factionId id of the faction which reputation changes * @param[in,out] amount the amount of reputation the player gets or loses * @param[in] spell the spell which was used to gain reputation - * - * @remark avoid hooking both versions of this event ReputationSource is a more generic one
- * ReputationSource is called first + * @remark avoid hooking both versions of this event ReputationSource is a more generic one.
+ * ReputationSource is called first. */ void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, Spell* spell); @@ -360,8 +358,8 @@ class ScriptMgr * @param[in,out] amount the amount of reputation the player gets or loses * @param[in] reputationSource an enum which determinate the source used to gain or loose reputation * - * @remark avoid hooking both versions of this event ReputationSource is a more generic one
- * ReputationSource is called first + * @remark avoid hooking both versions of this event ReputationSource is a more generic one.
+ * ReputationSource is called first. */ void OnBeforePlayerReputationChange(Player* player, uint32 factionId, float& amount, ReputationSource reputationSource); bool OnPlayerReputationChange(Player* player, uint32 factionID, int32& standing, bool incremental); From 92e91ee028d075b286cf8d44c4aefec75e37e137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCssig?= Date: Mon, 3 Feb 2025 23:04:51 +0100 Subject: [PATCH 06/10] Removed changelog --- doc/changelog/pendings/changes_1738413856259593500.md | 3 --- doc/changelog/pendings/changes_1738528920336381600.md | 7 ------- 2 files changed, 10 deletions(-) delete mode 100644 doc/changelog/pendings/changes_1738413856259593500.md delete mode 100644 doc/changelog/pendings/changes_1738528920336381600.md diff --git a/doc/changelog/pendings/changes_1738413856259593500.md b/doc/changelog/pendings/changes_1738413856259593500.md deleted file mode 100644 index f93ee50122f30b..00000000000000 --- a/doc/changelog/pendings/changes_1738413856259593500.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- new hooks OnBeforeReputationGained for Unit, Quest, Spell and ReputationSource, ReputationSource is called before a more detailed verion which contains an instance of the object diff --git a/doc/changelog/pendings/changes_1738528920336381600.md b/doc/changelog/pendings/changes_1738528920336381600.md deleted file mode 100644 index c0c6635abb9f18..00000000000000 --- a/doc/changelog/pendings/changes_1738528920336381600.md +++ /dev/null @@ -1,7 +0,0 @@ -### How to upgrade - -enum ReputationSource is replaced by an enum class inside a new headerfile -If you want to use ReputationSource in your files you have to use `#include "ReputationSource.h` instead of `Player.h` -Names also changed to match naming convention - - From 84a8f3c1cb81ee0cb12f6f89415aee0c6739f9a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCssig?= Date: Tue, 4 Feb 2025 16:39:20 +0100 Subject: [PATCH 07/10] Include more ReputationSources --- src/server/game/Battlegrounds/Battleground.cpp | 3 +++ src/server/game/Handlers/CharacterHandler.cpp | 7 +++++-- src/server/game/Reputation/ReputationSource.h | 2 ++ src/server/scripts/Commands/cs_modify.cpp | 6 ++++-- src/server/scripts/Commands/cs_quest.cpp | 9 +++++++-- src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp | 9 +++++++-- 6 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 454bb3e4f875c5..da29bca72a3b3f 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -744,7 +744,10 @@ void Battleground::RewardReputationToTeam(uint32 factionId, uint32 reputation, T AddPct(repGain, itr->second->GetTotalAuraModifier(SPELL_AURA_MOD_REPUTATION_GAIN)); AddPct(repGain, itr->second->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_FACTION_REPUTATION_GAIN, realFactionId)); if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(realFactionId)) + { + ScriptMgr::instance()->OnBeforePlayerReputationChange(itr->second, factionId, repGain, ReputationSource::PvP); itr->second->GetReputationMgr().ModifyReputation(factionEntry, repGain); + } } } diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index b5d85760e5ad9c..83e24921736ffe 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1017,11 +1017,14 @@ void WorldSession::HandlePlayerLoginFromDB(LoginQueryHolder const& holder) { ReputationMgr& repMgr = pCurrChar->GetReputationMgr(); - auto SendFullReputation = [&repMgr](std::initializer_list factionsList) + auto SendFullReputation = [&repMgr, pCurrChar](std::initializer_list factionsList) { for (auto const& itr : factionsList) { - repMgr.SetOneFactionReputation(sFactionStore.LookupEntry(itr), 42999.f, false); + auto faction = sFactionStore.LookupEntry(itr); + float reputation = 42999.f; + ScriptMgr::instance()->OnBeforePlayerReputationChange(pCurrChar, faction->ID, reputation, ReputationSource::Config); + repMgr.SetOneFactionReputation(sFactionStore.LookupEntry(itr), reputation, false); } }; diff --git a/src/server/game/Reputation/ReputationSource.h b/src/server/game/Reputation/ReputationSource.h index e710dae2f68590..e3f55e624f473b 100644 --- a/src/server/game/Reputation/ReputationSource.h +++ b/src/server/game/Reputation/ReputationSource.h @@ -20,6 +20,8 @@ enum class ReputationSource : uint8 { RepeatableQuest, /// The player used a spell Spell, + // The player get reputation by doing PvP related tasks + PvP, /// The player get reputation by a console command Console, /// The player get some reputation by server configuration diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index df975ac6e25267..5e59f4575c1e80 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -29,6 +29,7 @@ EndScriptData */ #include "Pet.h" #include "Player.h" #include "ReputationMgr.h" +#include "ScriptMgr.h" #include "StringConvert.h" using namespace Acore::ChatCommands; @@ -826,8 +827,9 @@ class modify_commandscript : public CommandScript handler->SendErrorMessage(LANG_COMMAND_FACTION_NOREP_ERROR, factionEntry->name[handler->GetSessionDbcLocale()], factionId); return false; } - - target->GetReputationMgr().SetOneFactionReputation(factionEntry, float(amount), false); + float rep = target->GetReputationMgr().GetReputation(factionId) - float(amount); + ScriptMgr::instance()->OnBeforePlayerReputationChange(target, factionId, rep, ReputationSource::Console); + target->GetReputationMgr().SetOneFactionReputation(factionEntry, rep, false); target->GetReputationMgr().SendState(target->GetReputationMgr().GetState(factionEntry)); handler->PSendSysMessage(LANG_COMMAND_MODIFY_REP, factionEntry->name[handler->GetSessionDbcLocale()], factionId, diff --git a/src/server/scripts/Commands/cs_quest.cpp b/src/server/scripts/Commands/cs_quest.cpp index ba7cf4ebb606a6..28fe1ae358e8e8 100644 --- a/src/server/scripts/Commands/cs_quest.cpp +++ b/src/server/scripts/Commands/cs_quest.cpp @@ -28,6 +28,7 @@ EndScriptData */ #include "ObjectMgr.h" #include "Player.h" #include "ReputationMgr.h" +#include "ScriptMgr.h" using namespace Acore::ChatCommands; @@ -309,7 +310,9 @@ class quest_commandscript : public CommandScript { if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(repFaction)) { - player->GetReputationMgr().SetReputation(factionEntry, static_cast(repValue)); + auto repDiv = static_cast(repValue - curRep); + ScriptMgr::instance()->OnBeforePlayerReputationChange(player, repFaction, repDiv, ReputationSource::Console); + player->GetReputationMgr().SetReputation(factionEntry, repDiv + curRep); } } } @@ -323,7 +326,9 @@ class quest_commandscript : public CommandScript { if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(repFaction)) { - player->GetReputationMgr().SetReputation(factionEntry, static_cast(repValue2)); + auto repDiv = static_cast(repValue2 - curRep); + ScriptMgr::instance()->OnBeforePlayerReputationChange(player, repFaction, repDiv, ReputationSource::Console); + player->GetReputationMgr().SetReputation(factionEntry, repDiv + curRep); } } } diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp index 357f810ea81ba6..a0d099d09e57d0 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp @@ -25,6 +25,7 @@ #include "OutdoorPvPScript.h" #include "Player.h" #include "ReputationMgr.h" +#include "ScriptMgr.h" #include "Transport.h" #include "World.h" #include "WorldPacket.h" @@ -114,7 +115,9 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 trigger) // add 19 honor player->RewardHonor(nullptr, 1, 19); // add 20 cenarion circle repu - player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), 20.f); + float reputation = 20.f; + ScriptMgr::instance()->OnBeforePlayerReputationChange(player, 609, reputation, ReputationSource::PvP); + player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), reputation); // complete quest player->KilledMonsterCredit(SI_TURNIN_QUEST_CM_A); } @@ -140,7 +143,9 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 trigger) // add 19 honor player->RewardHonor(nullptr, 1, 19); // add 20 cenarion circle repu - player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), 20.f); + float reputation = 20.f; + ScriptMgr::instance()->OnBeforePlayerReputationChange(player, 609, reputation, ReputationSource::PvP); + player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), reputation); // complete quest player->KilledMonsterCredit(SI_TURNIN_QUEST_CM_H); } From a1247d94cf659decf0abc7c70d907551e8561eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCssig?= Date: Tue, 4 Feb 2025 21:24:42 +0100 Subject: [PATCH 08/10] Move ReputationSource back into Player.h --- src/server/game/Entities/Player/Player.h | 27 +++++++++++++++- src/server/game/Reputation/ReputationSource.h | 31 ------------------- .../Scripting/ScriptDefines/PlayerScript.h | 2 +- src/server/game/Scripting/ScriptMgr.h | 2 +- 4 files changed, 28 insertions(+), 34 deletions(-) delete mode 100644 src/server/game/Reputation/ReputationSource.h diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 066bd14837461a..c7f5eb76a74163 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -36,7 +36,6 @@ #include "PlayerSettings.h" #include "PlayerTaxi.h" #include "QuestDef.h" -#include "ReputationSource.h" #include "SpellAuras.h" #include "SpellInfo.h" #include "TradeData.h" @@ -235,6 +234,32 @@ enum ActionButtonType ACTION_BUTTON_ITEM = 0x80 }; +/** + * @brief This enum represent all known sources a character can get reputation + */ +enum class ReputationSource : uint8 { + /// The player killed an enemy + Kill, + /// The player turned in a quest + Quest, + /// The player turned in a daily quest + DailyQuest, + /// The player turned in a weekly quest + WeeklyQuest, + /// The player turned in a montly quest + MonthlyQuest, + /// The player turned in a repeatable quest + RepeatableQuest, + /// The player used a spell + Spell, + // The player get reputation by doing PvP related tasks + PvP, + /// The player get reputation by a console command + Console, + /// The player get some reputation by server configuration + Config +}; + enum QuestSound { QUEST_SOUND_FAILURE = 847 diff --git a/src/server/game/Reputation/ReputationSource.h b/src/server/game/Reputation/ReputationSource.h deleted file mode 100644 index e3f55e624f473b..00000000000000 --- a/src/server/game/Reputation/ReputationSource.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef __ACORE_REPUTATION_SOURCE_H -#define __ACORE_REPUTATION_SOURCE_H -#include "Define.h" - -/** - * @brief This enum represent all known sources a character can get reputation - */ -enum class ReputationSource : uint8 { - /// The player killed an enemy - Kill, - /// The player turned in a quest - Quest, - /// The player turned in a daily quest - DailyQuest, - /// The player turned in a weekly quest - WeeklyQuest, - /// The player turned in a montly quest - MonthlyQuest, - /// The player turned in a repeatable quest - RepeatableQuest, - /// The player used a spell - Spell, - // The player get reputation by doing PvP related tasks - PvP, - /// The player get reputation by a console command - Console, - /// The player get some reputation by server configuration - Config -}; - -#endif diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.h b/src/server/game/Scripting/ScriptDefines/PlayerScript.h index c22b429e72f358..afd2814e7f53fd 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.h +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.h @@ -18,7 +18,7 @@ #ifndef SCRIPT_OBJECT_PLAYER_SCRIPT_H_ #define SCRIPT_OBJECT_PLAYER_SCRIPT_H_ -#include "ReputationSource.h" +#include "Player.h" #include "ScriptObject.h" #include "SharedDefines.h" #include diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 2cddffca73b451..cb9fda274ed6ec 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -32,7 +32,7 @@ #include "LFGMgr.h" #include "ObjectMgr.h" #include "PetDefines.h" -#include "ReputationSource.h" +#include "Player.h" #include "SharedDefines.h" #include "Tuples.h" #include "Weather.h" From 45c745b4c2ae9d3e1c8e921bbcaf5aeb1a6340f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCssig?= Date: Wed, 5 Feb 2025 17:08:37 +0100 Subject: [PATCH 09/10] Update src/server/game/Entities/Player/Player.cpp added default case to switch Co-authored-by: Kitzunu <24550914+Kitzunu@users.noreply.github.com> --- src/server/game/Entities/Player/Player.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 6e39c69dc49054..a2f0a73dbe7563 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -5961,6 +5961,8 @@ float Player::CalculateReputationGain(ReputationSource source, uint32 creatureOr case ReputationSource::Spell: repRate = repData->spellRate; break; + default: + break; } // for custom, a rate of 0.0 will totally disable reputation gain for this faction/type From fe53f22dc7be2fad73a9ab90383af45aec23a138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCssig?= Date: Wed, 5 Feb 2025 22:08:23 +0100 Subject: [PATCH 10/10] More style fixes --- src/server/game/Entities/Player/Player.h | 3 ++- src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index c7f5eb76a74163..c0d975b6b9d5fc 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -237,7 +237,8 @@ enum ActionButtonType /** * @brief This enum represent all known sources a character can get reputation */ -enum class ReputationSource : uint8 { +enum class ReputationSource : uint8 +{ /// The player killed an enemy Kill, /// The player turned in a quest diff --git a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp index a0d099d09e57d0..5554e77534f4bc 100644 --- a/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp +++ b/src/server/scripts/OutdoorPvP/OutdoorPvPSI.cpp @@ -116,7 +116,7 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 trigger) player->RewardHonor(nullptr, 1, 19); // add 20 cenarion circle repu float reputation = 20.f; - ScriptMgr::instance()->OnBeforePlayerReputationChange(player, 609, reputation, ReputationSource::PvP); + sScriptMgr->OnBeforePlayerReputationChange(player, 609, reputation, ReputationSource::PvP); player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), reputation); // complete quest player->KilledMonsterCredit(SI_TURNIN_QUEST_CM_A); @@ -144,7 +144,7 @@ bool OutdoorPvPSI::HandleAreaTrigger(Player* player, uint32 trigger) player->RewardHonor(nullptr, 1, 19); // add 20 cenarion circle repu float reputation = 20.f; - ScriptMgr::instance()->OnBeforePlayerReputationChange(player, 609, reputation, ReputationSource::PvP); + sScriptMgr->OnBeforePlayerReputationChange(player, 609, reputation, ReputationSource::PvP); player->GetReputationMgr().ModifyReputation(sFactionStore.LookupEntry(609), reputation); // complete quest player->KilledMonsterCredit(SI_TURNIN_QUEST_CM_H);