From 3a39aaeed53d994d88d854dc63cfbc0cc80a6eb8 Mon Sep 17 00:00:00 2001 From: Dmitry Brusenskiy Date: Tue, 19 Feb 2019 05:24:55 +0300 Subject: [PATCH] Core/Hooks: Adds hooks for start and stop game events (#1472) --- src/server/game/Events/GameEventMgr.cpp | 18 +++++++++--------- src/server/game/Scripting/ScriptMgr.cpp | 24 ++++++++++++++++++++++++ src/server/game/Scripting/ScriptMgr.h | 21 ++++++++++++++++++++- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp index 050f89005..d91aa4eee 100644 --- a/src/server/game/Events/GameEventMgr.cpp +++ b/src/server/game/Events/GameEventMgr.cpp @@ -18,6 +18,7 @@ #include "UnitAI.h" #include "GameObjectAI.h" #include "Transport.h" +#include "ScriptMgr.h" #ifdef ELUNA #include "LuaEngine.h" #endif @@ -127,10 +128,10 @@ bool GameEventMgr::StartEvent(uint16 event_id, bool overwrite) if (data.end <= data.start) data.end = data.start + data.length; } -#ifdef ELUNA + if (IsActiveEvent(event_id)) - sEluna->OnGameEventStart(event_id); -#endif + sScriptMgr->OnGameEventStart(event_id); + return false; } else @@ -153,10 +154,10 @@ bool GameEventMgr::StartEvent(uint16 event_id, bool overwrite) // or to scedule another update where the next event will be started if (overwrite && conditions_met) sWorld->ForceGameEventUpdate(); -#ifdef ELUNA + if (IsActiveEvent(event_id)) - sEluna->OnGameEventStart(event_id); -#endif + sScriptMgr->OnGameEventStart(event_id); + return conditions_met; } } @@ -199,10 +200,9 @@ void GameEventMgr::StopEvent(uint16 event_id, bool overwrite) CharacterDatabase.CommitTransaction(trans); } } -#ifdef ELUNA + if (!IsActiveEvent(event_id)) - sEluna->OnGameEventStop(event_id); -#endif + sScriptMgr->OnGameEventStop(event_id); } void GameEventMgr::LoadFromDB() diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index a712df08a..5a3bce6b1 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -60,6 +60,7 @@ template class ScriptRegistry; template class ScriptRegistry; template class ScriptRegistry; template class ScriptRegistry; +template class ScriptRegistry; #include "ScriptMgrMacros.h" @@ -213,6 +214,7 @@ void ScriptMgr::Unload() SCR_CLEAR(ModuleScript); SCR_CLEAR(BGScript); SCR_CLEAR(SpellSC); + SCR_CLEAR(GameEventScript); #undef SCR_CLEAR } @@ -2058,6 +2060,22 @@ void ScriptMgr::OnCalcMaxDuration(Aura const* aura, int32& maxDuration) FOREACH_SCRIPT(SpellSC)->OnCalcMaxDuration(aura, maxDuration); } +void ScriptMgr::OnGameEventStart(uint16 EventID) +{ +#ifdef ELUNA + sEluna->OnGameEventStart(EventId); +#endif + FOREACH_SCRIPT(GameEventScript)->OnStart(EventID); +} + +void ScriptMgr::OnGameEventStop(uint16 EventID) +{ +#ifdef ELUNA + sEluna->OnGameEventStop(EventID); +#endif + FOREACH_SCRIPT(GameEventScript)->OnStop(EventID); +} + AllMapScript::AllMapScript(const char* name) : ScriptObject(name) { @@ -2257,3 +2275,9 @@ ModuleScript::ModuleScript(const char* name) ScriptRegistry::AddScript(this); } +GameEventScript::GameEventScript(const char* name) + : ScriptObject(name) +{ + ScriptRegistry::AddScript(this); +} + diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 0656c679a..effa5330b 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -20,6 +20,7 @@ #include "AchievementMgr.h" #include "DynamicObject.h" #include "ArenaTeam.h" +#include "GameEventMgr.h" class AuctionHouseObject; class AuraScript; @@ -1135,6 +1136,19 @@ class ModuleScript : public ScriptObject ModuleScript(const char* name); }; +class GameEventScript : public ScriptObject +{ +protected: + GameEventScript(const char* name); + +public: + // Runs on start event + virtual void OnStart(uint16 /*EventID*/) { } + + // Runs on stop event + virtual void OnStop(uint16 /*EventID*/) { } +}; + // Placed here due to ScriptRegistry::AddScript dependency. #define sScriptMgr ACE_Singleton::instance() @@ -1469,7 +1483,12 @@ class ScriptMgr public: /* SpellSC */ - void OnCalcMaxDuration(Aura const* aura, int32& maxDuration); + void OnCalcMaxDuration(Aura const* aura, int32& maxDuration); + + public: /* GameEventScript */ + + void OnGameEventStart(uint16 EventID); + void OnGameEventStop(uint16 EventID); private: