diff options
author | Meji <alvaromegias_46@hotmail.com> | 2022-02-08 23:23:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-08 23:23:05 +0100 |
commit | 27cba3f52309dad5be964fec11d80cd8cad128cf (patch) | |
tree | 8ce682a72a850b37dba9cc4756e4b91fe532b142 /src/server/game/Achievements/AchievementMgr.cpp | |
parent | 8e2d1e328ebec60c76d65651b268ec3ad2ce26fc (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.cpp | 45 |
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; +} |