From 0e1888ac92e4ceab56128d656d07dc9c3a635fd9 Mon Sep 17 00:00:00 2001 From: 天鹿 <18535853+PkllonG@users.noreply.github.com> Date: Fri, 12 Apr 2024 22:00:31 +0800 Subject: feat(Core/Scripts): Optimize AchievementScript (#18705) * Add files via upload * Update AchievementScript.h --- .../Scripting/ScriptDefines/AchievementScript.cpp | 57 +++++----------------- .../Scripting/ScriptDefines/AchievementScript.h | 13 ++++- 2 files changed, 25 insertions(+), 45 deletions(-) (limited to 'src/server/game/Scripting/ScriptDefines') diff --git a/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp b/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp index 4dc58634d6..9bc742b73c 100644 --- a/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/AchievementScript.cpp @@ -21,69 +21,38 @@ void ScriptMgr::SetRealmCompleted(AchievementEntry const* achievement) { - ExecuteScript([&](AchievementScript* script) - { - script->SetRealmCompleted(achievement); - }); + CALL_ENABLED_HOOKS(AchievementScript, ACHIEVEMENTHOOK_SET_REALM_COMPLETED, script->SetRealmCompleted(achievement)); } bool ScriptMgr::IsCompletedCriteria(AchievementMgr* mgr, AchievementCriteriaEntry const* achievementCriteria, AchievementEntry const* achievement, CriteriaProgress const* progress) { - auto ret = IsValidBoolScript([&](AchievementScript* script) - { - return !script->IsCompletedCriteria(mgr, achievementCriteria, achievement, progress); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(AchievementScript, ACHIEVEMENTHOOK_IS_COMPLETED_CRITERIA, !script->IsCompletedCriteria(mgr, achievementCriteria, achievement, progress)); } bool ScriptMgr::IsRealmCompleted(AchievementGlobalMgr const* globalmgr, AchievementEntry const* achievement, SystemTimePoint completionTime) { - auto ret = IsValidBoolScript([&](AchievementScript* script) - { - return !script->IsRealmCompleted(globalmgr, achievement, completionTime); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(AchievementScript, ACHIEVEMENTHOOK_IS_REALM_COMPLETED, !script->IsRealmCompleted(globalmgr, achievement, completionTime)); } void ScriptMgr::OnBeforeCheckCriteria(AchievementMgr* mgr, std::list const* achievementCriteriaList) { - ExecuteScript([&](AchievementScript* script) - { - script->OnBeforeCheckCriteria(mgr, achievementCriteriaList); - }); + CALL_ENABLED_HOOKS(AchievementScript, ACHIEVEMENTHOOK_ON_BEFORE_CHECK_CRITERIA, script->OnBeforeCheckCriteria(mgr, achievementCriteriaList)); } bool ScriptMgr::CanCheckCriteria(AchievementMgr* mgr, AchievementCriteriaEntry const* achievementCriteria) { - auto ret = IsValidBoolScript([&](AchievementScript* script) - { - return !script->CanCheckCriteria(mgr, achievementCriteria); - }); - - if (ret && *ret) - { - return false; - } - - return true; + CALL_ENABLED_BOOLEAN_HOOKS(AchievementScript, ACHIEVEMENTHOOK_CAN_CHECK_CRITERIA, !script->CanCheckCriteria(mgr, achievementCriteria)); } -AchievementScript::AchievementScript(const char* name) - : ScriptObject(name) +AchievementScript::AchievementScript(const char* name, std::vector enabledHooks) + : ScriptObject(name, ACHIEVEMENTHOOK_END) { - ScriptRegistry::AddScript(this); + // If empty - enable all available hooks. + if (enabledHooks.empty()) + for (uint16 i = 0; i < ACHIEVEMENTHOOK_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/AchievementScript.h b/src/server/game/Scripting/ScriptDefines/AchievementScript.h index d1e8ab0767..84aa3746e4 100644 --- a/src/server/game/Scripting/ScriptDefines/AchievementScript.h +++ b/src/server/game/Scripting/ScriptDefines/AchievementScript.h @@ -21,11 +21,22 @@ #include "Duration.h" #include "ScriptObject.h" #include +#include + +enum AchievementHook +{ + ACHIEVEMENTHOOK_SET_REALM_COMPLETED, + ACHIEVEMENTHOOK_IS_COMPLETED_CRITERIA, + ACHIEVEMENTHOOK_IS_REALM_COMPLETED, + ACHIEVEMENTHOOK_ON_BEFORE_CHECK_CRITERIA, + ACHIEVEMENTHOOK_CAN_CHECK_CRITERIA, + ACHIEVEMENTHOOK_END +}; class AchievementScript : public ScriptObject { protected: - AchievementScript(const char* name); + AchievementScript(const char* name, std::vector enabledHooks = std::vector()); public: [[nodiscard]] bool IsDatabaseBound() const override { return false; } -- cgit v1.2.3