aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Achievements/AchievementMgr.cpp
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/Achievements/AchievementMgr.cpp
parent8e2d1e328ebec60c76d65651b268ec3ad2ce26fc (diff)
Core/Scripts: Added script hook to execute actions after completing an achievement (#27718)
Diffstat (limited to 'src/server/game/Achievements/AchievementMgr.cpp')
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index 2444511cafc..68d84b2d9e8 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -34,6 +34,7 @@
#include "ObjectMgr.h"
#include "RBAC.h"
#include "StringConvert.h"
+#include "ScriptMgr.h"
#include "World.h"
#include "WorldSession.h"
#include <sstream>
@@ -535,6 +536,8 @@ void PlayerAchievementMgr::CompletedAchievement(AchievementEntry const* achievem
UpdateCriteria(CriteriaType::EarnAchievement, achievement->ID, 0, 0, nullptr, referencePlayer);
UpdateCriteria(CriteriaType::EarnAchievementPoints, achievement->Points, 0, 0, nullptr, referencePlayer);
+ sScriptMgr->OnAchievementCompleted(referencePlayer, achievement);
+
// reward items and titles if any
AchievementReward const* reward = sAchievementMgr->GetAchievementReward(achievement);
@@ -985,6 +988,8 @@ void GuildAchievementMgr::CompletedAchievement(AchievementEntry const* achieveme
UpdateCriteria(CriteriaType::EarnAchievement, achievement->ID, 0, 0, nullptr, referencePlayer);
UpdateCriteria(CriteriaType::EarnAchievementPoints, achievement->Points, 0, 0, nullptr, referencePlayer);
+
+ sScriptMgr->OnAchievementCompleted(referencePlayer, achievement);
}
void GuildAchievementMgr::SendCriteriaUpdate(Criteria const* entry, CriteriaProgress const* progress, Seconds /*timeElapsed*/, bool /*timedCompleted*/) const
@@ -1140,6 +1145,39 @@ void AchievementGlobalMgr::LoadAchievementReferenceList()
TC_LOG_INFO("server.loading", ">> Loaded %u achievement references in %u ms.", count, GetMSTimeDiffToNow(oldMSTime));
}
+void AchievementGlobalMgr::LoadAchievementScripts()
+{
+ uint32 oldMSTime = getMSTime();
+
+ _achievementScripts.clear(); // need for reload case
+
+ QueryResult result = WorldDatabase.Query("SELECT AchievementId, ScriptName FROM achievement_scripts");
+ if (!result)
+ {
+ TC_LOG_INFO("server.loading", ">> Loaded 0 achievement scripts. DB table `achievement_scripts` is empty.");
+ return;
+ }
+
+ do
+ {
+ Field* fields = result->Fetch();
+
+ uint32 achievementId = fields[0].GetUInt32();
+ std::string scriptName = fields[1].GetString();
+
+ AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementId);
+ if (!achievement)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `achievement_scripts` contains non-existing Achievement (ID: %u), skipped.", achievementId);
+ continue;
+ }
+ _achievementScripts[achievementId] = sObjectMgr->GetScriptId(scriptName);
+ }
+ while (result->NextRow());
+
+ TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " achievement scripts in %u ms", _achievementScripts.size(), GetMSTimeDiffToNow(oldMSTime));
+}
+
void AchievementGlobalMgr::LoadCompletedAchievements()
{
uint32 oldMSTime = getMSTime();
@@ -1338,3 +1376,10 @@ void AchievementGlobalMgr::LoadRewardLocales()
TC_LOG_INFO("server.loading", ">> Loaded %u achievement reward locale strings in %u ms.", uint32(_achievementRewardLocales.size()), GetMSTimeDiffToNow(oldMSTime));
}
+
+uint32 AchievementGlobalMgr::GetAchievementScriptId(uint32 achievementId) const
+{
+ if (uint32 const* scriptId = Trinity::Containers::MapGetValuePtr(_achievementScripts, achievementId))
+ return *scriptId;
+ return 0;
+}