diff options
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.h | 28 |
2 files changed, 30 insertions, 16 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index f1801100b25..219745e0444 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -488,13 +488,7 @@ void AchievementMgr<Guild>::ResetAchievementCriteria(AchievementCriteriaTypes /* // Not needed } -template<class T> -void AchievementMgr<T>::DeleteFromDB(ObjectGuid /*guid*/) -{ -} - -template<> -void AchievementMgr<Player>::DeleteFromDB(ObjectGuid guid) +void DeletePlayerAchievementsFromDB(ObjectGuid guid) { SQLTransaction trans = CharacterDatabase.BeginTransaction(); @@ -509,8 +503,7 @@ void AchievementMgr<Player>::DeleteFromDB(ObjectGuid guid) CharacterDatabase.CommitTransaction(trans); } -template<> -void AchievementMgr<Guild>::DeleteFromDB(ObjectGuid guid) +void DeleteGuildAchievementsFromDB(ObjectGuid guid) { SQLTransaction trans = CharacterDatabase.BeginTransaction(); @@ -525,16 +518,11 @@ void AchievementMgr<Guild>::DeleteFromDB(ObjectGuid guid) CharacterDatabase.CommitTransaction(trans); } -template TRINITY_GAME_API -void AchievementMgr<Player>::DeleteFromDB(ObjectGuid /*guid*/); - -template TRINITY_GAME_API -void AchievementMgr<Guild>::DeleteFromDB(ObjectGuid /*guid*/); - template<class T> void AchievementMgr<T>::SaveToDB(SQLTransaction& /*trans*/) { } + template<> void AchievementMgr<Player>::SaveToDB(SQLTransaction& trans) { diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h index 2d4aef490c4..678aa0bcc93 100644 --- a/src/server/game/Achievements/AchievementMgr.h +++ b/src/server/game/Achievements/AchievementMgr.h @@ -284,15 +284,41 @@ enum ProgressType PROGRESS_HIGHEST }; +// Hackfix to solve an unresolved issue in clang that the visibility +// flag is ignored in some explicit template specializations, +// which prevents clang from exporting the `DeleteFromDB` symbol. +// https://llvm.org/bugs/show_bug.cgi?id=24815 +// https://llvm.org/bugs/show_bug.cgi?id=23667 +TC_GAME_API void DeletePlayerAchievementsFromDB(ObjectGuid guid); +TC_GAME_API void DeleteGuildAchievementsFromDB(ObjectGuid guid); + +template<typename T> +struct AchievementMgrDeleterBase; + +template<> +struct AchievementMgrDeleterBase<Player> +{ + static void DeleteFromDB(ObjectGuid lowguid) { DeletePlayerAchievementsFromDB(lowguid); } +}; + +template<> +struct AchievementMgrDeleterBase<Guild> +{ + static void DeleteFromDB(ObjectGuid lowguid) { DeleteGuildAchievementsFromDB(lowguid); } +}; + template<class T> class TC_GAME_API AchievementMgr + : public AchievementMgrDeleterBase<T> { public: AchievementMgr(T* owner); ~AchievementMgr(); void Reset(); - static void DeleteFromDB(ObjectGuid lowguid); + + using AchievementMgrDeleterBase<T>::DeleteFromDB; + void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult); void SaveToDB(SQLTransaction& trans); void ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false); |