From 27cba3f52309dad5be964fec11d80cd8cad128cf Mon Sep 17 00:00:00 2001 From: Meji Date: Tue, 8 Feb 2022 23:23:05 +0100 Subject: Core/Scripts: Added script hook to execute actions after completing an achievement (#27718) --- src/server/game/Scripting/ScriptMgr.cpp | 22 ++++++++++++++++++++++ src/server/game/Scripting/ScriptMgr.h | 17 +++++++++++++++++ 2 files changed, 39 insertions(+) (limited to 'src/server/game/Scripting') diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp index 0943147095d..a439949cd26 100644 --- a/src/server/game/Scripting/ScriptMgr.cpp +++ b/src/server/game/Scripting/ScriptMgr.cpp @@ -16,6 +16,7 @@ */ #include "ScriptMgr.h" +#include "AchievementMgr.h" #include "AreaTrigger.h" #include "AreaTriggerAI.h" #include "Chat.h" @@ -108,6 +109,10 @@ template<> struct is_script_database_bound : std::true_type { }; +template<> +struct is_script_database_bound + : std::true_type { }; + template<> struct is_script_database_bound : std::true_type { }; @@ -1938,6 +1943,16 @@ void ScriptMgr::OnShutdown() FOREACH_SCRIPT(WorldScript)->OnShutdown(); } +// Achievement +void ScriptMgr::OnAchievementCompleted(Player* player, AchievementEntry const* achievement) +{ + ASSERT(player); + ASSERT(achievement); + + GET_SCRIPT(AchievementScript, sAchievementMgr->GetAchievementScriptId(achievement->ID), tmpscript); + tmpscript->OnCompleted(player, achievement); +} + bool ScriptMgr::OnCriteriaCheck(uint32 scriptId, Player* source, Unit* target) { ASSERT(source); @@ -2511,6 +2526,12 @@ TransportScript::TransportScript(char const* name) ScriptRegistry::Instance()->AddScript(this); } +AchievementScript::AchievementScript(char const* name) + : ScriptObject(name) +{ + ScriptRegistry::Instance()->AddScript(this); +} + AchievementCriteriaScript::AchievementCriteriaScript(char const* name) : ScriptObject(name) { @@ -2587,6 +2608,7 @@ template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; +template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; template class TC_GAME_API ScriptRegistry; diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 3c343d32650..7aae463cd86 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -66,6 +66,7 @@ class WorldSocket; class WorldObject; class WorldSession; +struct AchievementEntry; struct AreaTriggerEntry; struct AuctionPosting; struct ConditionSourceInfo; @@ -622,6 +623,18 @@ class TC_GAME_API TransportScript : public ScriptObject, public UpdatableScript< virtual void OnRelocate(Transport* /*transport*/, uint32 /*waypointId*/, uint32 /*mapId*/, float /*x*/, float /*y*/, float /*z*/) { } }; +class TC_GAME_API AchievementScript : public ScriptObject +{ + protected: + + AchievementScript(char const* name); + + public: + + // Called when an achievement is completed. + virtual void OnCompleted(Player* /*player*/, AchievementEntry const* /*achievement*/) { } +}; + class TC_GAME_API AchievementCriteriaScript : public ScriptObject { protected: @@ -1085,6 +1098,10 @@ class TC_GAME_API ScriptMgr void OnTransportUpdate(Transport* transport, uint32 diff); void OnRelocate(Transport* transport, uint32 waypointId, uint32 mapId, float x, float y, float z); + public: /* AchievementScript */ + + void OnAchievementCompleted(Player* player, AchievementEntry const* achievement); + public: /* AchievementCriteriaScript */ bool OnCriteriaCheck(uint32 scriptId, Player* source, Unit* target); -- cgit v1.2.3