From 049386b93662ad62ea6f779ed5832865ffbde242 Mon Sep 17 00:00:00 2001 From: Kargatum Date: Mon, 18 Jun 2018 02:00:20 +0700 Subject: [PATCH] Core/Scripts: Add BGScripts and new hooks * OnBattlegroudStart * OnBattlegroudEndReward * OnBattlegroudUpdate * OnBattlegroudAddPlayer --- .../game/Battlegrounds/Battleground.cpp | 8 +++++ src/server/game/Scripting/ScriptMgr.cpp | 30 +++++++++++++++++++ src/server/game/Scripting/ScriptMgr.h | 30 +++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index 768a4143e..fdddb32dd 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -281,6 +281,8 @@ void Battleground::Update(uint32 diff) m_ResetStatTimer += diff; PostUpdateImpl(diff); + + sScriptMgr->OnBattlegroudUpdate(this, diff); } inline void Battleground::_CheckSafePositions(uint32 diff) @@ -581,6 +583,8 @@ inline void Battleground::_ProcessJoin(uint32 diff) // Announce BG starting if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE)) sWorld->SendWorldText(LANG_BG_STARTED_ANNOUNCE_WORLD, GetName(), std::min(GetMinLevel(), (uint32)80), std::min(GetMaxLevel(), (uint32)80)); + + sScriptMgr->OnBattlegroudStart(this); } } } @@ -974,6 +978,8 @@ void Battleground::EndBattleground(TeamId winnerTeamId) uint32 loser_kills = player->GetRandomWinner() ? BG_REWARD_LOSER_HONOR_LAST : BG_REWARD_LOSER_HONOR_FIRST; uint32 winner_arena = player->GetRandomWinner() ? BG_REWARD_WINNER_ARENA_LAST : BG_REWARD_WINNER_ARENA_FIRST; + sScriptMgr->OnBattlegroudEndReward(this, player, winnerTeamId); + // Reward winner team if (bgTeamId == winnerTeamId) { @@ -1253,6 +1259,8 @@ void Battleground::AddPlayer(Player* player) PlayerAddedToBGCheckIfBGIsRunning(player); AddOrSetPlayerToCorrectBgGroup(player, teamId); + sScriptMgr->OnBattlegroudAddPlayer(this, player); + // Log #if defined(ENABLE_EXTRAS) && defined(ENABLE_EXTRA_LOGS) sLog->outDetail("BATTLEGROUND: Player %s joined the battle.", player->GetName().c_str()); diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index dea2cf081..ee261e1b1 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -57,6 +57,7 @@ template class ScriptRegistry; template class ScriptRegistry; template class ScriptRegistry; template class ScriptRegistry; +template class ScriptRegistry; #include "ScriptMgrMacros.h" @@ -207,6 +208,7 @@ void ScriptMgr::Unload() SCR_CLEAR(GroupScript); SCR_CLEAR(GlobalScript); SCR_CLEAR(ModuleScript); + SCR_CLEAR(BGScript); #undef SCR_CLEAR } @@ -276,6 +278,7 @@ void ScriptMgr::CheckIfScriptsInDatabaseExist() !ScriptRegistry::GetScriptById(sid) && !ScriptRegistry::GetScriptById(sid) && !ScriptRegistry::GetScriptById(sid) && + !ScriptRegistry::GetScriptById(sid) && !ScriptRegistry::GetScriptById(sid)) sLog->outErrorDb("Script named '%s' is assigned in database, but has no code!", (*itr).c_str()); } @@ -1960,6 +1963,27 @@ void ScriptMgr::OnAfterArenaRatingCalculation(Battleground *const bg, int32 &win FOREACH_SCRIPT(FormulaScript)->OnAfterArenaRatingCalculation(bg, winnerMatchmakerChange, loserMatchmakerChange, winnerChange, loserChange); } +// BGScript +void ScriptMgr::OnBattlegroudStart(Battleground* bg) +{ + FOREACH_SCRIPT(BGScript)->OnBattlegroudStart(bg); +} + +void ScriptMgr::OnBattlegroudEndReward(Battleground* bg, Player* player, TeamId winnerTeamId) +{ + FOREACH_SCRIPT(BGScript)->OnBattlegroudEndReward(bg, player, winnerTeamId); +} + +void ScriptMgr::OnBattlegroudUpdate(Battleground* bg, uint32 diff) +{ + FOREACH_SCRIPT(BGScript)->OnBattlegroudUpdate(bg, diff); +} + +void ScriptMgr::OnBattlegroudAddPlayer(Battleground* bg, Player* player) +{ + FOREACH_SCRIPT(BGScript)->OnBattlegroudAddPlayer(bg, player); +} + AllMapScript::AllMapScript(const char* name) : ScriptObject(name) { @@ -2135,6 +2159,12 @@ GlobalScript::GlobalScript(const char* name) ScriptRegistry::AddScript(this); } +BGScript::BGScript(char const* name) + : ScriptObject(name) +{ + ScriptRegistry::AddScript(this); +} + ModuleScript::ModuleScript(const char* name) : ScriptObject(name) { diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index d2691ca20..6c03f0675 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -1037,6 +1037,29 @@ class GlobalScript : public ScriptObject virtual void OnAfterUpdateEncounterState(Map* /*map*/, EncounterCreditType /*type*/, uint32 /*creditEntry*/, Unit* /*source*/, Difficulty /*difficulty_fixed*/, DungeonEncounterList const* /*encounters*/, uint32 /*dungeonCompleted*/, bool /*updated*/) { } }; +class BGScript : public ScriptObject +{ +protected: + + BGScript(const char* name); + +public: + + bool IsDatabaseBound() const { return false; } + + // Start Battlegroud + virtual void OnBattlegroudStart(Battleground* /*bg*/) { } + + // End Battleground + virtual void OnBattlegroudEndReward(Battleground* /*bg*/, Player* /*player*/, TeamId /*winnerTeamId*/) { } + + // Update Battlegroud + virtual void OnBattlegroudUpdate(Battleground* /*bg*/, uint32 /*diff*/) { } + + // Add Player in Battlegroud + virtual void OnBattlegroudAddPlayer(Battleground* /*bg*/, Player* /*player*/) { } +}; + // this class can be used to be extended by Modules // creating their own custom hooks inside module itself class ModuleScript : public ScriptObject @@ -1356,6 +1379,13 @@ class ScriptMgr //void OnPlayerEnterAll(Map* map, Player* player); //void OnPlayerLeaveAll(Map* map, Player* player); + public: /* BGScript */ + + void OnBattlegroudStart(Battleground* bg); + void OnBattlegroudEndReward(Battleground* bg, Player* player, TeamId winnerTeamId); + void OnBattlegroudUpdate(Battleground* bg, uint32 diff); + void OnBattlegroudAddPlayer(Battleground* bg, Player* player); + private: uint32 _scriptCount;