From 444793346de74d54a7b0b5cb9d9fc62be5772076 Mon Sep 17 00:00:00 2001 From: AnchyDev <35346484+AnchyDev@users.noreply.github.com> Date: Sat, 6 May 2023 11:39:36 +1000 Subject: [PATCH] feat(Core/Hooks): Add parameter to detect XP origin for OnGiveXP hook. (#16109) Added enum parameter to detect where XP originated from. --- src/server/game/Entities/Player/KillRewarder.cpp | 1 + src/server/game/Entities/Player/Player.cpp | 9 ++++++--- src/server/game/Entities/Player/Player.h | 10 ++++++++++ src/server/game/Entities/Player/PlayerQuest.cpp | 1 + .../game/Scripting/ScriptDefines/PlayerScript.cpp | 4 ++-- src/server/game/Scripting/ScriptMgr.h | 4 ++-- 6 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/server/game/Entities/Player/KillRewarder.cpp b/src/server/game/Entities/Player/KillRewarder.cpp index 7ea1c821d..e73930602 100644 --- a/src/server/game/Entities/Player/KillRewarder.cpp +++ b/src/server/game/Entities/Player/KillRewarder.cpp @@ -166,6 +166,7 @@ void KillRewarder::_RewardXP(Player* player, float rate) AddPct(xp, (*i)->GetAmount()); // 4.2.3. Give XP to player. + sScriptMgr->OnGivePlayerXP(player, xp, _victim, PlayerXPSource::XPSOURCE_KILL); player->GiveXP(xp, _victim, _groupRate); if (Pet* pet = player->GetPet()) // 4.2.4. If player has pet, reward pet with XP (100% for single player, 50% for group case). diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index af3df4f38..a8925a7b6 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2372,8 +2372,6 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate, bool isLFGReward) uint8 level = GetLevel(); - sScriptMgr->OnGivePlayerXP(this, xp, victim); - // Favored experience increase START uint32 zone = GetZoneId(); float favored_exp_mult = 0; @@ -5730,6 +5728,7 @@ void Player::CheckAreaExploreAndOutdoor() XP = uint32(sObjectMgr->GetBaseXP(areaEntry->area_level) * sWorld->getRate(RATE_XP_EXPLORE)); } + sScriptMgr->OnGivePlayerXP(this, XP, nullptr, PlayerXPSource::XPSOURCE_EXPLORE); GiveXP(XP, nullptr); SendExplorationExperience(areaId, XP); } @@ -6119,7 +6118,11 @@ bool Player::RewardHonor(Unit* uVictim, uint32 groupsize, int32 honor, bool awar bg->UpdatePlayerScore(this, SCORE_BONUS_HONOR, honor, false); //false: prevent looping // Xinef: Only for BG activities if (!uVictim) - GiveXP(uint32(honor * (3 + GetLevel() * 0.30f)), nullptr); + { + uint32 xp = uint32(honor * (3 + GetLevel() * 0.30f)); + sScriptMgr->OnGivePlayerXP(this, xp, nullptr, PlayerXPSource::XPSOURCE_BATTLEGROUND); + GiveXP(xp, nullptr); + } } if (sWorld->getBoolConfig(CONFIG_PVP_TOKEN_ENABLE)) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index ead737bce..1185f058b 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -995,6 +995,16 @@ enum PlayerCommandStates CHEAT_WATERWALK = 0x10 }; +// Used for OnGiveXP PlayerScript hook +enum PlayerXPSource +{ + XPSOURCE_KILL = 0, + XPSOURCE_QUEST = 1, + XPSOURCE_QUEST_DF = 2, + XPSOURCE_EXPLORE = 3, + XPSOURCE_BATTLEGROUND = 4 +}; + enum InstantFlightGossipAction { GOSSIP_ACTION_TOGGLE_INSTANT_FLIGHT = 500 diff --git a/src/server/game/Entities/Player/PlayerQuest.cpp b/src/server/game/Entities/Player/PlayerQuest.cpp index a7793122e..4056534a7 100644 --- a/src/server/game/Entities/Player/PlayerQuest.cpp +++ b/src/server/game/Entities/Player/PlayerQuest.cpp @@ -756,6 +756,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, } else { + sScriptMgr->OnGivePlayerXP(this, XP, nullptr, isLFGReward ? PlayerXPSource::XPSOURCE_QUEST_DF : PlayerXPSource::XPSOURCE_QUEST); GiveXP(XP, nullptr, isLFGReward); } diff --git a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp index 03254d66c..6b7be2ca5 100644 --- a/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/PlayerScript.cpp @@ -154,11 +154,11 @@ void ScriptMgr::OnBeforeLootMoney(Player* player, Loot* loot) }); } -void ScriptMgr::OnGivePlayerXP(Player* player, uint32& amount, Unit* victim) +void ScriptMgr::OnGivePlayerXP(Player* player, uint32& amount, Unit* victim, uint8 xpSource) { ExecuteScript([&](PlayerScript* script) { - script->OnGiveXP(player, amount, victim); + script->OnGiveXP(player, amount, victim, xpSource); }); } diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 103553217..241e54991 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -1035,7 +1035,7 @@ public: virtual void OnBeforeLootMoney(Player* /*player*/, Loot* /*loot*/) {} // Called when a player gains XP (before anything is given) - virtual void OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/) { } + virtual void OnGiveXP(Player* /*player*/, uint32& /*amount*/, Unit* /*victim*/, uint8 /*xpSource*/) { } // 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; } @@ -2240,7 +2240,7 @@ public: /* PlayerScript */ void OnPlayerTalentsReset(Player* player, bool noCost); void OnPlayerMoneyChanged(Player* player, int32& amount); void OnBeforeLootMoney(Player* player, Loot* loot); - void OnGivePlayerXP(Player* player, uint32& amount, Unit* victim); + void OnGivePlayerXP(Player* player, uint32& amount, Unit* victim, uint8 xpSource); 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);