From d162817d33dcf9159ee72371cb8b41e321e6da1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A9=E9=B9=BF?= <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:53:42 +0800 Subject: [PATCH] feat(Core/Scripts): Optimize WorldScript (#18724) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update WorldScript.h * Update ScriptMgr.cpp --- .../Scripting/ScriptDefines/WorldScript.cpp | 102 ++++++------------ .../Scripting/ScriptDefines/WorldScript.h | 21 +++- src/server/game/Scripting/ScriptMgr.cpp | 25 ++++- 3 files changed, 76 insertions(+), 72 deletions(-) diff --git a/src/server/game/Scripting/ScriptDefines/WorldScript.cpp b/src/server/game/Scripting/ScriptDefines/WorldScript.cpp index 0d8748734..ec53f99e3 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/WorldScript.cpp @@ -21,112 +21,78 @@ void ScriptMgr::OnOpenStateChange(bool open) { - ExecuteScript([&](WorldScript* script) - { - script->OnOpenStateChange(open); - }); -} - -void ScriptMgr::OnLoadCustomDatabaseTable() -{ - ExecuteScript([&](WorldScript* script) - { - script->OnLoadCustomDatabaseTable(); - }); -} - -void ScriptMgr::OnBeforeConfigLoad(bool reload) -{ - ExecuteScript([&](WorldScript* script) - { - script->OnBeforeConfigLoad(reload); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_OPEN_STATE_CHANGE, script->OnOpenStateChange(open)); } void ScriptMgr::OnAfterConfigLoad(bool reload) { - ExecuteScript([&](WorldScript* script) - { - script->OnAfterConfigLoad(reload); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_AFTER_CONFIG_LOAD, script->OnAfterConfigLoad(reload)); } -void ScriptMgr::OnBeforeFinalizePlayerWorldSession(uint32& cacheVersion) +void ScriptMgr::OnLoadCustomDatabaseTable() { - ExecuteScript([&](WorldScript* script) - { - script->OnBeforeFinalizePlayerWorldSession(cacheVersion); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_LOAD_CUSTOM_DATABASE_TABLE, script->OnLoadCustomDatabaseTable()); +} + +void ScriptMgr::OnBeforeConfigLoad(bool reload) +{ + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_BEFORE_CONFIG_LOAD, script->OnBeforeConfigLoad(reload)); } void ScriptMgr::OnMotdChange(std::string& newMotd) { - ExecuteScript([&](WorldScript* script) - { - script->OnMotdChange(newMotd); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_MOTD_CHANGE, script->OnMotdChange(newMotd)); } void ScriptMgr::OnShutdownInitiate(ShutdownExitCode code, ShutdownMask mask) { - ExecuteScript([&](WorldScript* script) - { - script->OnShutdownInitiate(code, mask); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_SHUTDOWN_INITIATE, script->OnShutdownInitiate(code, mask)); } void ScriptMgr::OnShutdownCancel() { - ExecuteScript([&](WorldScript* script) - { - script->OnShutdownCancel(); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_SHUTDOWN_CANCEL, script->OnShutdownCancel()); } void ScriptMgr::OnWorldUpdate(uint32 diff) { - ExecuteScript([&](WorldScript* script) - { - script->OnUpdate(diff); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_UPDATE, script->OnUpdate(diff)); } void ScriptMgr::OnStartup() { - ExecuteScript([&](WorldScript* script) - { - script->OnStartup(); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_STARTUP, script->OnStartup()); } void ScriptMgr::OnShutdown() { - ExecuteScript([&](WorldScript* script) - { - script->OnShutdown(); - }); -} - -void ScriptMgr::OnBeforeWorldInitialized() -{ - ExecuteScript([&](WorldScript* script) - { - script->OnBeforeWorldInitialized(); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_SHUTDOWN, script->OnShutdown()); } void ScriptMgr::OnAfterUnloadAllMaps() { - ExecuteScript([](WorldScript* script) - { - script->OnAfterUnloadAllMaps(); - }); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_AFTER_UNLOAD_ALL_MAPS, script->OnAfterUnloadAllMaps()); } -WorldScript::WorldScript(const char* name) : - ScriptObject(name) +void ScriptMgr::OnBeforeFinalizePlayerWorldSession(uint32& cacheVersion) { - ScriptRegistry::AddScript(this); + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_BEFORE_FINALIZE_PLAYER_WORLD_SESSION, script->OnBeforeFinalizePlayerWorldSession(cacheVersion)); +} + +void ScriptMgr::OnBeforeWorldInitialized() +{ + CALL_ENABLED_HOOKS(WorldScript, WORLDHOOK_ON_BEFORE_WORLD_INITIALIZED, script->OnBeforeWorldInitialized()); +} + +WorldScript::WorldScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, WORLDHOOK_END) +{ + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < WORLDHOOK_END; ++i) + enabledHooks.emplace_back(i); + + ScriptRegistry::AddScript(this, std::move(enabledHooks)); } template class AC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptDefines/WorldScript.h b/src/server/game/Scripting/ScriptDefines/WorldScript.h index a9fdbb64a..c7f715a0a 100644 --- a/src/server/game/Scripting/ScriptDefines/WorldScript.h +++ b/src/server/game/Scripting/ScriptDefines/WorldScript.h @@ -19,11 +19,30 @@ #define SCRIPT_OBJECT_WORLD_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum WorldHook +{ + WORLDHOOK_ON_OPEN_STATE_CHANGE, + WORLDHOOK_ON_AFTER_CONFIG_LOAD, + WORLDHOOK_ON_LOAD_CUSTOM_DATABASE_TABLE, + WORLDHOOK_ON_BEFORE_CONFIG_LOAD, + WORLDHOOK_ON_MOTD_CHANGE, + WORLDHOOK_ON_SHUTDOWN_INITIATE, + WORLDHOOK_ON_SHUTDOWN_CANCEL, + WORLDHOOK_ON_UPDATE, + WORLDHOOK_ON_STARTUP, + WORLDHOOK_ON_SHUTDOWN, + WORLDHOOK_ON_AFTER_UNLOAD_ALL_MAPS, + WORLDHOOK_ON_BEFORE_FINALIZE_PLAYER_WORLD_SESSION, + WORLDHOOK_ON_BEFORE_WORLD_INITIALIZED, + WORLDHOOK_END +}; class WorldScript : public ScriptObject { protected: - WorldScript(const char* name); + WorldScript(const char* name, std::vector enabledHooks = std::vector()); public: // Called when the open/closed state of the world changes. diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index d27ff9849..25096ccf9 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -78,11 +78,30 @@ void ScriptMgr::Initialize() _script_loader_callback(); _modules_loader_callback(); - ScriptRegistry::InitEnabledHooksIfNeeded(PLAYERHOOK_END); - ScriptRegistry::InitEnabledHooksIfNeeded(AUCTIONHOUSEHOOK_END); - ScriptRegistry::InitEnabledHooksIfNeeded(ARENATEAMHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ACCOUNTHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ACHIEVEMENTHOOK_END); ScriptRegistry::InitEnabledHooksIfNeeded(ARENAHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ARENATEAMHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(AUCTIONHOUSEHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ALLBATTLEGROUNDHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ALLCOMMANDHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(DATABASEHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(FORMULAHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(GAMEEVENTHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(GLOBALHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(GROUPHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(GUILDHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(LOOTHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(MAILHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(MISCHOOK_END); ScriptRegistry::InitEnabledHooksIfNeeded(MOVEMENTHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(PETHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(PLAYERHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(SERVERHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(ALLSPELLHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(UNITHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(WORLDOBJECTHOOK_END); + ScriptRegistry::InitEnabledHooksIfNeeded(WORLDHOOK_END); } void ScriptMgr::Unload()