aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Scripting
diff options
context:
space:
mode:
authorMeji <alvaromegias_46@hotmail.com>2022-02-08 23:23:05 +0100
committerGitHub <noreply@github.com>2022-02-08 23:23:05 +0100
commit27cba3f52309dad5be964fec11d80cd8cad128cf (patch)
tree8ce682a72a850b37dba9cc4756e4b91fe532b142 /src/server/game/Scripting
parent8e2d1e328ebec60c76d65651b268ec3ad2ce26fc (diff)
Core/Scripts: Added script hook to execute actions after completing an achievement (#27718)
Diffstat (limited to 'src/server/game/Scripting')
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp22
-rw-r--r--src/server/game/Scripting/ScriptMgr.h17
2 files changed, 39 insertions, 0 deletions
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"
@@ -109,6 +110,10 @@ struct is_script_database_bound<TransportScript>
: std::true_type { };
template<>
+struct is_script_database_bound<AchievementScript>
+ : std::true_type { };
+
+template<>
struct is_script_database_bound<AchievementCriteriaScript>
: 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<TransportScript>::Instance()->AddScript(this);
}
+AchievementScript::AchievementScript(char const* name)
+ : ScriptObject(name)
+{
+ ScriptRegistry<AchievementScript>::Instance()->AddScript(this);
+}
+
AchievementCriteriaScript::AchievementCriteriaScript(char const* name)
: ScriptObject(name)
{
@@ -2587,6 +2608,7 @@ template class TC_GAME_API ScriptRegistry<ConditionScript>;
template class TC_GAME_API ScriptRegistry<VehicleScript>;
template class TC_GAME_API ScriptRegistry<DynamicObjectScript>;
template class TC_GAME_API ScriptRegistry<TransportScript>;
+template class TC_GAME_API ScriptRegistry<AchievementScript>;
template class TC_GAME_API ScriptRegistry<AchievementCriteriaScript>;
template class TC_GAME_API ScriptRegistry<PlayerScript>;
template class TC_GAME_API ScriptRegistry<GuildScript>;
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);