diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index c9c4cd53e1d22..f35f82d2ab7eb 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -1061,13 +1061,17 @@ bool BGQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime)) { // track if player leaves the BG by not clicking enter button - if (bg && bg->isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS) && - (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN)) + if (bg && bg->isBattleground() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN)) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); - stmt->setUInt32(0, player->GetGUIDLow()); - stmt->setUInt8(1, BG_DESERTION_TYPE_NO_ENTER_BUTTON); - CharacterDatabase.Execute(stmt); + if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS)) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); + stmt->setUInt32(0, player->GetGUIDLow()); + stmt->setUInt8(1, BG_DESERTION_TYPE_NO_ENTER_BUTTON); + CharacterDatabase.Execute(stmt); + } + + sScriptMgr->OnBattlegroundDesertion(player, BG_DESERTION_TYPE_NO_ENTER_BUTTON); } player->RemoveBattlegroundQueueId(m_BgQueueTypeId); bgQueue.RemovePlayer(m_PlayerGuid, false, queueSlot); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 465bb91a844bf..c57a1c0bbb713 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22865,13 +22865,16 @@ void Player::LeaveBattleground(Battleground* bg) return; // Deserter tracker - leave BG - if (bg->isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS) - && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN)) + if (bg->isBattleground() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN)) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); - stmt->setUInt32(0, GetGUIDLow()); - stmt->setUInt8(1, BG_DESERTION_TYPE_LEAVE_BG); - CharacterDatabase.Execute(stmt); + if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS)) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); + stmt->setUInt32(0, GetGUIDLow()); + stmt->setUInt8(1, BG_DESERTION_TYPE_LEAVE_BG); + CharacterDatabase.Execute(stmt); + } + sScriptMgr->OnBattlegroundDesertion(this, BG_DESERTION_TYPE_LEAVE_BG); } // xinef: reset corpse reclaim time diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 4b6c9a157fbe5..6f52d96fe1698 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -471,13 +471,17 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket& recvData) bgQueue.RemovePlayer(_player->GetGUID(), false, queueSlot); _player->RemoveBattlegroundQueueId(bgQueueTypeId); // track if player refuses to join the BG after being invited - if (bg->isBattleground() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS) && - (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN)) + if (bg->isBattleground() && (bg->GetStatus() == STATUS_IN_PROGRESS || bg->GetStatus() == STATUS_WAIT_JOIN)) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); - stmt->setUInt32(0, _player->GetGUIDLow()); - stmt->setUInt8(1, BG_DESERTION_TYPE_LEAVE_QUEUE); - CharacterDatabase.Execute(stmt); + if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS)) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); + stmt->setUInt32(0, _player->GetGUIDLow()); + stmt->setUInt8(1, BG_DESERTION_TYPE_LEAVE_QUEUE); + CharacterDatabase.Execute(stmt); + } + + sScriptMgr->OnBattlegroundDesertion(_player, BG_DESERTION_TYPE_LEAVE_QUEUE); } } break; diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 75e55e1b818dc..ce2418e5b94fe 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -1339,6 +1339,11 @@ void ScriptMgr::OnPlayerCompleteQuest(Player* player, Quest const* quest) FOREACH_SCRIPT(PlayerScript)->OnPlayerCompleteQuest(player, quest); } +void ScriptMgr::OnBattlegroundDesertion(Player* player, BattlegroundDesertionType const desertionType) +{ + FOREACH_SCRIPT(PlayerScript)->OnBattlegroundDesertion(player, desertionType); +} + void ScriptMgr::OnPlayerReleasedGhost(Player* player) { FOREACH_SCRIPT(PlayerScript)->OnPlayerReleasedGhost(player); diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 90404e9b4136c..6fd904c35d566 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -7,6 +7,7 @@ #ifndef SC_SCRIPTMGR_H #define SC_SCRIPTMGR_H +#include "Battleground.h" #include "Common.h" #include "ObjectMgr.h" #include "DBCStores.h" @@ -744,6 +745,9 @@ class PlayerScript : public ScriptObject public: virtual void OnPlayerReleasedGhost(Player* /*player*/) { } + // Called when a player does a desertion action (see BattlegroundDesertionType) + virtual void OnBattlegroundDesertion(Player* /*player*/, BattlegroundDesertionType const /*desertionType*/) { } + // Called when a player completes a quest virtual void OnPlayerCompleteQuest(Player* /*player*/, Quest const* /*quest_id*/) { } @@ -1394,6 +1398,7 @@ class ScriptMgr void OnBeforeInitTalentForLevel(Player* player, uint8& level, uint32& talentPointsForLevel); void OnFirstLogin(Player* player); void OnPlayerCompleteQuest(Player* player, Quest const* quest); + void OnBattlegroundDesertion(Player* player, BattlegroundDesertionType const desertionType); bool CanJoinInBattlegroundQueue(Player* player, uint64 BattlemasterGuid, BattlegroundTypeId BGTypeID, uint8 joinAsGroup, GroupJoinBattlegroundResult& err); bool ShouldBeRewardedWithMoneyInsteadOfExp(Player* player); void OnBeforeTempSummonInitStats(Player* player, TempSummon* tempSummon, uint32& duration); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 4eefe52138db6..372d01587fca8 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -513,12 +513,16 @@ void WorldSession::LogoutPlayer(bool save) _player->RemoveBattlegroundQueueId(bgQueueTypeId); sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId).RemovePlayer(_player->GetGUID(), false, i); // track if player logs out after invited to join BG - if (_player->IsInvitedForBattlegroundInstance() && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS)) + if (_player->IsInvitedForBattlegroundInstance()) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); - stmt->setUInt32(0, _player->GetGUIDLow()); - stmt->setUInt8(1, BG_DESERTION_TYPE_INVITE_LOGOUT); - CharacterDatabase.Execute(stmt); + if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_TRACK_DESERTERS)) + { + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_DESERTER_TRACK); + stmt->setUInt32(0, _player->GetGUIDLow()); + stmt->setUInt8(1, BG_DESERTION_TYPE_INVITE_LOGOUT); + CharacterDatabase.Execute(stmt); + } + sScriptMgr->OnBattlegroundDesertion(_player, BG_DESERTION_TYPE_INVITE_LOGOUT); } }