From 55233dd17b5ff2287685ebfd977cb01c611dfdad Mon Sep 17 00:00:00 2001 From: 天鹿 <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:54:35 +0800 Subject: feat(Core/Scripts): Optimize ServerScript (#18721) * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Add files via upload * Update ServerScript.h --- .../game/Scripting/ScriptDefines/ServerScript.cpp | 63 +++++++--------------- .../game/Scripting/ScriptDefines/ServerScript.h | 14 ++++- 2 files changed, 31 insertions(+), 46 deletions(-) (limited to 'src/server/game/Scripting/ScriptDefines') diff --git a/src/server/game/Scripting/ScriptDefines/ServerScript.cpp b/src/server/game/Scripting/ScriptDefines/ServerScript.cpp index ef0e8b721f..1384d680be 100644 --- a/src/server/game/Scripting/ScriptDefines/ServerScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/ServerScript.cpp @@ -21,86 +21,59 @@ void ScriptMgr::OnNetworkStart() { - ExecuteScript([&](ServerScript* script) - { - script->OnNetworkStart(); - }); + CALL_ENABLED_HOOKS(ServerScript, SERVERHOOK_ON_NETWORK_START, script->OnNetworkStart()); } void ScriptMgr::OnNetworkStop() { - ExecuteScript([&](ServerScript* script) - { - script->OnNetworkStop(); - }); + CALL_ENABLED_HOOKS(ServerScript, SERVERHOOK_ON_NETWORK_STOP, script->OnNetworkStop()); } void ScriptMgr::OnSocketOpen(std::shared_ptr socket) { ASSERT(socket); - ExecuteScript([&](ServerScript* script) - { - script->OnSocketOpen(socket); - }); + CALL_ENABLED_HOOKS(ServerScript, SERVERHOOK_ON_SOCKET_OPEN, script->OnSocketOpen(socket)); } void ScriptMgr::OnSocketClose(std::shared_ptr socket) { ASSERT(socket); - ExecuteScript([&](ServerScript* script) - { - script->OnSocketClose(socket); - }); + CALL_ENABLED_HOOKS(ServerScript, SERVERHOOK_ON_SOCKET_CLOSE, script->OnSocketClose(socket)); } -bool ScriptMgr::CanPacketReceive(WorldSession* session, WorldPacket const& packet) +bool ScriptMgr::CanPacketSend(WorldSession* session, WorldPacket const& packet) { + ASSERT(session); + if (ScriptRegistry::ScriptPointerList.empty()) return true; WorldPacket copy(packet); - auto ret = IsValidBoolScript([&](ServerScript* script) - { - return !script->CanPacketReceive(session, copy); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(ServerScript, SERVERHOOK_CAN_PACKET_SEND, !script->CanPacketSend(session, copy)); } -bool ScriptMgr::CanPacketSend(WorldSession* session, WorldPacket const& packet) +bool ScriptMgr::CanPacketReceive(WorldSession* session, WorldPacket const& packet) { - ASSERT(session); - if (ScriptRegistry::ScriptPointerList.empty()) return true; WorldPacket copy(packet); - auto ret = IsValidBoolScript([&](ServerScript* script) - { - return !script->CanPacketSend(session, copy); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(ServerScript, SERVERHOOK_CAN_PACKET_RECEIVE, !script->CanPacketReceive(session, copy)); } -ServerScript::ServerScript(const char* name) - : ScriptObject(name) +ServerScript::ServerScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, SERVERHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < SERVERHOOK_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/ServerScript.h b/src/server/game/Scripting/ScriptDefines/ServerScript.h index b09c07ecba..03c974194c 100644 --- a/src/server/game/Scripting/ScriptDefines/ServerScript.h +++ b/src/server/game/Scripting/ScriptDefines/ServerScript.h @@ -19,11 +19,23 @@ #define SCRIPT_OBJECT_SERVER_SCRIPT_H_ #include "ScriptObject.h" +#include + +enum ServerHook +{ + SERVERHOOK_ON_NETWORK_START, + SERVERHOOK_ON_NETWORK_STOP, + SERVERHOOK_ON_SOCKET_OPEN, + SERVERHOOK_ON_SOCKET_CLOSE, + SERVERHOOK_CAN_PACKET_SEND, + SERVERHOOK_CAN_PACKET_RECEIVE, + SERVERHOOK_END +}; class ServerScript : public ScriptObject { protected: - ServerScript(const char* name); + ServerScript(const char* name, std::vector enabledHooks = std::vector()); public: // Called when reactive socket I/O is started (WorldSocketMgr). -- cgit v1.2.3