diff --git a/src/game/AchievementMgr.h b/src/game/AchievementMgr.h index da3328fc6..32c5c71e2 100644 --- a/src/game/AchievementMgr.h +++ b/src/game/AchievementMgr.h @@ -252,8 +252,11 @@ class AchievementMgr void CheckAllAchievementCriteria(); void SendAllAchievementData(); void SendRespondInspectAchievements(Player* player); + Player* GetPlayer() { return m_player;} + bool HasAchievement(uint32 achievement_id) const { return m_completedAchievements.find(achievement_id) != m_completedAchievements.end(); } + private: enum ProgressType { PROGRESS_SET, PROGRESS_ACCUMULATE, PROGRESS_HIGHEST }; void SendAchievementEarned(AchievementEntry const* achievement); diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index 1cf758c2b..2f1c298ea 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -7642,6 +7642,25 @@ bool PlayerCondition::Meets(Player const * player) const else false; } + case CONDITION_ACHIEVEMENT: + { + switch(value2) + { + case 0: return player->GetAchievementMgr().HasAchievement(value1); + case 1: return !player->GetAchievementMgr().HasAchievement(value1); + } + return false; + } + case CONDITION_ACHIEVEMENT_REALM: + { + AchievementEntry const* ach = sAchievementStore.LookupEntry(value1); + switch(value2) + { + case 0: return sAchievementMgr.IsRealmCompleted(ach); + case 1: return !sAchievementMgr.IsRealmCompleted(ach); + } + return false; + } default: return false; } @@ -7870,6 +7889,23 @@ bool PlayerCondition::IsValid(ConditionType condition, uint32 value1, uint32 val break; } + case CONDITION_ACHIEVEMENT: + case CONDITION_ACHIEVEMENT_REALM: + { + if (!sAchievementStore.LookupEntry(value1)) + { + sLog.outErrorDb("Achievement condition (%u) requires to have non existing achievement (Id: %d), skipped", condition, value1); + return false; + } + + if (value2 > 1) + { + sLog.outErrorDb("Achievement condition (%u) has invalid argument %u (must be 0..1), skipped", condition, value2); + return false; + } + + break; + } case CONDITION_NONE: break; } diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h index 404b14a91..5b6713f04 100644 --- a/src/game/ObjectMgr.h +++ b/src/game/ObjectMgr.h @@ -370,9 +370,11 @@ enum ConditionType CONDITION_SPELL = 17, // spell_id 0, 1 (0: has spell, 1: hasn't spell) CONDITION_INSTANCE_SCRIPT = 18, // map_id instance_condition_id (instance script specific enum) CONDITION_QUESTAVAILABLE = 19, // quest_id 0 for case when loot/gossip possible only if player can start quest + CONDITION_ACHIEVEMENT = 20, // ach_id 0, 1 (0: has achievement, 1: hasn't achievement) for player + CONDITION_ACHIEVEMENT_REALM = 21, // ach_id 0, 1 (0: has achievement, 1: hasn't achievement) for server }; -#define MAX_CONDITION 20 // maximum value in ConditionType enum +#define MAX_CONDITION 22 // maximum value in ConditionType enum struct PlayerCondition { diff --git a/src/game/Player.h b/src/game/Player.h index 9351ed3c9..d4ba36e56 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -2374,8 +2374,10 @@ class MANGOS_DLL_SPEC Player : public Unit void AddRunePower(uint8 index); void InitRunes(); + AchievementMgr const& GetAchievementMgr() const { return m_achievementMgr; } AchievementMgr& GetAchievementMgr() { return m_achievementMgr; } void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscvalue1=0, uint32 miscvalue2=0, Unit *unit=NULL, uint32 time=0); + bool HasTitle(uint32 bitIndex); bool HasTitle(CharTitlesEntry const* title) { return HasTitle(title->bit_index); } void SetTitle(CharTitlesEntry const* title, bool lost = false); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 545d3a30e..e1e6a7bc3 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10265" + #define REVISION_NR "10266" #endif // __REVISION_NR_H__