Core/Achievements: AchievementMgr refactoring
* Extracted base CriteriaHandler class that deals with criteria only and will be reused for future scenario implementation * Fixed players earning guild achievements
This commit is contained in:
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
|
||||
UPDATE `rbac_permissions` SET `name`='Command: disable add criteria' WHERE `id`=350;
|
||||
UPDATE `rbac_permissions` SET `name`='Command: disable remove criteria' WHERE `id`=359;
|
||||
UPDATE `rbac_permissions` SET `name`='Command: reload criteria_data' WHERE `id`=609;
|
||||
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE `character_achievement` CHANGE `achievement` `achievement` int(10) unsigned NOT NULL;
|
||||
ALTER TABLE `guild_achievement` CHANGE `achievement` `achievement` int(10) unsigned NOT NULL;
|
||||
@@ -0,0 +1,4 @@
|
||||
RENAME TABLE `achievement_criteria_data` TO `criteria_data`;
|
||||
UPDATE `command` SET `name`='disable add criteria', `help`='Syntax: .disable add criteria $entry $flag $comment' WHERE `name`='disable add achievement_criteria';
|
||||
UPDATE `command` SET `name`='disable remove criteria', `help`='Syntax: .disable remove criteria $entry' WHERE `name`='disable remove achievement_criteria';
|
||||
UPDATE `command` SET `name`='reload criteria_data', `help`='Syntax: .reload criteria_data\nReload criteria_data table.' WHERE `name`='reload achievement_criteria_data';
|
||||
@@ -254,7 +254,7 @@ enum RBACPermissions
|
||||
RBAC_PERM_COMMAND_DESERTER_INSTANCE_REMOVE = 347,
|
||||
RBAC_PERM_COMMAND_DISABLE = 348,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD = 349,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_ACHIEVEMENT_CRITERIA = 350,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_CRITERIA = 350,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_BATTLEGROUND = 351,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_MAP = 352,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_MMAP = 353,
|
||||
@@ -263,7 +263,7 @@ enum RBACPermissions
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_SPELL = 356,
|
||||
RBAC_PERM_COMMAND_DISABLE_ADD_VMAP = 357,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE = 358,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_ACHIEVEMENT_CRITERIA = 359,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_CRITERIA = 359,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_BATTLEGROUND = 360,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_MAP = 361,
|
||||
RBAC_PERM_COMMAND_DISABLE_REMOVE_MMAP = 362,
|
||||
@@ -513,7 +513,7 @@ enum RBACPermissions
|
||||
RBAC_PERM_COMMAND_QUEST_REWARD = 606,
|
||||
RBAC_PERM_COMMAND_RELOAD = 607,
|
||||
RBAC_PERM_COMMAND_RELOAD_ACCESS_REQUIREMENT = 608,
|
||||
RBAC_PERM_COMMAND_RELOAD_ACHIEVEMENT_CRITERIA_DATA = 609,
|
||||
RBAC_PERM_COMMAND_RELOAD_CRITERIA_DATA = 609,
|
||||
RBAC_PERM_COMMAND_RELOAD_ACHIEVEMENT_REWARD = 610,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL = 611,
|
||||
RBAC_PERM_COMMAND_RELOAD_ALL_ACHIEVEMENT = 612,
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -19,485 +19,158 @@
|
||||
#ifndef __TRINITY_ACHIEVEMENTMGR_H
|
||||
#define __TRINITY_ACHIEVEMENTMGR_H
|
||||
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include "CriteriaHandler.h"
|
||||
|
||||
#include "Common.h"
|
||||
#include "DatabaseEnv.h"
|
||||
#include "DBCEnums.h"
|
||||
#include "DBCStores.h"
|
||||
#include "ObjectGuid.h"
|
||||
|
||||
class Unit;
|
||||
class Player;
|
||||
class Guild;
|
||||
class WorldPacket;
|
||||
|
||||
struct ModifierTreeNode
|
||||
{
|
||||
ModifierTreeEntry const* Entry;
|
||||
std::vector<ModifierTreeNode const*> Children;
|
||||
};
|
||||
|
||||
typedef std::unordered_map<uint32, ModifierTreeNode*> ModifierTreeMap;
|
||||
|
||||
enum AchievementCriteriaFlagsCu
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_FLAG_CU_PLAYER = 0x1,
|
||||
ACHIEVEMENT_CRITERIA_FLAG_CU_ACCOUNT = 0x2,
|
||||
ACHIEVEMENT_CRITERIA_FLAG_CU_GUILD = 0x4
|
||||
};
|
||||
|
||||
struct AchievementCriteria
|
||||
{
|
||||
uint32 ID = 0;
|
||||
CriteriaEntry const* Entry = nullptr;
|
||||
ModifierTreeNode const* Modifier = nullptr;
|
||||
uint32 FlagsCu = 0;
|
||||
};
|
||||
|
||||
typedef std::vector<AchievementCriteria const*> AchievementCriteriaList;
|
||||
typedef std::unordered_map<uint32, AchievementCriteria*> AchievementCriteriaMap;
|
||||
|
||||
struct AchievementCriteriaTree
|
||||
{
|
||||
uint32 ID = 0;
|
||||
CriteriaTreeEntry const* Entry = nullptr;
|
||||
AchievementEntry const* Achievement = nullptr;
|
||||
AchievementCriteria const* Criteria = nullptr;
|
||||
std::vector<AchievementCriteriaTree const*> Children;
|
||||
};
|
||||
|
||||
typedef std::unordered_map<uint32, AchievementCriteriaTree*> AchievementCriteriaTreeMap;
|
||||
typedef std::vector<AchievementCriteriaTree const*> AchievementCriteriaTreeList;
|
||||
typedef std::vector<AchievementEntry const*> AchievementEntryList;
|
||||
typedef std::unordered_map<uint32, AchievementCriteriaTreeList> AchievementCriteriaTreeByCriteriaMap;
|
||||
|
||||
typedef std::unordered_map<uint32, AchievementEntryList> AchievementListByReferencedId;
|
||||
|
||||
struct CriteriaProgress
|
||||
{
|
||||
uint64 counter = 0;
|
||||
time_t date = time_t(0); // latest update time.
|
||||
ObjectGuid PlayerGUID; // GUID of the player that last updated the criteria
|
||||
bool changed = false;
|
||||
};
|
||||
|
||||
enum AchievementCriteriaDataType
|
||||
{ // value1 value2 comment
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE = 0, // 0 0
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE = 1, // creature_id 0
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE = 2, // class_id race_id
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH= 3, // health_percent 0
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA = 5, // spell_id effect_idx
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA = 7, // spell_id effect_idx
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE = 8, // minvalue value provided with achievement update must be not less that limit
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL = 9, // minlevel minlevel of target
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER = 10, // gender 0=male; 1=female
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT = 11, // scripted requirement
|
||||
// REUSE
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13, // count "with less than %u people in the zone"
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM = 14, // team HORDE(67), ALLIANCE(469)
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK = 15, // drunken_state 0 (enum DrunkenState) of player
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16, // holiday_id 0 event in holiday time
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE = 17, // min_score max_score player's team win bg and opposition team have team score in range
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check current criteria requirements fit
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM = 19, // item_level item_quality for equipped item in slot to check item level and quality
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID = 20, // map_id 0 player must be on map with id in map_id
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21, // class_id race_id
|
||||
// REUSE
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_S_KNOWN_TITLE = 23, // title_id known (pvp) title, values from dbc
|
||||
ACHIEVEMENT_CRITERIA_DATA_TYPE_GAME_EVENT = 24, // game_event_id 0
|
||||
|
||||
MAX_ACHIEVEMENT_CRITERIA_DATA_TYPE
|
||||
};
|
||||
|
||||
struct AchievementCriteriaData
|
||||
{
|
||||
AchievementCriteriaDataType dataType;
|
||||
union
|
||||
{
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE = 0 (no data)
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_T_CREATURE = 1
|
||||
struct
|
||||
{
|
||||
uint32 id;
|
||||
} creature;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE = 2
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21
|
||||
struct
|
||||
{
|
||||
uint32 class_id;
|
||||
uint32 race_id;
|
||||
} classRace;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH = 3
|
||||
struct
|
||||
{
|
||||
uint32 percent;
|
||||
} health;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_S_AURA = 5
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_T_AURA = 7
|
||||
struct
|
||||
{
|
||||
uint32 spell_id;
|
||||
uint32 effect_idx;
|
||||
} aura;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_VALUE = 8
|
||||
struct
|
||||
{
|
||||
uint32 value;
|
||||
uint32 compType;
|
||||
} value;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_T_LEVEL = 9
|
||||
struct
|
||||
{
|
||||
uint32 minlevel;
|
||||
} level;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_T_GENDER = 10
|
||||
struct
|
||||
{
|
||||
uint32 gender;
|
||||
} gender;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_SCRIPT = 11 (no data)
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13
|
||||
struct
|
||||
{
|
||||
uint32 maxcount;
|
||||
} map_players;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_T_TEAM = 14
|
||||
struct
|
||||
{
|
||||
uint32 team;
|
||||
} team;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_S_DRUNK = 15
|
||||
struct
|
||||
{
|
||||
uint32 state;
|
||||
} drunk;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_HOLIDAY = 16
|
||||
struct
|
||||
{
|
||||
uint32 id;
|
||||
} holiday;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE= 17
|
||||
struct
|
||||
{
|
||||
uint32 min_score;
|
||||
uint32 max_score;
|
||||
} bg_loss_team_score;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18 (no data)
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_S_EQUIPED_ITEM = 19
|
||||
struct
|
||||
{
|
||||
uint32 item_level;
|
||||
uint32 item_quality;
|
||||
} equipped_item;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_MAP_ID = 20
|
||||
struct
|
||||
{
|
||||
uint32 mapId;
|
||||
} map_id;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_KNOWN_TITLE = 22
|
||||
struct
|
||||
{
|
||||
uint32 title_id;
|
||||
} known_title;
|
||||
// ACHIEVEMENT_CRITERIA_DATA_TYPE_GAME_EVENT = 24
|
||||
struct
|
||||
{
|
||||
uint32 id;
|
||||
} game_event;
|
||||
// raw
|
||||
struct
|
||||
{
|
||||
uint32 value1;
|
||||
uint32 value2;
|
||||
} raw;
|
||||
};
|
||||
uint32 ScriptId;
|
||||
|
||||
AchievementCriteriaData() : dataType(ACHIEVEMENT_CRITERIA_DATA_TYPE_NONE)
|
||||
{
|
||||
raw.value1 = 0;
|
||||
raw.value2 = 0;
|
||||
ScriptId = 0;
|
||||
}
|
||||
|
||||
AchievementCriteriaData(uint32 _dataType, uint32 _value1, uint32 _value2, uint32 _scriptId) : dataType(AchievementCriteriaDataType(_dataType))
|
||||
{
|
||||
raw.value1 = _value1;
|
||||
raw.value2 = _value2;
|
||||
ScriptId = _scriptId;
|
||||
}
|
||||
|
||||
bool IsValid(AchievementCriteria const* criteria);
|
||||
bool Meets(uint32 criteria_id, Player const* source, Unit const* target, uint32 miscValue1 = 0) const;
|
||||
};
|
||||
|
||||
struct TC_GAME_API AchievementCriteriaDataSet
|
||||
{
|
||||
AchievementCriteriaDataSet() : criteria_id(0) { }
|
||||
typedef std::vector<AchievementCriteriaData> Storage;
|
||||
void Add(AchievementCriteriaData const& data) { storage.push_back(data); }
|
||||
bool Meets(Player const* source, Unit const* target, uint32 miscValue = 0) const;
|
||||
void SetCriteriaId(uint32 id) {criteria_id = id;}
|
||||
private:
|
||||
uint32 criteria_id;
|
||||
Storage storage;
|
||||
};
|
||||
|
||||
typedef std::map<uint32, AchievementCriteriaDataSet> AchievementCriteriaDataMap;
|
||||
|
||||
struct AchievementReward
|
||||
{
|
||||
uint32 titleId[2];
|
||||
uint32 itemId;
|
||||
uint32 sender;
|
||||
std::string subject;
|
||||
std::string text;
|
||||
uint32 mailTemplate;
|
||||
uint32 TitleId[2];
|
||||
uint32 ItemId;
|
||||
uint32 SenderCreatureId;
|
||||
std::string Subject;
|
||||
std::string Body;
|
||||
uint32 MailTemplateId;
|
||||
};
|
||||
|
||||
typedef std::unordered_map<uint32, AchievementReward> AchievementRewards;
|
||||
|
||||
struct AchievementRewardLocale
|
||||
{
|
||||
std::vector<std::string> subject;
|
||||
std::vector<std::string> text;
|
||||
std::vector<std::string> Subject;
|
||||
std::vector<std::string> Body;
|
||||
};
|
||||
|
||||
typedef std::unordered_map<uint32, AchievementRewardLocale> AchievementRewardLocales;
|
||||
|
||||
struct CompletedAchievementData
|
||||
{
|
||||
time_t date;
|
||||
GuidSet guids;
|
||||
bool changed;
|
||||
std::time_t Date = std::time_t(0);
|
||||
GuidSet CompletingPlayers;
|
||||
bool Changed;
|
||||
};
|
||||
|
||||
typedef std::unordered_map<uint32, CriteriaProgress> CriteriaProgressMap;
|
||||
typedef std::unordered_map<uint32, CompletedAchievementData> CompletedAchievementMap;
|
||||
|
||||
enum ProgressType
|
||||
class TC_GAME_API AchievementMgr : public CriteriaHandler
|
||||
{
|
||||
PROGRESS_SET,
|
||||
PROGRESS_ACCUMULATE,
|
||||
PROGRESS_HIGHEST
|
||||
public:
|
||||
AchievementMgr();
|
||||
~AchievementMgr();
|
||||
|
||||
void CheckAllAchievementCriteria(Player* referencePlayer);
|
||||
|
||||
virtual void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer) = 0;
|
||||
bool HasAchieved(uint32 achievementId) const;
|
||||
uint32 GetAchievementPoints() const;
|
||||
|
||||
protected:
|
||||
bool CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const override;
|
||||
bool CanCompleteCriteriaTree(CriteriaTree const* tree) override;
|
||||
void CompletedCriteriaTree(CriteriaTree const* tree, Player* referencePlayer) override;
|
||||
void AfterCriteriaTreeUpdate(CriteriaTree const* tree, Player* referencePlayer) override;
|
||||
|
||||
bool IsCompletedAchievement(AchievementEntry const* entry);
|
||||
|
||||
bool RequiredAchievementSatisfied(uint32 achievementId) const override;
|
||||
|
||||
protected:
|
||||
std::unordered_map<uint32, CompletedAchievementData> _completedAchievements;
|
||||
uint32 _achievementPoints;
|
||||
};
|
||||
|
||||
// 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>
|
||||
class TC_GAME_API PlayerAchievementMgr : public AchievementMgr
|
||||
{
|
||||
static void DeleteFromDB(ObjectGuid lowguid) { DeletePlayerAchievementsFromDB(lowguid); }
|
||||
public:
|
||||
explicit PlayerAchievementMgr(Player* owner);
|
||||
|
||||
void Reset() override;
|
||||
|
||||
static void DeleteFromDB(ObjectGuid const& guid);
|
||||
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult);
|
||||
void SaveToDB(SQLTransaction& trans);
|
||||
|
||||
void ResetCriteria(CriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false);
|
||||
|
||||
void SendAllData(Player const* receiver) const override;
|
||||
void SendAchievementInfo(Player* receiver, uint32 achievementId = 0) const;
|
||||
|
||||
void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer);
|
||||
|
||||
protected:
|
||||
void SendCriteriaUpdate(Criteria const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const override;
|
||||
void SendCriteriaProgressRemoved(uint32 criteriaId) override;
|
||||
|
||||
void SendAchievementEarned(AchievementEntry const* achievement) const;
|
||||
|
||||
void SendPacket(WorldPacket const* data) const;
|
||||
|
||||
std::string GetOwnerInfo() const override;
|
||||
CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override;
|
||||
|
||||
private:
|
||||
Player* _owner;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct AchievementMgrDeleterBase<Guild>
|
||||
class TC_GAME_API GuildAchievementMgr : public AchievementMgr
|
||||
{
|
||||
static void DeleteFromDB(ObjectGuid lowguid) { DeleteGuildAchievementsFromDB(lowguid); }
|
||||
};
|
||||
public:
|
||||
explicit GuildAchievementMgr(Guild* owner);
|
||||
|
||||
template<class T>
|
||||
class TC_GAME_API AchievementMgr
|
||||
: public AchievementMgrDeleterBase<T>
|
||||
{
|
||||
public:
|
||||
AchievementMgr(T* owner);
|
||||
~AchievementMgr();
|
||||
void Reset() override;
|
||||
|
||||
void Reset();
|
||||
static void DeleteFromDB(ObjectGuid const& guid);
|
||||
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult);
|
||||
void SaveToDB(SQLTransaction& trans);
|
||||
|
||||
using AchievementMgrDeleterBase<T>::DeleteFromDB;
|
||||
void SendAllData(Player const* receiver) const override;
|
||||
void SendAchievementInfo(Player* receiver, uint32 achievementId = 0) const;
|
||||
void SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const;
|
||||
|
||||
void LoadFromDB(PreparedQueryResult achievementResult, PreparedQueryResult criteriaResult);
|
||||
void SaveToDB(SQLTransaction& trans);
|
||||
void ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false);
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, Unit const* unit = NULL, Player* referencePlayer = NULL);
|
||||
void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer);
|
||||
void CheckAllAchievementCriteria(Player* referencePlayer);
|
||||
void SendAllAchievementData(Player* receiver) const;
|
||||
void SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const;
|
||||
void SendAchievementInfo(Player* receiver, uint32 achievementId = 0) const;
|
||||
bool HasAchieved(uint32 achievementId) const;
|
||||
T* GetOwner() const { return _owner; }
|
||||
void CompletedAchievement(AchievementEntry const* entry, Player* referencePlayer);
|
||||
|
||||
void UpdateTimedAchievements(uint32 timeDiff);
|
||||
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
|
||||
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry); // used for quest and scripted timed achievements
|
||||
protected:
|
||||
void SendCriteriaUpdate(Criteria const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const override;
|
||||
void SendCriteriaProgressRemoved(uint32 criteriaId) override;
|
||||
|
||||
uint32 GetAchievementPoints() const { return _achievementPoints; }
|
||||
private:
|
||||
void SendAchievementEarned(AchievementEntry const* achievement) const;
|
||||
void SendCriteriaUpdate(AchievementCriteria const* entry, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const;
|
||||
CriteriaProgress* GetCriteriaProgress(AchievementCriteria const* entry);
|
||||
void SetCriteriaProgress(AchievementCriteria const* entry, uint64 changeValue, Player* referencePlayer, ProgressType ptype = PROGRESS_SET);
|
||||
void RemoveCriteriaProgress(AchievementCriteria const* entry);
|
||||
void CompletedCriteriaFor(AchievementEntry const* achievement, Player* referencePlayer);
|
||||
bool IsCompletedCriteriaTree(AchievementCriteriaTree const* tree);
|
||||
bool IsCompletedCriteria(AchievementCriteria const* achievementCriteria, uint64 requiredAmount);
|
||||
bool IsCompletedAchievement(AchievementEntry const* entry);
|
||||
bool CanUpdateCriteria(AchievementCriteria const* criteria, AchievementCriteriaTreeList const* trees, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer);
|
||||
void SendPacket(WorldPacket const* data) const;
|
||||
void SendAchievementEarned(AchievementEntry const* achievement) const;
|
||||
|
||||
bool ConditionsSatisfied(AchievementCriteria const* criteria, Player* referencePlayer) const;
|
||||
bool RequirementsSatisfied(AchievementCriteria const* criteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer) const;
|
||||
bool AdditionalRequirementsSatisfied(ModifierTreeNode const* parent, uint64 miscValue1, uint64 miscValue2, Unit const* unit, Player* referencePlayer) const;
|
||||
void SendPacket(WorldPacket const* data) const;
|
||||
|
||||
T* _owner;
|
||||
CriteriaProgressMap m_criteriaProgress;
|
||||
CompletedAchievementMap m_completedAchievements;
|
||||
typedef std::map<uint32, uint32> TimedAchievementMap;
|
||||
TimedAchievementMap m_timedAchievements; // Criteria tree id/time left in MS
|
||||
uint32 _achievementPoints;
|
||||
std::string GetOwnerInfo() const override;
|
||||
CriteriaList const& GetCriteriaByType(CriteriaTypes type) const override;
|
||||
|
||||
private:
|
||||
Guild* _owner;
|
||||
};
|
||||
|
||||
class TC_GAME_API AchievementGlobalMgr
|
||||
{
|
||||
AchievementGlobalMgr() { }
|
||||
~AchievementGlobalMgr();
|
||||
AchievementGlobalMgr() { }
|
||||
~AchievementGlobalMgr() { }
|
||||
|
||||
public:
|
||||
static char const* GetCriteriaTypeString(AchievementCriteriaTypes type);
|
||||
static char const* GetCriteriaTypeString(uint32 type);
|
||||
public:
|
||||
static AchievementGlobalMgr* Instance();
|
||||
|
||||
static AchievementGlobalMgr* instance();
|
||||
std::vector<AchievementEntry const*> const* GetAchievementByReferencedId(uint32 id) const;
|
||||
AchievementReward const* GetAchievementReward(AchievementEntry const* achievement) const;
|
||||
AchievementRewardLocale const* GetAchievementRewardLocale(AchievementEntry const* achievement) const;
|
||||
|
||||
AchievementCriteriaTreeList const* GetAchievementCriteriaTreesByCriteria(uint32 criteriaId) const
|
||||
{
|
||||
auto itr = _achievementCriteriaTreeByCriteria.find(criteriaId);
|
||||
return itr != _achievementCriteriaTreeByCriteria.end() ? &itr->second : nullptr;
|
||||
}
|
||||
bool IsRealmCompleted(AchievementEntry const* achievement) const;
|
||||
void SetRealmCompleted(AchievementEntry const* achievement);
|
||||
|
||||
AchievementCriteriaList const& GetAchievementCriteriaByType(AchievementCriteriaTypes type, bool guild = false) const
|
||||
{
|
||||
return guild ? _guildAchievementCriteriasByType[type] : _achievementCriteriasByType[type];
|
||||
}
|
||||
void LoadAchievementReferenceList();
|
||||
void LoadCompletedAchievements();
|
||||
void LoadRewards();
|
||||
void LoadRewardLocales();
|
||||
|
||||
AchievementCriteriaList const& GetTimedAchievementCriteriaByType(AchievementCriteriaTimedTypes type) const
|
||||
{
|
||||
return _achievementCriteriasByTimedType[type];
|
||||
}
|
||||
private:
|
||||
// store achievements by referenced achievement id to speed up lookup
|
||||
std::unordered_map<uint32, std::vector<AchievementEntry const*>> _achievementListByReferencedId;
|
||||
|
||||
AchievementEntryList const* GetAchievementByReferencedId(uint32 id) const
|
||||
{
|
||||
AchievementListByReferencedId::const_iterator itr = _achievementListByReferencedId.find(id);
|
||||
return itr != _achievementListByReferencedId.end() ? &itr->second : NULL;
|
||||
}
|
||||
// store realm first achievements
|
||||
// std::chrono::system_clock::time_point::min() is a placeholder value for realm firsts not yet completed
|
||||
// std::chrono::system_clock::time_point::max() is a value assigned to realm firsts complete before worldserver started
|
||||
std::unordered_map<uint32 /*achievementId*/, std::chrono::system_clock::time_point /*completionTime*/> _allCompletedAchievements;
|
||||
|
||||
AchievementReward const* GetAchievementReward(AchievementEntry const* achievement) const
|
||||
{
|
||||
AchievementRewards::const_iterator iter = _achievementRewards.find(achievement->ID);
|
||||
return iter != _achievementRewards.end() ? &iter->second : NULL;
|
||||
}
|
||||
|
||||
AchievementRewardLocale const* GetAchievementRewardLocale(AchievementEntry const* achievement) const
|
||||
{
|
||||
AchievementRewardLocales::const_iterator iter = _achievementRewardLocales.find(achievement->ID);
|
||||
return iter != _achievementRewardLocales.end() ? &iter->second : NULL;
|
||||
}
|
||||
|
||||
AchievementCriteriaDataSet const* GetCriteriaDataSet(AchievementCriteria const* achievementCriteria) const
|
||||
{
|
||||
AchievementCriteriaDataMap::const_iterator iter = _criteriaDataMap.find(achievementCriteria->ID);
|
||||
return iter != _criteriaDataMap.end() ? &iter->second : NULL;
|
||||
}
|
||||
|
||||
bool IsRealmCompleted(AchievementEntry const* achievement, uint32 instanceId) const
|
||||
{
|
||||
AllCompletedAchievements::const_iterator itr = _allCompletedAchievements.find(achievement->ID);
|
||||
if (itr == _allCompletedAchievements.end())
|
||||
return false;
|
||||
|
||||
if (achievement->Flags & ACHIEVEMENT_FLAG_REALM_FIRST_KILL)
|
||||
return itr->second != instanceId;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void SetRealmCompleted(AchievementEntry const* achievement, uint32 instanceId)
|
||||
{
|
||||
if (IsRealmCompleted(achievement, instanceId))
|
||||
return;
|
||||
|
||||
_allCompletedAchievements[achievement->ID] = instanceId;
|
||||
}
|
||||
|
||||
bool IsGroupCriteriaType(AchievementCriteriaTypes type) const
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_BG:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET: // NYI
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA:
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2: // NYI
|
||||
case ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_BATTLEGROUND: // NYI
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
template<typename Func>
|
||||
void WalkCriteriaTree(AchievementCriteriaTree const* tree, Func const& func) const
|
||||
{
|
||||
for (AchievementCriteriaTree const* node : tree->Children)
|
||||
WalkCriteriaTree(node, func);
|
||||
|
||||
func(tree);
|
||||
}
|
||||
|
||||
// Removes instanceId as valid id to complete realm first kill achievements
|
||||
void OnInstanceDestroyed(uint32 instanceId);
|
||||
|
||||
void LoadAchievementCriteriaModifiersTree();
|
||||
void LoadAchievementCriteriaList();
|
||||
void LoadAchievementCriteriaData();
|
||||
void LoadAchievementReferenceList();
|
||||
void LoadCompletedAchievements();
|
||||
void LoadRewards();
|
||||
void LoadRewardLocales();
|
||||
AchievementEntry const* GetAchievement(uint32 achievementId) const;
|
||||
AchievementCriteriaTree const* GetAchievementCriteriaTree(uint32 criteriaTreeId) const;
|
||||
AchievementCriteria const* GetAchievementCriteria(uint32 criteriaId) const;
|
||||
private:
|
||||
AchievementCriteriaDataMap _criteriaDataMap;
|
||||
|
||||
AchievementCriteriaTreeMap _achievementCriteriaTrees;
|
||||
AchievementCriteriaMap _achievementCriteria;
|
||||
ModifierTreeMap _criteriaModifiers;
|
||||
|
||||
AchievementCriteriaTreeByCriteriaMap _achievementCriteriaTreeByCriteria;
|
||||
|
||||
// store achievement criterias by type to speed up lookup
|
||||
AchievementCriteriaList _achievementCriteriasByType[ACHIEVEMENT_CRITERIA_TYPE_TOTAL];
|
||||
AchievementCriteriaList _guildAchievementCriteriasByType[ACHIEVEMENT_CRITERIA_TYPE_TOTAL];
|
||||
|
||||
AchievementCriteriaList _achievementCriteriasByTimedType[ACHIEVEMENT_TIMED_TYPE_MAX];
|
||||
|
||||
// store achievements by referenced achievement id to speed up lookup
|
||||
AchievementListByReferencedId _achievementListByReferencedId;
|
||||
|
||||
typedef std::map<uint32 /*achievementId*/, uint32 /*instanceId*/> AllCompletedAchievements;
|
||||
AllCompletedAchievements _allCompletedAchievements;
|
||||
|
||||
AchievementRewards _achievementRewards;
|
||||
AchievementRewardLocales _achievementRewardLocales;
|
||||
std::unordered_map<uint32, AchievementReward> _achievementRewards;
|
||||
std::unordered_map<uint32, AchievementRewardLocale> _achievementRewardLocales;
|
||||
};
|
||||
|
||||
#define sAchievementMgr AchievementGlobalMgr::instance()
|
||||
#define sAchievementMgr AchievementGlobalMgr::Instance()
|
||||
|
||||
#endif
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,393 @@
|
||||
/*
|
||||
* Copyright (C) 2008-2016 TrinityCore <http://www.trinitycore.org/>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef CriteriaHandler_h__
|
||||
#define CriteriaHandler_h__
|
||||
|
||||
#include "DBCEnums.h"
|
||||
#include "ObjectGuid.h"
|
||||
#include "Transaction.h"
|
||||
#include "Common.h"
|
||||
|
||||
class Player;
|
||||
class Unit;
|
||||
class WorldPacket;
|
||||
struct AchievementEntry;
|
||||
struct CriteriaEntry;
|
||||
struct CriteriaTreeEntry;
|
||||
struct ModifierTreeEntry;
|
||||
struct ScenarioStepEntry;
|
||||
|
||||
struct ModifierTreeNode
|
||||
{
|
||||
ModifierTreeEntry const* Entry;
|
||||
std::vector<ModifierTreeNode const*> Children;
|
||||
};
|
||||
|
||||
enum CriteriaFlagsCu
|
||||
{
|
||||
CRITERIA_FLAG_CU_PLAYER = 0x1,
|
||||
CRITERIA_FLAG_CU_ACCOUNT = 0x2,
|
||||
CRITERIA_FLAG_CU_GUILD = 0x4,
|
||||
CRITERIA_FLAG_CU_SCENARIO = 0x8
|
||||
};
|
||||
|
||||
struct Criteria
|
||||
{
|
||||
uint32 ID = 0;
|
||||
CriteriaEntry const* Entry = nullptr;
|
||||
ModifierTreeNode const* Modifier = nullptr;
|
||||
uint32 FlagsCu = 0;
|
||||
};
|
||||
|
||||
typedef std::vector<Criteria const*> CriteriaList;
|
||||
|
||||
struct CriteriaTree
|
||||
{
|
||||
uint32 ID = 0;
|
||||
CriteriaTreeEntry const* Entry = nullptr;
|
||||
AchievementEntry const* Achievement = nullptr;
|
||||
ScenarioStepEntry const* ScenarioStep = nullptr;
|
||||
Criteria const* Criteria = nullptr;
|
||||
std::vector<CriteriaTree const*> Children;
|
||||
};
|
||||
|
||||
typedef std::vector<CriteriaTree const*> CriteriaTreeList;
|
||||
|
||||
struct CriteriaProgress
|
||||
{
|
||||
uint64 Counter = 0;
|
||||
std::time_t Date = std::time_t(0); // latest update time.
|
||||
ObjectGuid PlayerGUID; // GUID of the player that last updated the criteria
|
||||
bool Changed = false;
|
||||
};
|
||||
|
||||
enum CriteriaDataType
|
||||
{ // value1 value2 comment
|
||||
CRITERIA_DATA_TYPE_NONE = 0, // 0 0
|
||||
CRITERIA_DATA_TYPE_T_CREATURE = 1, // CreatureId 0
|
||||
CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE = 2, // ClassId RaceId
|
||||
CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH = 3, // HealthPercent 0
|
||||
CRITERIA_DATA_TYPE_S_AURA = 5, // SpellId EffectIndex
|
||||
CRITERIA_DATA_TYPE_T_AURA = 7, // SpellId EffectIndex
|
||||
CRITERIA_DATA_TYPE_VALUE = 8, // Minvalue value provided with update must be not less that limit
|
||||
CRITERIA_DATA_TYPE_T_LEVEL = 9, // Minlevel minlevel of target
|
||||
CRITERIA_DATA_TYPE_T_GENDER = 10, // Gender 0=male; 1=female
|
||||
CRITERIA_DATA_TYPE_SCRIPT = 11, // Scripted requirement
|
||||
// REUSE
|
||||
CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13, // Count "with less than %u people in the zone"
|
||||
CRITERIA_DATA_TYPE_T_TEAM = 14, // Team HORDE(67), ALLIANCE(469)
|
||||
CRITERIA_DATA_TYPE_S_DRUNK = 15, // DrunkenState 0 (enum DrunkenState) of player
|
||||
CRITERIA_DATA_TYPE_HOLIDAY = 16, // HolidayId 0 event in holiday time
|
||||
CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE = 17, // MinScore MaxScore player's team win bg and opposition team have team score in range
|
||||
CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18, // 0 0 maker instance script call for check current criteria requirements fit
|
||||
CRITERIA_DATA_TYPE_S_EQUIPED_ITEM = 19, // ItemLevel Quality for equipped item in slot to check item level and quality
|
||||
CRITERIA_DATA_TYPE_MAP_ID = 20, // MapId 0 player must be on map with id in map_id
|
||||
CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21, // Class Race
|
||||
// REUSE
|
||||
CRITERIA_DATA_TYPE_S_KNOWN_TITLE = 23, // TitleId known (pvp) title, values from dbc
|
||||
CRITERIA_DATA_TYPE_GAME_EVENT = 24, // GameEventId 0
|
||||
|
||||
MAX_CRITERIA_DATA_TYPE
|
||||
};
|
||||
|
||||
struct CriteriaData
|
||||
{
|
||||
CriteriaDataType DataType;
|
||||
union
|
||||
{
|
||||
// CRITERIA_DATA_TYPE_NONE = 0 (no data)
|
||||
// CRITERIA_DATA_TYPE_T_CREATURE = 1
|
||||
struct
|
||||
{
|
||||
uint32 Id;
|
||||
} Creature;
|
||||
// CRITERIA_DATA_TYPE_T_PLAYER_CLASS_RACE = 2
|
||||
// CRITERIA_DATA_TYPE_S_PLAYER_CLASS_RACE = 21
|
||||
struct
|
||||
{
|
||||
uint32 Class;
|
||||
uint32 Race;
|
||||
} ClassRace;
|
||||
// CRITERIA_DATA_TYPE_T_PLAYER_LESS_HEALTH = 3
|
||||
struct
|
||||
{
|
||||
uint32 Percent;
|
||||
} Health;
|
||||
// CRITERIA_DATA_TYPE_S_AURA = 5
|
||||
// CRITERIA_DATA_TYPE_T_AURA = 7
|
||||
struct
|
||||
{
|
||||
uint32 SpellId;
|
||||
uint32 EffectIndex;
|
||||
} Aura;
|
||||
// CRITERIA_DATA_TYPE_VALUE = 8
|
||||
struct
|
||||
{
|
||||
uint32 Value;
|
||||
uint32 ComparisonType;
|
||||
} Value;
|
||||
// CRITERIA_DATA_TYPE_T_LEVEL = 9
|
||||
struct
|
||||
{
|
||||
uint32 Min;
|
||||
} Level;
|
||||
// CRITERIA_DATA_TYPE_T_GENDER = 10
|
||||
struct
|
||||
{
|
||||
uint32 Gender;
|
||||
} Gender;
|
||||
// CRITERIA_DATA_TYPE_SCRIPT = 11 (no data)
|
||||
// CRITERIA_DATA_TYPE_MAP_PLAYER_COUNT = 13
|
||||
struct
|
||||
{
|
||||
uint32 MaxCount;
|
||||
} MapPlayers;
|
||||
// CRITERIA_DATA_TYPE_T_TEAM = 14
|
||||
struct
|
||||
{
|
||||
uint32 Team;
|
||||
} Team;
|
||||
// CRITERIA_DATA_TYPE_S_DRUNK = 15
|
||||
struct
|
||||
{
|
||||
uint32 State;
|
||||
} Drunk;
|
||||
// CRITERIA_DATA_TYPE_HOLIDAY = 16
|
||||
struct
|
||||
{
|
||||
uint32 Id;
|
||||
} Holiday;
|
||||
// CRITERIA_DATA_TYPE_BG_LOSS_TEAM_SCORE= 17
|
||||
struct
|
||||
{
|
||||
uint32 Min;
|
||||
uint32 Max;
|
||||
} BattlegroundScore;
|
||||
// CRITERIA_DATA_TYPE_INSTANCE_SCRIPT = 18 (no data)
|
||||
// CRITERIA_DATA_TYPE_S_EQUIPED_ITEM = 19
|
||||
struct
|
||||
{
|
||||
uint32 ItemLevel;
|
||||
uint32 Quality;
|
||||
} EquippedItem;
|
||||
// CRITERIA_DATA_TYPE_MAP_ID = 20
|
||||
struct
|
||||
{
|
||||
uint32 Id;
|
||||
} Map;
|
||||
// CRITERIA_DATA_TYPE_KNOWN_TITLE = 22
|
||||
struct
|
||||
{
|
||||
uint32 Id;
|
||||
} KnownTitle;
|
||||
// CRITERIA_DATA_TYPE_GAME_EVENT = 24
|
||||
struct
|
||||
{
|
||||
uint32 Id;
|
||||
} GameEvent;
|
||||
// raw
|
||||
struct
|
||||
{
|
||||
uint32 Value1;
|
||||
uint32 Value2;
|
||||
} Raw;
|
||||
};
|
||||
uint32 ScriptId;
|
||||
|
||||
CriteriaData() : DataType(CRITERIA_DATA_TYPE_NONE)
|
||||
{
|
||||
Raw.Value1 = 0;
|
||||
Raw.Value2 = 0;
|
||||
ScriptId = 0;
|
||||
}
|
||||
|
||||
CriteriaData(uint32 _dataType, uint32 _value1, uint32 _value2, uint32 _scriptId) : DataType(CriteriaDataType(_dataType))
|
||||
{
|
||||
Raw.Value1 = _value1;
|
||||
Raw.Value2 = _value2;
|
||||
ScriptId = _scriptId;
|
||||
}
|
||||
|
||||
bool IsValid(Criteria const* criteria);
|
||||
bool Meets(uint32 criteriaId, Player const* source, Unit const* target, uint32 miscValue1 = 0) const;
|
||||
};
|
||||
|
||||
struct CriteriaDataSet
|
||||
{
|
||||
CriteriaDataSet() : _criteriaId(0) { }
|
||||
void Add(CriteriaData const& data) { _storage.push_back(data); }
|
||||
bool Meets(Player const* source, Unit const* target, uint32 miscValue = 0) const;
|
||||
void SetCriteriaId(uint32 id) { _criteriaId = id; }
|
||||
private:
|
||||
uint32 _criteriaId;
|
||||
std::vector<CriteriaData> _storage;
|
||||
};
|
||||
|
||||
typedef std::map<uint32, CriteriaDataSet> CriteriaDataMap;
|
||||
typedef std::unordered_map<uint32, CriteriaProgress> CriteriaProgressMap;
|
||||
|
||||
enum ProgressType
|
||||
{
|
||||
PROGRESS_SET,
|
||||
PROGRESS_ACCUMULATE,
|
||||
PROGRESS_HIGHEST
|
||||
};
|
||||
|
||||
class TC_GAME_API CriteriaHandler
|
||||
{
|
||||
public:
|
||||
CriteriaHandler();
|
||||
virtual ~CriteriaHandler();
|
||||
|
||||
virtual void Reset();
|
||||
|
||||
void UpdateCriteria(CriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, Unit const* unit = nullptr, Player* referencePlayer = nullptr);
|
||||
|
||||
virtual void SendAllData(Player const* receiver) const = 0;
|
||||
|
||||
void UpdateTimedCriteria(uint32 timeDiff);
|
||||
void StartCriteriaTimer(CriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
|
||||
void RemoveCriteriaTimer(CriteriaTimedTypes type, uint32 entry); // used for quest and scripted timed s
|
||||
|
||||
protected:
|
||||
virtual void SendCriteriaUpdate(Criteria const* criteria, CriteriaProgress const* progress, uint32 timeElapsed, bool timedCompleted) const = 0;
|
||||
|
||||
CriteriaProgress* GetCriteriaProgress(Criteria const* entry);
|
||||
void SetCriteriaProgress(Criteria const* criteria, uint64 changeValue, Player* referencePlayer, ProgressType progressType = PROGRESS_SET);
|
||||
void RemoveCriteriaProgress(Criteria const* criteria);
|
||||
virtual void SendCriteriaProgressRemoved(uint32 criteriaId) = 0;
|
||||
|
||||
bool IsCompletedCriteriaTree(CriteriaTree const* tree);
|
||||
virtual bool CanUpdateCriteriaTree(Criteria const* criteria, CriteriaTree const* tree, Player* referencePlayer) const = 0;
|
||||
virtual bool CanCompleteCriteriaTree(CriteriaTree const* tree);
|
||||
virtual void CompletedCriteriaTree(CriteriaTree const* tree, Player* referencePlayer) = 0;
|
||||
virtual void AfterCriteriaTreeUpdate(CriteriaTree const* /*tree*/, Player* /*referencePlayer*/) { }
|
||||
|
||||
bool IsCompletedCriteria(Criteria const* criteria, uint64 requiredAmount);
|
||||
bool CanUpdateCriteria(Criteria const* criteria, CriteriaTreeList const* trees, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer);
|
||||
|
||||
virtual void SendPacket(WorldPacket const* data) const = 0;
|
||||
|
||||
bool ConditionsSatisfied(Criteria const* criteria, Player* referencePlayer) const;
|
||||
bool RequirementsSatisfied(Criteria const* criteria, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer) const;
|
||||
virtual bool RequiredAchievementSatisfied(uint32 /*achievementId*/) const { return false; }
|
||||
bool AdditionalRequirementsSatisfied(ModifierTreeNode const* parent, uint64 miscValue1, uint64 miscValue2, Unit const* unit, Player* referencePlayer) const;
|
||||
|
||||
virtual std::string GetOwnerInfo() const = 0;
|
||||
virtual CriteriaList const& GetCriteriaByType(CriteriaTypes type) const = 0;
|
||||
|
||||
CriteriaProgressMap _criteriaProgress;
|
||||
std::map<uint32, uint32 /*ms time left*/> _timeCriteriaTrees;
|
||||
};
|
||||
|
||||
class TC_GAME_API CriteriaMgr
|
||||
{
|
||||
CriteriaMgr() { }
|
||||
~CriteriaMgr();
|
||||
|
||||
public:
|
||||
static char const* GetCriteriaTypeString(CriteriaTypes type);
|
||||
static char const* GetCriteriaTypeString(uint32 type);
|
||||
|
||||
static CriteriaMgr* Instance();
|
||||
|
||||
CriteriaList const& GetPlayerCriteriaByType(CriteriaTypes type) const
|
||||
{
|
||||
return _criteriasByType[type];
|
||||
}
|
||||
|
||||
CriteriaList const& GetGuildCriteriaByType(CriteriaTypes type) const
|
||||
{
|
||||
return _guildCriteriasByType[type];
|
||||
}
|
||||
|
||||
CriteriaList const& GetScenarioCriteriaByType(CriteriaTypes type) const
|
||||
{
|
||||
return _scenarioCriteriasByType[type];
|
||||
}
|
||||
|
||||
CriteriaTreeList const* GetCriteriaTreesByCriteria(uint32 criteriaId) const
|
||||
{
|
||||
auto itr = _criteriaTreeByCriteria.find(criteriaId);
|
||||
return itr != _criteriaTreeByCriteria.end() ? &itr->second : nullptr;
|
||||
}
|
||||
|
||||
CriteriaList const& GetTimedCriteriaByType(CriteriaTimedTypes type) const
|
||||
{
|
||||
return _criteriasByTimedType[type];
|
||||
}
|
||||
|
||||
CriteriaDataSet const* GetCriteriaDataSet(Criteria const* Criteria) const
|
||||
{
|
||||
CriteriaDataMap::const_iterator iter = _criteriaDataMap.find(Criteria->ID);
|
||||
return iter != _criteriaDataMap.end() ? &iter->second : NULL;
|
||||
}
|
||||
|
||||
static bool IsGroupCriteriaType(CriteriaTypes type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case CRITERIA_TYPE_KILL_CREATURE:
|
||||
case CRITERIA_TYPE_WIN_BG:
|
||||
case CRITERIA_TYPE_BE_SPELL_TARGET: // NYI
|
||||
case CRITERIA_TYPE_WIN_RATED_ARENA:
|
||||
case CRITERIA_TYPE_BE_SPELL_TARGET2: // NYI
|
||||
case CRITERIA_TYPE_WIN_RATED_BATTLEGROUND: // NYI
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
template<typename Func>
|
||||
static void WalkCriteriaTree(CriteriaTree const* tree, Func const& func)
|
||||
{
|
||||
for (CriteriaTree const* node : tree->Children)
|
||||
WalkCriteriaTree(node, func);
|
||||
|
||||
func(tree);
|
||||
}
|
||||
|
||||
void LoadCriteriaModifiersTree();
|
||||
void LoadCriteriaList();
|
||||
void LoadCriteriaData();
|
||||
CriteriaTree const* GetCriteriaTree(uint32 criteriaTreeId) const;
|
||||
Criteria const* GetCriteria(uint32 criteriaId) const;
|
||||
|
||||
private:
|
||||
CriteriaDataMap _criteriaDataMap;
|
||||
|
||||
std::unordered_map<uint32, CriteriaTree*> _criteriaTrees;
|
||||
std::unordered_map<uint32, Criteria*> _criteria;
|
||||
std::unordered_map<uint32, ModifierTreeNode*> _criteriaModifiers;
|
||||
|
||||
std::unordered_map<uint32, CriteriaTreeList> _criteriaTreeByCriteria;
|
||||
|
||||
// store criterias by type to speed up lookup
|
||||
CriteriaList _criteriasByType[CRITERIA_TYPE_TOTAL];
|
||||
CriteriaList _guildCriteriasByType[CRITERIA_TYPE_TOTAL];
|
||||
CriteriaList _scenarioCriteriasByType[CRITERIA_TYPE_TOTAL];
|
||||
|
||||
CriteriaList _criteriasByTimedType[CRITERIA_TIMED_TYPE_MAX];
|
||||
};
|
||||
|
||||
#define sCriteriaMgr CriteriaMgr::Instance()
|
||||
|
||||
#endif // CriteriaHandler_h__
|
||||
@@ -157,7 +157,7 @@ void AuctionHouseMgr::SendAuctionWonMail(AuctionEntry* auction, SQLTransaction&
|
||||
{
|
||||
bidder->GetSession()->SendAuctionWonNotification(auction, item);
|
||||
// FIXME: for offline player need also
|
||||
bidder->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS, 1);
|
||||
bidder->UpdateCriteria(CRITERIA_TYPE_WON_AUCTIONS, 1);
|
||||
}
|
||||
|
||||
MailDraft(auction->BuildAuctionMailSubject(AUCTION_WON), AuctionEntry::BuildAuctionMailBody(auction->owner, auction->bid, auction->buyout, 0, 0))
|
||||
@@ -198,8 +198,8 @@ void AuctionHouseMgr::SendAuctionSuccessfulMail(AuctionEntry* auction, SQLTransa
|
||||
//FIXME: what do if owner offline
|
||||
if (owner && item)
|
||||
{
|
||||
owner->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS, profit);
|
||||
owner->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD, auction->bid);
|
||||
owner->UpdateCriteria(CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS, profit);
|
||||
owner->UpdateCriteria(CRITERIA_TYPE_HIGHEST_AUCTION_SOLD, auction->bid);
|
||||
//send auction owner notification, bidder must be current!
|
||||
owner->GetSession()->SendAuctionClosedNotification(auction, (float)sWorld->getIntConfig(CONFIG_MAIL_DELIVERY_DELAY), true, item);
|
||||
}
|
||||
|
||||
@@ -333,7 +333,7 @@ void BattlePetMgr::AddPet(uint32 species, uint32 creatureId, uint16 breed, uint8
|
||||
updates.push_back(pet);
|
||||
SendUpdates(updates, true);
|
||||
|
||||
_owner->GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET, species);
|
||||
_owner->GetPlayer()->UpdateCriteria(CRITERIA_TYPE_OWN_BATTLE_PET, species);
|
||||
}
|
||||
|
||||
void BattlePetMgr::RemovePet(ObjectGuid guid)
|
||||
|
||||
@@ -414,7 +414,7 @@ void BattlefieldWG::OnBattleEnd(bool endByTimer)
|
||||
// *******************************************************
|
||||
void BattlefieldWG::DoCompleteOrIncrementAchievement(uint32 achievement, Player* player, uint8 /*incrementNumber*/)
|
||||
{
|
||||
AchievementEntry const* achievementEntry = sAchievementMgr->GetAchievement(achievement);
|
||||
AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(achievement);
|
||||
|
||||
if (!achievementEntry)
|
||||
return;
|
||||
@@ -423,7 +423,7 @@ void BattlefieldWG::DoCompleteOrIncrementAchievement(uint32 achievement, Player*
|
||||
{
|
||||
case ACHIEVEMENTS_WIN_WG_100:
|
||||
{
|
||||
// player->UpdateAchievementCriteria();
|
||||
// player->UpdateCriteria();
|
||||
}
|
||||
default:
|
||||
{
|
||||
|
||||
@@ -222,8 +222,8 @@ void Arena::EndBattleground(uint32 winner)
|
||||
{
|
||||
// update achievement BEFORE personal rating update
|
||||
uint32 rating = player->GetArenaPersonalRating(winnerArenaTeam->GetSlot());
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, rating ? rating : 1);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA, GetMapId());
|
||||
player->UpdateCriteria(CRITERIA_TYPE_WIN_RATED_ARENA, rating ? rating : 1);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_WIN_ARENA, GetMapId());
|
||||
player->ModifyCurrency(CURRENCY_TYPE_CONQUEST_META_ARENA, sWorld->getIntConfig(CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD));
|
||||
|
||||
// Last standing - Rated 5v5 arena & be solely alive player
|
||||
@@ -235,7 +235,7 @@ void Arena::EndBattleground(uint32 winner)
|
||||
guildAwarded = true;
|
||||
if (ObjectGuid::LowType guildId = GetBgMap()->GetOwnerGuildId(player->GetBGTeam()))
|
||||
if (Guild* guild = sGuildMgr->GetGuildById(guildId))
|
||||
guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, std::max<uint32>(winnerArenaTeam->GetRating(), 1), 0, 0, NULL, player);
|
||||
guild->UpdateCriteria(CRITERIA_TYPE_WIN_RATED_ARENA, std::max<uint32>(winnerArenaTeam->GetRating(), 1), 0, 0, NULL, player);
|
||||
}
|
||||
|
||||
winnerArenaTeam->MemberWon(player, loserMatchmakerRating, winnerMatchmakerChange);
|
||||
@@ -245,7 +245,7 @@ void Arena::EndBattleground(uint32 winner)
|
||||
loserArenaTeam->MemberLost(player, winnerMatchmakerRating, loserMatchmakerChange);
|
||||
|
||||
// Arena lost => reset the win_rated_arena having the "no_lose" condition
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA, ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE);
|
||||
player->ResetCriteria(CRITERIA_TYPE_WIN_RATED_ARENA, CRITERIA_CONDITION_NO_LOSE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -436,7 +436,7 @@ void ArenaTeamMember::ModifyPersonalRating(Player* player, int32 mod, uint32 typ
|
||||
if (player)
|
||||
{
|
||||
player->SetArenaTeamInfoField(ArenaTeam::GetSlotByType(type), ARENA_TEAM_PERSONAL_RATING, PersonalRating);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING, PersonalRating, type);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_HIGHEST_PERSONAL_RATING, PersonalRating, type);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -597,7 +597,7 @@ void ArenaTeam::FinishGame(int32 mod)
|
||||
// Check if rating related achivements are met
|
||||
for (MemberList::iterator itr = Members.begin(); itr != Members.end(); ++itr)
|
||||
if (Player* member = ObjectAccessor::FindConnectedPlayer(itr->Guid))
|
||||
member->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING, Stats.Rating, Type);
|
||||
member->UpdateCriteria(CRITERIA_TYPE_HIGHEST_TEAM_RATING, Stats.Rating, Type);
|
||||
}
|
||||
|
||||
// Update number of games played per season or week
|
||||
|
||||
@@ -869,14 +869,14 @@ void Battleground::EndBattleground(uint32 winner)
|
||||
else // 50cp awarded for each non-rated battleground won
|
||||
player->ModifyCurrency(CURRENCY_TYPE_CONQUEST_META_ARENA, sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_CONQUEST_LAST));
|
||||
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_WIN_BG, 1);
|
||||
if (!guildAwarded)
|
||||
{
|
||||
guildAwarded = true;
|
||||
if (ObjectGuid::LowType guildId = GetBgMap()->GetOwnerGuildId(player->GetBGTeam()))
|
||||
{
|
||||
if (Guild* guild = sGuildMgr->GetGuildById(guildId))
|
||||
guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, 1, 0, 0, NULL, player);
|
||||
guild->UpdateCriteria(CRITERIA_TYPE_WIN_BG, 1, 0, 0, NULL, player);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -897,7 +897,7 @@ void Battleground::EndBattleground(uint32 winner)
|
||||
sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), player->GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType());
|
||||
player->SendDirectMessage(battlefieldStatus.Write());
|
||||
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_COMPLETE_BATTLEGROUND, 1);
|
||||
}
|
||||
|
||||
if (winmsg_id)
|
||||
@@ -1138,17 +1138,17 @@ void Battleground::AddPlayer(Player* player)
|
||||
}
|
||||
}
|
||||
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_BG, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_KILL_CREATURE, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_WIN_BG, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_DAMAGE_DONE, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_BE_SPELL_TARGET, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_CAST_SPELL, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_HONORABLE_KILL, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_HEALING_DONE, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_GET_KILLING_BLOWS, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
player->ResetCriteria(CRITERIA_TYPE_SPECIAL_PVP_KILL, CRITERIA_CONDITION_BG_MAP, GetMapId(), true);
|
||||
|
||||
// setup BG group membership
|
||||
PlayerAddedToBGCheckIfBGIsRunning(player);
|
||||
@@ -1902,11 +1902,11 @@ WorldSafeLocsEntry const* Battleground::GetClosestGraveYard(Player* player)
|
||||
return sObjectMgr->GetClosestGraveYard(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), player->GetMapId(), player->GetTeam());
|
||||
}
|
||||
|
||||
void Battleground::StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
|
||||
void Battleground::StartCriteriaTimer(CriteriaTimedTypes type, uint32 entry)
|
||||
{
|
||||
for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
|
||||
if (Player* player = ObjectAccessor::FindPlayer(itr->first))
|
||||
player->StartTimedAchievement(type, entry);
|
||||
player->StartCriteriaTimer(type, entry);
|
||||
}
|
||||
|
||||
void Battleground::SetBracket(PvPDifficultyEntry const* bracketEntry)
|
||||
|
||||
@@ -253,7 +253,7 @@ class TC_GAME_API Battleground
|
||||
|
||||
/* achievement req. */
|
||||
virtual bool IsAllNodesControlledByTeam(uint32 /*team*/) const { return false; }
|
||||
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry);
|
||||
void StartCriteriaTimer(CriteriaTimedTypes type, uint32 entry);
|
||||
virtual bool CheckAchievementCriteriaMeet(uint32 /*criteriaId*/, Player const* /*player*/, Unit const* /*target*/ = NULL, uint32 /*miscvalue1*/ = 0);
|
||||
|
||||
/* Battleground */
|
||||
|
||||
@@ -216,7 +216,7 @@ void BattlegroundAB::StartingEventOpenDoors()
|
||||
DoorOpen(BG_AB_OBJECT_GATE_H);
|
||||
|
||||
// Achievement: Let's Get This Done
|
||||
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, AB_EVENT_START_BATTLE);
|
||||
StartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, AB_EVENT_START_BATTLE);
|
||||
}
|
||||
|
||||
void BattlegroundAB::AddPlayer(Player* player)
|
||||
@@ -698,10 +698,10 @@ bool BattlegroundAB::UpdatePlayerScore(Player* player, uint32 type, uint32 value
|
||||
switch (type)
|
||||
{
|
||||
case SCORE_BASES_ASSAULTED:
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_ASSAULT_BASE);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_ASSAULT_BASE);
|
||||
break;
|
||||
case SCORE_BASES_DEFENDED:
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_DEFEND_BASE);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AB_OBJECTIVE_DEFEND_BASE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -429,7 +429,7 @@ void BattlegroundAV::StartingEventOpenDoors()
|
||||
DoorOpen(BG_AV_OBJECT_DOOR_A);
|
||||
|
||||
// Achievement: The Alterac Blitz
|
||||
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, BG_AV_EVENT_START_BATTLE);
|
||||
StartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, BG_AV_EVENT_START_BATTLE);
|
||||
}
|
||||
|
||||
void BattlegroundAV::AddPlayer(Player* player)
|
||||
@@ -533,16 +533,16 @@ bool BattlegroundAV::UpdatePlayerScore(Player* player, uint32 type, uint32 value
|
||||
switch (type)
|
||||
{
|
||||
case SCORE_GRAVEYARDS_ASSAULTED:
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_GRAVEYARD);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_GRAVEYARD);
|
||||
break;
|
||||
case SCORE_GRAVEYARDS_DEFENDED:
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_GRAVEYARD);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_GRAVEYARD);
|
||||
break;
|
||||
case SCORE_TOWERS_ASSAULTED:
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_TOWER);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_ASSAULT_TOWER);
|
||||
break;
|
||||
case SCORE_TOWERS_DEFENDED:
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_TOWER);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, AV_OBJECTIVE_DEFEND_TOWER);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -153,7 +153,7 @@ void BattlegroundEY::StartingEventOpenDoors()
|
||||
}
|
||||
|
||||
// Achievement: Flurry
|
||||
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, BG_EY_EVENT_START_BATTLE);
|
||||
StartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, BG_EY_EVENT_START_BATTLE);
|
||||
}
|
||||
|
||||
void BattlegroundEY::AddPoints(uint32 Team, uint32 Points)
|
||||
@@ -849,7 +849,7 @@ bool BattlegroundEY::UpdatePlayerScore(Player* player, uint32 type, uint32 value
|
||||
switch (type)
|
||||
{
|
||||
case SCORE_FLAG_CAPTURES:
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, EY_OBJECTIVE_CAPTURE_FLAG);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, EY_OBJECTIVE_CAPTURE_FLAG);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -343,7 +343,7 @@ void BattlegroundSA::PostUpdateImpl(uint32 diff)
|
||||
ToggleTimer();
|
||||
DemolisherStartState(false);
|
||||
Status = BG_SA_ROUND_ONE;
|
||||
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702);
|
||||
StartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702);
|
||||
}
|
||||
if (TotalTime >= BG_SA_BOAT_START)
|
||||
StartShips();
|
||||
@@ -365,7 +365,7 @@ void BattlegroundSA::PostUpdateImpl(uint32 diff)
|
||||
ToggleTimer();
|
||||
DemolisherStartState(false);
|
||||
Status = BG_SA_ROUND_TWO;
|
||||
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702);
|
||||
StartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, (Attackers == TEAM_ALLIANCE) ? 23748 : 21702);
|
||||
// status was set to STATUS_WAIT_JOIN manually for Preparation, set it back now
|
||||
SetStatus(STATUS_IN_PROGRESS);
|
||||
for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr)
|
||||
@@ -907,7 +907,7 @@ void BattlegroundSA::TitanRelicActivated(Player* clicker)
|
||||
{
|
||||
if (Player* player = ObjectAccessor::FindPlayer(itr->first))
|
||||
if (player->GetTeamId() == Attackers)
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65246);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BE_SPELL_TARGET, 65246);
|
||||
}
|
||||
|
||||
Attackers = (Attackers == TEAM_ALLIANCE) ? TEAM_HORDE : TEAM_ALLIANCE;
|
||||
@@ -937,7 +937,7 @@ void BattlegroundSA::TitanRelicActivated(Player* clicker)
|
||||
{
|
||||
if (Player* player = ObjectAccessor::FindPlayer(itr->first))
|
||||
if (player->GetTeamId() == Attackers && RoundScores[1].winner == Attackers)
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, 65246);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BE_SPELL_TARGET, 65246);
|
||||
}
|
||||
|
||||
if (RoundScores[0].time == RoundScores[1].time)
|
||||
|
||||
@@ -245,7 +245,7 @@ void BattlegroundWS::StartingEventOpenDoors()
|
||||
SpawnBGObject(BG_WS_OBJECT_DOOR_H_4, RESPAWN_ONE_DAY);
|
||||
|
||||
// players joining later are not eligibles
|
||||
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, WS_EVENT_START_BATTLE);
|
||||
StartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, WS_EVENT_START_BATTLE);
|
||||
}
|
||||
|
||||
void BattlegroundWS::AddPlayer(Player* player)
|
||||
@@ -504,7 +504,7 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* player, GameObject* target
|
||||
UpdateFlagState(HORDE, BG_WS_FLAG_STATE_ON_PLAYER);
|
||||
UpdateWorldState(BG_WS_FLAG_UNK_ALLIANCE, 1);
|
||||
player->CastSpell(player, BG_WS_SPELL_SILVERWING_FLAG, true);
|
||||
player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_SILVERWING_FLAG_PICKED);
|
||||
player->StartCriteriaTimer(CRITERIA_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_SILVERWING_FLAG_PICKED);
|
||||
if (_flagState[1] == BG_WS_FLAG_STATE_ON_PLAYER)
|
||||
_bothFlagsKept = true;
|
||||
}
|
||||
@@ -523,7 +523,7 @@ void BattlegroundWS::EventPlayerClickedOnFlag(Player* player, GameObject* target
|
||||
UpdateFlagState(ALLIANCE, BG_WS_FLAG_STATE_ON_PLAYER);
|
||||
UpdateWorldState(BG_WS_FLAG_UNK_HORDE, 1);
|
||||
player->CastSpell(player, BG_WS_SPELL_WARSONG_FLAG, true);
|
||||
player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_WARSONG_FLAG_PICKED);
|
||||
player->StartCriteriaTimer(CRITERIA_TIMED_TYPE_SPELL_TARGET, BG_WS_SPELL_WARSONG_FLAG_PICKED);
|
||||
if (_flagState[0] == BG_WS_FLAG_STATE_ON_PLAYER)
|
||||
_bothFlagsKept = true;
|
||||
}
|
||||
@@ -817,10 +817,10 @@ bool BattlegroundWS::UpdatePlayerScore(Player* player, uint32 type, uint32 value
|
||||
switch (type)
|
||||
{
|
||||
case SCORE_FLAG_CAPTURES: // flags captured
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_CAPTURE_FLAG);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_CAPTURE_FLAG);
|
||||
break;
|
||||
case SCORE_FLAG_RETURNS: // flags returned
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_RETURN_FLAG);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, WS_OBJECTIVE_RETURN_FLAG);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -379,7 +379,7 @@ bool AchievementChatLink::Initialize(std::istringstream& iss)
|
||||
return false;
|
||||
}
|
||||
// Validate achievement
|
||||
_achievement = sAchievementMgr->GetAchievement(achievementId);
|
||||
_achievement = sAchievementStore.LookupEntry(achievementId);
|
||||
if (!_achievement)
|
||||
{
|
||||
TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): got invalid achivement id %u in |achievement command", iss.str().c_str(), achievementId);
|
||||
|
||||
@@ -425,8 +425,8 @@ bool Condition::Meets(ConditionSourceInfo& sourceInfo) const
|
||||
}
|
||||
case CONDITION_REALM_ACHIEVEMENT:
|
||||
{
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(ConditionValue1);
|
||||
if (achievement && sAchievementMgr->IsRealmCompleted(achievement, std::numeric_limits<uint32>::max()))
|
||||
AchievementEntry const* achievement = sAchievementStore.LookupEntry(ConditionValue1);
|
||||
if (achievement && sAchievementMgr->IsRealmCompleted(achievement))
|
||||
condMeets = true;
|
||||
break;
|
||||
}
|
||||
@@ -1908,7 +1908,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const
|
||||
}
|
||||
case CONDITION_ACHIEVEMENT:
|
||||
{
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(cond->ConditionValue1);
|
||||
AchievementEntry const* achievement = sAchievementStore.LookupEntry(cond->ConditionValue1);
|
||||
if (!achievement)
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "%s has non existing achivement id (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
|
||||
@@ -2211,7 +2211,7 @@ bool ConditionMgr::isConditionTypeValid(Condition* cond) const
|
||||
break;
|
||||
case CONDITION_REALM_ACHIEVEMENT:
|
||||
{
|
||||
AchievementEntry const* achievement = sAchievementMgr->GetAchievement(cond->ConditionValue1);
|
||||
AchievementEntry const* achievement = sAchievementStore.LookupEntry(cond->ConditionValue1);
|
||||
if (!achievement)
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "%s has non existing realm first achivement id (%u), skipped.", cond->ToString(true).c_str(), cond->ConditionValue1);
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
#include "DisableMgr.h"
|
||||
#include "AchievementMgr.h"
|
||||
#include "CriteriaHandler.h"
|
||||
#include "ObjectMgr.h"
|
||||
#include "OutdoorPvP.h"
|
||||
#include "SpellMgr.h"
|
||||
@@ -183,14 +183,14 @@ void LoadDisables()
|
||||
if (flags)
|
||||
TC_LOG_ERROR("sql.sql", "Disable flags specified for outdoor PvP %u, useless data.", entry);
|
||||
break;
|
||||
case DISABLE_TYPE_ACHIEVEMENT_CRITERIA:
|
||||
if (!sAchievementMgr->GetAchievementCriteria(entry))
|
||||
case DISABLE_TYPE_CRITERIA:
|
||||
if (!sCriteriaMgr->GetCriteria(entry))
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Achievement Criteria entry %u from `disables` doesn't exist in dbc, skipped.", entry);
|
||||
TC_LOG_ERROR("sql.sql", "Criteria entry %u from `disables` doesn't exist in dbc, skipped.", entry);
|
||||
continue;
|
||||
}
|
||||
if (flags)
|
||||
TC_LOG_ERROR("sql.sql", "Disable flags specified for Achievement Criteria %u, useless data.", entry);
|
||||
TC_LOG_ERROR("sql.sql", "Disable flags specified for Criteria %u, useless data.", entry);
|
||||
break;
|
||||
case DISABLE_TYPE_VMAP:
|
||||
{
|
||||
@@ -362,7 +362,7 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags
|
||||
return true;
|
||||
case DISABLE_TYPE_BATTLEGROUND:
|
||||
case DISABLE_TYPE_OUTDOORPVP:
|
||||
case DISABLE_TYPE_ACHIEVEMENT_CRITERIA:
|
||||
case DISABLE_TYPE_CRITERIA:
|
||||
case DISABLE_TYPE_MMAP:
|
||||
return true;
|
||||
case DISABLE_TYPE_VMAP:
|
||||
|
||||
@@ -30,7 +30,7 @@ enum DisableType
|
||||
DISABLE_TYPE_QUEST = 1,
|
||||
DISABLE_TYPE_MAP = 2,
|
||||
DISABLE_TYPE_BATTLEGROUND = 3,
|
||||
DISABLE_TYPE_ACHIEVEMENT_CRITERIA = 4,
|
||||
DISABLE_TYPE_CRITERIA = 4,
|
||||
DISABLE_TYPE_OUTDOORPVP = 5,
|
||||
DISABLE_TYPE_VMAP = 6,
|
||||
DISABLE_TYPE_MMAP = 7
|
||||
|
||||
@@ -188,120 +188,120 @@ struct CriteriaEntry
|
||||
union
|
||||
{
|
||||
uint32 ID;
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20
|
||||
// CRITERIA_TYPE_KILL_CREATURE = 0
|
||||
// CRITERIA_TYPE_KILLED_BY_CREATURE = 20
|
||||
uint32 CreatureID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP = 16
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33
|
||||
// CRITERIA_TYPE_WIN_BG = 1
|
||||
// CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15
|
||||
// CRITERIA_TYPE_DEATH_AT_MAP = 16
|
||||
// CRITERIA_TYPE_WIN_ARENA = 32
|
||||
// CRITERIA_TYPE_PLAY_ARENA = 33
|
||||
uint32 MapID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112
|
||||
// CRITERIA_TYPE_REACH_SKILL_LEVEL = 7
|
||||
// CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
|
||||
// CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75
|
||||
// CRITERIA_TYPE_LEARN_SKILL_LINE = 112
|
||||
uint32 SkillID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
|
||||
// CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
|
||||
uint32 AchievementID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11
|
||||
// CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11
|
||||
uint32 ZoneID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12
|
||||
// CRITERIA_TYPE_CURRENCY = 12
|
||||
uint32 CurrencyID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19
|
||||
// CRITERIA_TYPE_DEATH_IN_DUNGEON = 18
|
||||
// CRITERIA_TYPE_COMPLETE_RAID = 19
|
||||
uint32 GroupSize;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26
|
||||
// CRITERIA_TYPE_DEATHS_FROM = 26
|
||||
uint32 DamageType;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27
|
||||
// CRITERIA_TYPE_COMPLETE_QUEST = 27
|
||||
uint32 QuestID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2 = 69
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL = 29
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34
|
||||
// CRITERIA_TYPE_BE_SPELL_TARGET = 28
|
||||
// CRITERIA_TYPE_BE_SPELL_TARGET2 = 69
|
||||
// CRITERIA_TYPE_CAST_SPELL = 29
|
||||
// CRITERIA_TYPE_CAST_SPELL2 = 110
|
||||
// CRITERIA_TYPE_LEARN_SPELL = 34
|
||||
uint32 SpellID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
|
||||
// CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
|
||||
uint32 ObjectiveId;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_ENTER_AREA = 163
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LEAVE_AREA = 164
|
||||
// CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31
|
||||
// CRITERIA_TYPE_ENTER_AREA = 163
|
||||
// CRITERIA_TYPE_LEAVE_AREA = 164
|
||||
uint32 AreaID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_OWN_TOY = 185
|
||||
// CRITERIA_TYPE_OWN_ITEM = 36
|
||||
// CRITERIA_TYPE_USE_ITEM = 41
|
||||
// CRITERIA_TYPE_LOOT_ITEM = 42
|
||||
// CRITERIA_TYPE_EQUIP_ITEM = 57
|
||||
// CRITERIA_TYPE_OWN_TOY = 185
|
||||
uint32 ItemID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39
|
||||
// CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38
|
||||
// CRITERIA_TYPE_REACH_TEAM_RATING = 39
|
||||
// CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39
|
||||
uint32 TeamType;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43
|
||||
// CRITERIA_TYPE_EXPLORE_AREA = 43
|
||||
uint32 WorldMapOverlayID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46
|
||||
// CRITERIA_TYPE_GAIN_REPUTATION = 46
|
||||
uint32 FactionID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49
|
||||
// CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49
|
||||
uint32 ItemSlot;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51
|
||||
// CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50
|
||||
// CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51
|
||||
uint32 RollValue;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52
|
||||
// CRITERIA_TYPE_HK_CLASS = 52
|
||||
uint32 ClassID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53
|
||||
// CRITERIA_TYPE_HK_RACE = 53
|
||||
uint32 RaceID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54
|
||||
// CRITERIA_TYPE_DO_EMOTE = 54
|
||||
uint32 EmoteID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72
|
||||
// CRITERIA_TYPE_USE_GAMEOBJECT = 68
|
||||
// CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72
|
||||
uint32 GameObjectID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96
|
||||
// CRITERIA_TYPE_HIGHEST_POWER = 96
|
||||
uint32 PowerType;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97
|
||||
// CRITERIA_TYPE_HIGHEST_STAT = 97
|
||||
uint32 StatType;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98
|
||||
// CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98
|
||||
uint32 SpellSchool;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109
|
||||
// CRITERIA_TYPE_LOOT_TYPE = 109
|
||||
uint32 LootType;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DUNGEON_ENCOUNTER = 165
|
||||
// CRITERIA_TYPE_COMPLETE_DUNGEON_ENCOUNTER = 165
|
||||
uint32 DungeonEncounterID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_CONSTRUCT_GARRISON_BUILDING = 169
|
||||
// CRITERIA_TYPE_CONSTRUCT_GARRISON_BUILDING = 169
|
||||
uint32 GarrBuildingID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_UPGRADE_GARRISON = 170
|
||||
// CRITERIA_TYPE_UPGRADE_GARRISON = 170
|
||||
uint32 GarrisonLevel;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GARRISON_MISSION = 174
|
||||
// CRITERIA_TYPE_COMPLETE_GARRISON_MISSION = 174
|
||||
uint32 GarrMissionID;
|
||||
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GARRISON_SHIPMENT = 182
|
||||
// CRITERIA_TYPE_COMPLETE_GARRISON_SHIPMENT = 182
|
||||
uint32 CharShipmentContainerID;
|
||||
} Asset; // 2
|
||||
uint32 StartEvent; // 3
|
||||
|
||||
@@ -91,278 +91,16 @@ enum AchievementFlags
|
||||
ACHIEVEMENT_FLAG_REALM_FIRST_REACH = 0x00000100, //
|
||||
ACHIEVEMENT_FLAG_REALM_FIRST_KILL = 0x00000200, //
|
||||
ACHIEVEMENT_FLAG_UNK3 = 0x00000400, // ACHIEVEMENT_FLAG_HIDE_NAME_IN_TIE
|
||||
ACHIEVEMENT_FLAG_UNK4 = 0x00000800, // first guild on realm done something
|
||||
ACHIEVEMENT_FLAG_HIDE_INCOMPLETE = 0x00000800, // hide from UI if not completed
|
||||
ACHIEVEMENT_FLAG_SHOW_IN_GUILD_NEWS = 0x00001000, // Shows in guild news
|
||||
ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER = 0x00002000, // Shows in guild news header
|
||||
ACHIEVEMENT_FLAG_GUILD = 0x00004000, //
|
||||
ACHIEVEMENT_FLAG_SHOW_GUILD_MEMBERS = 0x00008000, //
|
||||
ACHIEVEMENT_FLAG_SHOW_CRITERIA_MEMBERS = 0x00010000, //
|
||||
ACHIEVEMENT_FLAG_ACCOUNT = 0x00020000
|
||||
};
|
||||
|
||||
enum AchievementCriteriaCondition
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NONE = 0,
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH = 1, // reset progress on death
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_UNK2 = 2, // only used in "Complete a daily quest every day for five consecutive days"
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_BG_MAP = 3, // requires you to be on specific map, reset at change
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE = 4, // only used in "Win 10 arenas without losing"
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_UNK5 = 5, // Have spell?
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_UNK8 = 8,
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NO_SPELL_HIT = 9, // requires the player not to be hit by specific spell
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_NOT_IN_GROUP = 10, // requires the player not to be in group
|
||||
ACHIEVEMENT_CRITERIA_CONDITION_UNK13 = 13 // unk
|
||||
};
|
||||
|
||||
enum AchievementCriteriaAdditionalCondition
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_DRUNK_VALUE = 1, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK2 = 2,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_LEVEL = 3, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_ENTRY = 4,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_PLAYER = 5,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_DEAD = 6,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_ENEMY = 7,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA = 8,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA = 10,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA_TYPE = 11,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_MIN = 14,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_EQUALS = 15,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK16 = 16,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_AREA_OR_ZONE = 17,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_AREA_OR_ZONE = 18,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MAP_DIFFICULTY = 20,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_YIELDS_XP = 21, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ARENA_TYPE = 24,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_RACE = 25,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_CLASS = 26,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_RACE = 27,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CLASS = 28,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MAX_GROUP_MEMBERS = 29,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_TYPE = 30,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_MAP = 32,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_CLASS = 33, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_ITEM_SUBCLASS = 34, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_COMPLETE_QUEST_NOT_IN_GROUP = 35, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MIN_PERSONAL_RATING = 37, // NYI (when implementing don't forget about ACHIEVEMENT_CRITERIA_CONDITION_NO_LOSE)
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TITLE_BIT_INDEX = 38,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL = 39,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL = 40,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_ZONE = 41,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_PERCENT_BELOW = 46,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK55 = 55,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_MIN_ACHIEVEMENT_POINTS = 56, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_REQUIRES_LFG_GROUP = 58, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_UNK60 = 60,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_REQUIRES_GUILD_GROUP = 61, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GUILD_REPUTATION = 62, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_RATED_BATTLEGROUND = 63, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_PROJECT_RARITY = 65,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_PROJECT_RACE = 66,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_SPECIES = 91,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_QUALITY = 145,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_LEVEL = 146,
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GARRISON_RARE_MISSION = 147, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GARRISON_BUILDING_LEVEL = 149, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GARRISON_MISSION_TYPE = 167, // NYI
|
||||
ACHIEVEMENT_CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_ILVL = 184,
|
||||
};
|
||||
|
||||
enum AchievementCriteriaFlags
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_FLAG_SHOW_PROGRESS_BAR = 0x00000001, // Show progress as bar
|
||||
ACHIEVEMENT_CRITERIA_FLAG_HIDDEN = 0x00000002, // Not show criteria in client
|
||||
ACHIEVEMENT_CRITERIA_FLAG_FAIL_ACHIEVEMENT = 0x00000004, // BG related??
|
||||
ACHIEVEMENT_CRITERIA_FLAG_RESET_ON_START = 0x00000008, //
|
||||
ACHIEVEMENT_CRITERIA_FLAG_IS_DATE = 0x00000010, // not used
|
||||
ACHIEVEMENT_CRITERIA_FLAG_MONEY_COUNTER = 0x00000020 // Displays counter as money
|
||||
};
|
||||
|
||||
enum AchievementCriteriaTimedTypes
|
||||
{
|
||||
ACHIEVEMENT_TIMED_TYPE_EVENT = 1, // Timer is started by internal event with id in timerStartEvent
|
||||
ACHIEVEMENT_TIMED_TYPE_QUEST = 2, // Timer is started by accepting quest with entry in timerStartEvent
|
||||
ACHIEVEMENT_TIMED_TYPE_SPELL_CASTER = 5, // Timer is started by casting a spell with entry in timerStartEvent
|
||||
ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET = 6, // Timer is started by being target of spell with entry in timerStartEvent
|
||||
ACHIEVEMENT_TIMED_TYPE_CREATURE = 7, // Timer is started by killing creature with entry in timerStartEvent
|
||||
ACHIEVEMENT_TIMED_TYPE_ITEM = 9, // Timer is started by using item with entry in timerStartEvent
|
||||
ACHIEVEMENT_TIMED_TYPE_UNK = 10, // Unknown
|
||||
ACHIEVEMENT_TIMED_TYPE_UNK_2 = 13, // Unknown
|
||||
ACHIEVEMENT_TIMED_TYPE_SCENARIO_STAGE = 14, // Timer is started by changing stages in a scenario
|
||||
|
||||
ACHIEVEMENT_TIMED_TYPE_MAX
|
||||
};
|
||||
|
||||
enum AchievementCriteriaTypes
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ARCHAEOLOGY_PROJECTS = 3, // struct { uint32 itemCount; }
|
||||
ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10, // you have to complete a daily quest x times in a row
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP = 16,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DEATH = 17,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER = 23,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL = 29,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE = 30,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL = 35,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK = 44,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT = 45,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION = 47,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP = 48,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50, /// @todo itemlevel is mentioned in text but not present in dbc
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56, /// @todo in some cases map not present, and in some cases need do without die
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS = 59,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS = 60,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS = 61,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD = 62,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING = 63,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER = 65,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL = 66,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2 = 69,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL = 70,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72,
|
||||
/// @todo 73: Achievements 1515, 1241, 1103 (Name: Mal'Ganis)
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN = 74,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL = 77,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE = 78,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS = 80,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION = 82,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID = 83,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WON_AUCTIONS = 84,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_SOLD = 85,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED = 86,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION = 87,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION = 88,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS = 89,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM = 90,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM = 91,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED = 93,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED = 94,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT = 101,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED = 102,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED = 103,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST = 104,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED = 105,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED = 106,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED = 107,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN = 108,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110, /// @todo target entry is missing
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS = 114,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS = 115,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS = 119,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS = 124,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL = 125,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CRAFT_ITEMS_GUILD = 126,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CATCH_FROM_POOL = 127,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS = 128,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS = 129,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_BATTLEGROUND = 130,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_REACH_BG_RATING = 132,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BUY_GUILD_TABARD = 133,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_GUILD = 134,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILLS_GUILD = 135,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD = 136,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE = 138, //struct { Flag flag; uint32 count; } 1: Guild Dungeon, 2:Guild Challenge, 3:Guild battlefield
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE = 139, //struct { uint32 count; } Guild Challenge
|
||||
// 140 unk
|
||||
// 141 unk
|
||||
// 142 unk
|
||||
// 143 unk
|
||||
// 144 unk
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LFR_DUNGEONS_COMPLETED = 145,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LFR_LEAVES = 146,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LFR_VOTE_KICKS_INITIATED_BY_PLAYER = 147,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LFR_VOTE_KICKS_NOT_INIT_BY_PLAYER = 148,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_BE_KICKED_FROM_LFR = 149,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COUNT_OF_LFR_QUEUE_BOOSTS_BY_TANK = 150,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_SCENARIO_COUNT = 151,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_SCENARIO = 152,
|
||||
// ACHIEVEMENT_CRITERIA_TYPE_REACH_SOMETHING_LIKE_AREATRIGGER = 153,
|
||||
// 154
|
||||
ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET = 155,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET_COUNT = 156,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CAPTURE_BATTLE_PET = 157,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_WIN_PET_BATTLE = 158,
|
||||
// 159
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEVEL_BATTLE_PET = 160,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CAPTURE_BATTLE_PET_CREDIT = 161, // triggers a quest credit
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEVEL_BATTLE_PET_CREDIT = 162, // triggers a quest credit
|
||||
ACHIEVEMENT_CRITERIA_TYPE_ENTER_AREA = 163, // triggers a quest credit
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEAVE_AREA = 164, // triggers a quest credit
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DUNGEON_ENCOUNTER = 165,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_PLACE_GARRISON_BUILDING = 167,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_UPGRADE_GARRISON_BUILDING = 168,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_CONSTRUCT_GARRISON_BUILDING = 169,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_UPGRADE_GARRISON = 170,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_START_GARRISON_MISSION = 171,
|
||||
// 172
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GARRISON_MISSION_COUNT = 173,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GARRISON_MISSION = 174,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_RECRUIT_GARRISON_FOLLOWER_COUNT = 175,
|
||||
// 176
|
||||
// 177
|
||||
ACHIEVEMENT_CRITERIA_TYPE_LEARN_GARRISON_BLUEPRINT_COUNT = 178,
|
||||
// 179
|
||||
// 180
|
||||
// 181
|
||||
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GARRISON_SHIPMENT = 182,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_RAISE_GARRISON_FOLLOWER_ITEM_LEVEL = 183,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_RAISE_GARRISON_FOLLOWER_LEVEL = 184,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_OWN_TOY = 185,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_OWN_TOY_COUNT = 186,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_RECRUIT_GARRISON_FOLLOWER = 187,
|
||||
ACHIEVEMENT_CRITERIA_TYPE_OWN_HEIRLOOMS = 189
|
||||
};
|
||||
|
||||
#define ACHIEVEMENT_CRITERIA_TYPE_TOTAL 190
|
||||
|
||||
enum AchievementCriteriaTreeOperator
|
||||
{
|
||||
ACHIEVEMENT_CRITERIA_TREE_OPERATOR_ALL = 4,
|
||||
ACHIEVEMENT_CRITERIA_TREE_OPERATOR_ANY = 8
|
||||
ACHIEVEMENT_FLAG_ACCOUNT = 0x00020000,
|
||||
ACHIEVEMENT_FLAG_UNK5 = 0x00040000,
|
||||
ACHIEVEMENT_FLAG_HIDE_ZERO_COUNTER = 0x00080000, // statistic is hidden from UI if no criteria value exists
|
||||
ACHIEVEMENT_FLAG_TRACKING_FLAG = 0x00100000, // hidden tracking flag, sent to client in all cases except completion announcements
|
||||
};
|
||||
|
||||
enum AreaFlags
|
||||
@@ -399,6 +137,271 @@ enum AreaFlags
|
||||
AREA_FLAG_UNK9 = 0x40000000
|
||||
};
|
||||
|
||||
enum CriteriaCondition
|
||||
{
|
||||
CRITERIA_CONDITION_NONE = 0,
|
||||
CRITERIA_CONDITION_NO_DEATH = 1, // reset progress on death
|
||||
CRITERIA_CONDITION_UNK2 = 2, // only used in "Complete a daily quest every day for five consecutive days"
|
||||
CRITERIA_CONDITION_BG_MAP = 3, // requires you to be on specific map, reset at change
|
||||
CRITERIA_CONDITION_NO_LOSE = 4, // only used in "Win 10 arenas without losing"
|
||||
CRITERIA_CONDITION_UNK5 = 5, // Have spell?
|
||||
CRITERIA_CONDITION_UNK8 = 8,
|
||||
CRITERIA_CONDITION_NO_SPELL_HIT = 9, // requires the player not to be hit by specific spell
|
||||
CRITERIA_CONDITION_NOT_IN_GROUP = 10, // requires the player not to be in group
|
||||
CRITERIA_CONDITION_UNK13 = 13 // unk
|
||||
};
|
||||
|
||||
enum CriteriaAdditionalCondition
|
||||
{
|
||||
CRITERIA_ADDITIONAL_CONDITION_SOURCE_DRUNK_VALUE = 1, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_UNK2 = 2,
|
||||
CRITERIA_ADDITIONAL_CONDITION_ITEM_LEVEL = 3, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_ENTRY = 4,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_PLAYER = 5,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_DEAD = 6,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_MUST_BE_ENEMY = 7,
|
||||
CRITERIA_ADDITIONAL_CONDITION_SOURCE_HAS_AURA = 8,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA = 10,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_HAS_AURA_TYPE = 11,
|
||||
CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_MIN = 14,
|
||||
CRITERIA_ADDITIONAL_CONDITION_ITEM_QUALITY_EQUALS = 15,
|
||||
CRITERIA_ADDITIONAL_CONDITION_UNK16 = 16,
|
||||
CRITERIA_ADDITIONAL_CONDITION_SOURCE_AREA_OR_ZONE = 17,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_AREA_OR_ZONE = 18,
|
||||
CRITERIA_ADDITIONAL_CONDITION_MAP_DIFFICULTY = 20,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_YIELDS_XP = 21, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_ARENA_TYPE = 24,
|
||||
CRITERIA_ADDITIONAL_CONDITION_SOURCE_RACE = 25,
|
||||
CRITERIA_ADDITIONAL_CONDITION_SOURCE_CLASS = 26,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_RACE = 27,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_CLASS = 28,
|
||||
CRITERIA_ADDITIONAL_CONDITION_MAX_GROUP_MEMBERS = 29,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_CREATURE_TYPE = 30,
|
||||
CRITERIA_ADDITIONAL_CONDITION_SOURCE_MAP = 32,
|
||||
CRITERIA_ADDITIONAL_CONDITION_ITEM_CLASS = 33, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_ITEM_SUBCLASS = 34, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_COMPLETE_QUEST_NOT_IN_GROUP = 35, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_MIN_PERSONAL_RATING = 37, // NYI (when implementing don't forget about CRITERIA_CONDITION_NO_LOSE)
|
||||
CRITERIA_ADDITIONAL_CONDITION_TITLE_BIT_INDEX = 38,
|
||||
CRITERIA_ADDITIONAL_CONDITION_SOURCE_LEVEL = 39,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_LEVEL = 40,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_ZONE = 41,
|
||||
CRITERIA_ADDITIONAL_CONDITION_TARGET_HEALTH_PERCENT_BELOW = 46,
|
||||
CRITERIA_ADDITIONAL_CONDITION_UNK55 = 55,
|
||||
CRITERIA_ADDITIONAL_CONDITION_MIN_ACHIEVEMENT_POINTS = 56, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_REQUIRES_LFG_GROUP = 58, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_UNK60 = 60,
|
||||
CRITERIA_ADDITIONAL_CONDITION_REQUIRES_GUILD_GROUP = 61, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_GUILD_REPUTATION = 62, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_RATED_BATTLEGROUND = 63, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_PROJECT_RARITY = 65,
|
||||
CRITERIA_ADDITIONAL_CONDITION_PROJECT_RACE = 66,
|
||||
CRITERIA_ADDITIONAL_CONDITION_BATTLE_PET_SPECIES = 91,
|
||||
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_QUALITY = 145,
|
||||
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_LEVEL = 146,
|
||||
CRITERIA_ADDITIONAL_CONDITION_GARRISON_RARE_MISSION = 147, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_GARRISON_BUILDING_LEVEL = 149, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_GARRISON_MISSION_TYPE = 167, // NYI
|
||||
CRITERIA_ADDITIONAL_CONDITION_GARRISON_FOLLOWER_ILVL = 184,
|
||||
};
|
||||
|
||||
enum CriteriaFlags
|
||||
{
|
||||
CRITERIA_FLAG_SHOW_PROGRESS_BAR = 0x00000001, // Show progress as bar
|
||||
CRITERIA_FLAG_HIDDEN = 0x00000002, // Not show criteria in client
|
||||
CRITERIA_FLAG_FAIL_ACHIEVEMENT = 0x00000004, // BG related??
|
||||
CRITERIA_FLAG_RESET_ON_START = 0x00000008, //
|
||||
CRITERIA_FLAG_IS_DATE = 0x00000010, // not used
|
||||
CRITERIA_FLAG_MONEY_COUNTER = 0x00000020 // Displays counter as money
|
||||
};
|
||||
|
||||
enum CriteriaTimedTypes
|
||||
{
|
||||
CRITERIA_TIMED_TYPE_EVENT = 1, // Timer is started by internal event with id in timerStartEvent
|
||||
CRITERIA_TIMED_TYPE_QUEST = 2, // Timer is started by accepting quest with entry in timerStartEvent
|
||||
CRITERIA_TIMED_TYPE_SPELL_CASTER = 5, // Timer is started by casting a spell with entry in timerStartEvent
|
||||
CRITERIA_TIMED_TYPE_SPELL_TARGET = 6, // Timer is started by being target of spell with entry in timerStartEvent
|
||||
CRITERIA_TIMED_TYPE_CREATURE = 7, // Timer is started by killing creature with entry in timerStartEvent
|
||||
CRITERIA_TIMED_TYPE_ITEM = 9, // Timer is started by using item with entry in timerStartEvent
|
||||
CRITERIA_TIMED_TYPE_UNK = 10, // Unknown
|
||||
CRITERIA_TIMED_TYPE_UNK_2 = 13, // Unknown
|
||||
CRITERIA_TIMED_TYPE_SCENARIO_STAGE = 14, // Timer is started by changing stages in a scenario
|
||||
|
||||
CRITERIA_TIMED_TYPE_MAX
|
||||
};
|
||||
|
||||
enum CriteriaTypes
|
||||
{
|
||||
CRITERIA_TYPE_KILL_CREATURE = 0,
|
||||
CRITERIA_TYPE_WIN_BG = 1,
|
||||
CRITERIA_TYPE_COMPLETE_ARCHAEOLOGY_PROJECTS = 3, // struct { uint32 itemCount; }
|
||||
CRITERIA_TYPE_REACH_LEVEL = 5,
|
||||
CRITERIA_TYPE_REACH_SKILL_LEVEL = 7,
|
||||
CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8,
|
||||
CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9,
|
||||
CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10, // you have to complete a daily quest x times in a row
|
||||
CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11,
|
||||
CRITERIA_TYPE_CURRENCY = 12,
|
||||
CRITERIA_TYPE_DAMAGE_DONE = 13,
|
||||
CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14,
|
||||
CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15,
|
||||
CRITERIA_TYPE_DEATH_AT_MAP = 16,
|
||||
CRITERIA_TYPE_DEATH = 17,
|
||||
CRITERIA_TYPE_DEATH_IN_DUNGEON = 18,
|
||||
CRITERIA_TYPE_COMPLETE_RAID = 19,
|
||||
CRITERIA_TYPE_KILLED_BY_CREATURE = 20,
|
||||
CRITERIA_TYPE_KILLED_BY_PLAYER = 23,
|
||||
CRITERIA_TYPE_FALL_WITHOUT_DYING = 24,
|
||||
CRITERIA_TYPE_DEATHS_FROM = 26,
|
||||
CRITERIA_TYPE_COMPLETE_QUEST = 27,
|
||||
CRITERIA_TYPE_BE_SPELL_TARGET = 28,
|
||||
CRITERIA_TYPE_CAST_SPELL = 29,
|
||||
CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE = 30,
|
||||
CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31,
|
||||
CRITERIA_TYPE_WIN_ARENA = 32,
|
||||
CRITERIA_TYPE_PLAY_ARENA = 33,
|
||||
CRITERIA_TYPE_LEARN_SPELL = 34,
|
||||
CRITERIA_TYPE_HONORABLE_KILL = 35,
|
||||
CRITERIA_TYPE_OWN_ITEM = 36,
|
||||
CRITERIA_TYPE_WIN_RATED_ARENA = 37,
|
||||
CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38,
|
||||
CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39,
|
||||
CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40,
|
||||
CRITERIA_TYPE_USE_ITEM = 41,
|
||||
CRITERIA_TYPE_LOOT_ITEM = 42,
|
||||
CRITERIA_TYPE_EXPLORE_AREA = 43,
|
||||
CRITERIA_TYPE_OWN_RANK = 44,
|
||||
CRITERIA_TYPE_BUY_BANK_SLOT = 45,
|
||||
CRITERIA_TYPE_GAIN_REPUTATION = 46,
|
||||
CRITERIA_TYPE_GAIN_EXALTED_REPUTATION = 47,
|
||||
CRITERIA_TYPE_VISIT_BARBER_SHOP = 48,
|
||||
CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49,
|
||||
CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50, /// @todo itemlevel is mentioned in text but not present in dbc
|
||||
CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51,
|
||||
CRITERIA_TYPE_HK_CLASS = 52,
|
||||
CRITERIA_TYPE_HK_RACE = 53,
|
||||
CRITERIA_TYPE_DO_EMOTE = 54,
|
||||
CRITERIA_TYPE_HEALING_DONE = 55,
|
||||
CRITERIA_TYPE_GET_KILLING_BLOWS = 56, /// @todo in some cases map not present, and in some cases need do without die
|
||||
CRITERIA_TYPE_EQUIP_ITEM = 57,
|
||||
CRITERIA_TYPE_MONEY_FROM_VENDORS = 59,
|
||||
CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS = 60,
|
||||
CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS = 61,
|
||||
CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD = 62,
|
||||
CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING = 63,
|
||||
CRITERIA_TYPE_GOLD_SPENT_AT_BARBER = 65,
|
||||
CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL = 66,
|
||||
CRITERIA_TYPE_LOOT_MONEY = 67,
|
||||
CRITERIA_TYPE_USE_GAMEOBJECT = 68,
|
||||
CRITERIA_TYPE_BE_SPELL_TARGET2 = 69,
|
||||
CRITERIA_TYPE_SPECIAL_PVP_KILL = 70,
|
||||
CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72,
|
||||
/// @todo 73: Achievements 1515, 1241, 1103 (Name: Mal'Ganis)
|
||||
CRITERIA_TYPE_ON_LOGIN = 74,
|
||||
CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75,
|
||||
CRITERIA_TYPE_WIN_DUEL = 76,
|
||||
CRITERIA_TYPE_LOSE_DUEL = 77,
|
||||
CRITERIA_TYPE_KILL_CREATURE_TYPE = 78,
|
||||
CRITERIA_TYPE_GOLD_EARNED_BY_AUCTIONS = 80,
|
||||
CRITERIA_TYPE_CREATE_AUCTION = 82,
|
||||
CRITERIA_TYPE_HIGHEST_AUCTION_BID = 83,
|
||||
CRITERIA_TYPE_WON_AUCTIONS = 84,
|
||||
CRITERIA_TYPE_HIGHEST_AUCTION_SOLD = 85,
|
||||
CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED = 86,
|
||||
CRITERIA_TYPE_GAIN_REVERED_REPUTATION = 87,
|
||||
CRITERIA_TYPE_GAIN_HONORED_REPUTATION = 88,
|
||||
CRITERIA_TYPE_KNOWN_FACTIONS = 89,
|
||||
CRITERIA_TYPE_LOOT_EPIC_ITEM = 90,
|
||||
CRITERIA_TYPE_RECEIVE_EPIC_ITEM = 91,
|
||||
CRITERIA_TYPE_ROLL_NEED = 93,
|
||||
CRITERIA_TYPE_ROLL_GREED = 94,
|
||||
CRITERIA_TYPE_HIGHEST_HIT_DEALT = 101,
|
||||
CRITERIA_TYPE_HIGHEST_HIT_RECEIVED = 102,
|
||||
CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED = 103,
|
||||
CRITERIA_TYPE_HIGHEST_HEAL_CAST = 104,
|
||||
CRITERIA_TYPE_TOTAL_HEALING_RECEIVED = 105,
|
||||
CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED = 106,
|
||||
CRITERIA_TYPE_QUEST_ABANDONED = 107,
|
||||
CRITERIA_TYPE_FLIGHT_PATHS_TAKEN = 108,
|
||||
CRITERIA_TYPE_LOOT_TYPE = 109,
|
||||
CRITERIA_TYPE_CAST_SPELL2 = 110, /// @todo target entry is missing
|
||||
CRITERIA_TYPE_LEARN_SKILL_LINE = 112,
|
||||
CRITERIA_TYPE_EARN_HONORABLE_KILL = 113,
|
||||
CRITERIA_TYPE_ACCEPTED_SUMMONINGS = 114,
|
||||
CRITERIA_TYPE_EARN_ACHIEVEMENT_POINTS = 115,
|
||||
CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS = 119,
|
||||
CRITERIA_TYPE_SPENT_GOLD_GUILD_REPAIRS = 124,
|
||||
CRITERIA_TYPE_REACH_GUILD_LEVEL = 125,
|
||||
CRITERIA_TYPE_CRAFT_ITEMS_GUILD = 126,
|
||||
CRITERIA_TYPE_CATCH_FROM_POOL = 127,
|
||||
CRITERIA_TYPE_BUY_GUILD_BANK_SLOTS = 128,
|
||||
CRITERIA_TYPE_EARN_GUILD_ACHIEVEMENT_POINTS = 129,
|
||||
CRITERIA_TYPE_WIN_RATED_BATTLEGROUND = 130,
|
||||
CRITERIA_TYPE_REACH_BG_RATING = 132,
|
||||
CRITERIA_TYPE_BUY_GUILD_TABARD = 133,
|
||||
CRITERIA_TYPE_COMPLETE_QUESTS_GUILD = 134,
|
||||
CRITERIA_TYPE_HONORABLE_KILLS_GUILD = 135,
|
||||
CRITERIA_TYPE_KILL_CREATURE_TYPE_GUILD = 136,
|
||||
CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE_TYPE = 138, //struct { Flag flag; uint32 count; } 1: Guild Dungeon, 2:Guild Challenge, 3:Guild battlefield
|
||||
CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE = 139, //struct { uint32 count; } Guild Challenge
|
||||
// 140 unk
|
||||
// 141 unk
|
||||
// 142 unk
|
||||
// 143 unk
|
||||
// 144 unk
|
||||
CRITERIA_TYPE_LFR_DUNGEONS_COMPLETED = 145,
|
||||
CRITERIA_TYPE_LFR_LEAVES = 146,
|
||||
CRITERIA_TYPE_LFR_VOTE_KICKS_INITIATED_BY_PLAYER = 147,
|
||||
CRITERIA_TYPE_LFR_VOTE_KICKS_NOT_INIT_BY_PLAYER = 148,
|
||||
CRITERIA_TYPE_BE_KICKED_FROM_LFR = 149,
|
||||
CRITERIA_TYPE_COUNT_OF_LFR_QUEUE_BOOSTS_BY_TANK = 150,
|
||||
CRITERIA_TYPE_COMPLETE_SCENARIO_COUNT = 151,
|
||||
CRITERIA_TYPE_COMPLETE_SCENARIO = 152,
|
||||
// CRITERIA_TYPE_REACH_SOMETHING_LIKE_AREATRIGGER = 153,
|
||||
// 154
|
||||
CRITERIA_TYPE_OWN_BATTLE_PET = 155,
|
||||
CRITERIA_TYPE_OWN_BATTLE_PET_COUNT = 156,
|
||||
CRITERIA_TYPE_CAPTURE_BATTLE_PET = 157,
|
||||
CRITERIA_TYPE_WIN_PET_BATTLE = 158,
|
||||
// 159
|
||||
CRITERIA_TYPE_LEVEL_BATTLE_PET = 160,
|
||||
CRITERIA_TYPE_CAPTURE_BATTLE_PET_CREDIT = 161, // triggers a quest credit
|
||||
CRITERIA_TYPE_LEVEL_BATTLE_PET_CREDIT = 162, // triggers a quest credit
|
||||
CRITERIA_TYPE_ENTER_AREA = 163, // triggers a quest credit
|
||||
CRITERIA_TYPE_LEAVE_AREA = 164, // triggers a quest credit
|
||||
CRITERIA_TYPE_COMPLETE_DUNGEON_ENCOUNTER = 165,
|
||||
CRITERIA_TYPE_PLACE_GARRISON_BUILDING = 167,
|
||||
CRITERIA_TYPE_UPGRADE_GARRISON_BUILDING = 168,
|
||||
CRITERIA_TYPE_CONSTRUCT_GARRISON_BUILDING = 169,
|
||||
CRITERIA_TYPE_UPGRADE_GARRISON = 170,
|
||||
CRITERIA_TYPE_START_GARRISON_MISSION = 171,
|
||||
// 172
|
||||
CRITERIA_TYPE_COMPLETE_GARRISON_MISSION_COUNT = 173,
|
||||
CRITERIA_TYPE_COMPLETE_GARRISON_MISSION = 174,
|
||||
CRITERIA_TYPE_RECRUIT_GARRISON_FOLLOWER_COUNT = 175,
|
||||
// 176
|
||||
// 177
|
||||
CRITERIA_TYPE_LEARN_GARRISON_BLUEPRINT_COUNT = 178,
|
||||
// 179
|
||||
// 180
|
||||
// 181
|
||||
CRITERIA_TYPE_COMPLETE_GARRISON_SHIPMENT = 182,
|
||||
CRITERIA_TYPE_RAISE_GARRISON_FOLLOWER_ITEM_LEVEL = 183,
|
||||
CRITERIA_TYPE_RAISE_GARRISON_FOLLOWER_LEVEL = 184,
|
||||
CRITERIA_TYPE_OWN_TOY = 185,
|
||||
CRITERIA_TYPE_OWN_TOY_COUNT = 186,
|
||||
CRITERIA_TYPE_RECRUIT_GARRISON_FOLLOWER = 187,
|
||||
CRITERIA_TYPE_OWN_HEIRLOOMS = 189
|
||||
};
|
||||
|
||||
#define CRITERIA_TYPE_TOTAL 190
|
||||
|
||||
enum CriteriaTreeOperator
|
||||
{
|
||||
CRITERIA_TREE_OPERATOR_ALL = 4,
|
||||
CRITERIA_TREE_OPERATOR_ANY = 8
|
||||
};
|
||||
|
||||
enum Difficulty : uint8
|
||||
{
|
||||
DIFFICULTY_NONE = 0,
|
||||
|
||||
@@ -1410,7 +1410,7 @@ void LFGMgr::FinishDungeon(ObjectGuid gguid, const uint32 dungeonId)
|
||||
|
||||
// Update achievements
|
||||
if (dungeon->difficulty == DIFFICULTY_HEROIC)
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, 1);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS, 1);
|
||||
|
||||
LfgReward const* reward = GetRandomDungeonReward(rDungeonId, player->getLevel());
|
||||
if (!reward)
|
||||
|
||||
@@ -1736,7 +1736,7 @@ void GameObject::Use(Unit* user)
|
||||
Player* player = user->ToPlayer();
|
||||
|
||||
player->SendLoot(GetGUID(), LOOT_FISHINGHOLE);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT, GetGOInfo()->entry);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_FISH_IN_GAMEOBJECT, GetGOInfo()->entry);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -177,7 +177,7 @@ inline void KillRewarder::_RewardKillCredit(Player* player)
|
||||
if (Creature* target = _victim->ToCreature())
|
||||
{
|
||||
player->KilledMonster(target->GetCreatureTemplate(), target->GetGUID());
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE, target->GetCreatureType(), 1, 0, target);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_KILL_CREATURE_TYPE, target->GetCreatureType(), 1, 0, target);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,7 +240,7 @@ void KillRewarder::_RewardGroup()
|
||||
if (member->IsAtGroupRewardDistance(_victim))
|
||||
{
|
||||
_RewardPlayer(member, isDungeon);
|
||||
member->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, 0, _victim);
|
||||
member->UpdateCriteria(CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, 0, _victim);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -277,7 +277,7 @@ void KillRewarder::Reward()
|
||||
|
||||
if (ObjectGuid::LowType guildId = victim->GetMap()->GetOwnerGuildId())
|
||||
if (Guild* guild = sGuildMgr->GetGuildById(guildId))
|
||||
guild->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, victim->GetEntry(), 1, 0, victim, _killer);
|
||||
guild->UpdateCriteria(CRITERIA_TYPE_KILL_CREATURE, victim->GetEntry(), 1, 0, victim, _killer);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -332,7 +332,7 @@ Player::Player(WorldSession* session) : Unit(true)
|
||||
|
||||
memset(_voidStorageItems, 0, VOID_STORAGE_MAX_SLOT * sizeof(VoidStorageItem*));
|
||||
|
||||
m_achievementMgr = new AchievementMgr<Player>(this);
|
||||
m_achievementMgr = new PlayerAchievementMgr(this);
|
||||
m_reputationMgr = new ReputationMgr(this);
|
||||
|
||||
for (uint8 i = 0; i < MAX_CUF_PROFILES; ++i)
|
||||
@@ -770,7 +770,7 @@ uint32 Player::EnvironmentalDamage(EnviromentalDamage type, uint32 damage)
|
||||
SendDurabilityLoss(this, 10);
|
||||
}
|
||||
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM, 1, type);
|
||||
UpdateCriteria(CRITERIA_TYPE_DEATHS_FROM, 1, type);
|
||||
}
|
||||
|
||||
return final_damage;
|
||||
@@ -1088,7 +1088,7 @@ void Player::Update(uint32 p_time)
|
||||
}
|
||||
}
|
||||
|
||||
m_achievementMgr->UpdateTimedAchievements(p_time);
|
||||
m_achievementMgr->UpdateTimedCriteria(p_time);
|
||||
|
||||
if (HasUnitState(UNIT_STATE_MELEE_ATTACKING) && !HasUnitState(UNIT_STATE_CASTING))
|
||||
{
|
||||
@@ -1373,12 +1373,12 @@ void Player::setDeathState(DeathState s)
|
||||
// passive spell
|
||||
if (!ressSpellId)
|
||||
ressSpellId = GetResurrectionSpellId();
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP, 1);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH, 1);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON, 1);
|
||||
ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH);
|
||||
ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH);
|
||||
ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_CONDITION_NO_DEATH);
|
||||
UpdateCriteria(CRITERIA_TYPE_DEATH_AT_MAP, 1);
|
||||
UpdateCriteria(CRITERIA_TYPE_DEATH, 1);
|
||||
UpdateCriteria(CRITERIA_TYPE_DEATH_IN_DUNGEON, 1);
|
||||
ResetCriteria(CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE, CRITERIA_CONDITION_NO_DEATH);
|
||||
ResetCriteria(CRITERIA_TYPE_HONORABLE_KILL, CRITERIA_CONDITION_NO_DEATH);
|
||||
ResetCriteria(CRITERIA_TYPE_GET_KILLING_BLOWS, CRITERIA_CONDITION_NO_DEATH);
|
||||
}
|
||||
|
||||
Unit::setDeathState(s);
|
||||
@@ -2475,7 +2475,7 @@ void Player::GiveLevel(uint8 level)
|
||||
CharacterDatabase.CommitTransaction(trans);
|
||||
}
|
||||
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL);
|
||||
UpdateCriteria(CRITERIA_TYPE_REACH_LEVEL);
|
||||
|
||||
// Refer-A-Friend
|
||||
if (GetSession()->GetRecruiterId())
|
||||
@@ -3173,11 +3173,11 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent
|
||||
// not ranked skills
|
||||
for (SkillLineAbilityMap::const_iterator _spell_idx = skill_bounds.first; _spell_idx != skill_bounds.second; ++_spell_idx)
|
||||
{
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE, _spell_idx->second->SkillLine);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS, _spell_idx->second->SkillLine);
|
||||
UpdateCriteria(CRITERIA_TYPE_LEARN_SKILL_LINE, _spell_idx->second->SkillLine);
|
||||
UpdateCriteria(CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS, _spell_idx->second->SkillLine);
|
||||
}
|
||||
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL, spellId);
|
||||
UpdateCriteria(CRITERIA_TYPE_LEARN_SPELL, spellId);
|
||||
}
|
||||
|
||||
// return true (for send learn packet) only if spell active (in case ranked spells) and not replace old spell
|
||||
@@ -3535,8 +3535,8 @@ bool Player::ResetTalents(bool noCost)
|
||||
if (!noCost)
|
||||
{
|
||||
ModifyMoney(-(int64)cost);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, cost);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, 1);
|
||||
UpdateCriteria(CRITERIA_TYPE_GOLD_SPENT_FOR_TALENTS, cost);
|
||||
UpdateCriteria(CRITERIA_TYPE_NUMBER_OF_TALENT_RESETS, 1);
|
||||
|
||||
SetTalentResetCost(cost);
|
||||
SetTalentResetTime(time(nullptr));
|
||||
@@ -5137,7 +5137,7 @@ bool Player::UpdateSkill(uint32 skill_id, uint32 step)
|
||||
itr->second.uState = SKILL_CHANGED;
|
||||
|
||||
UpdateSkillEnchantments(skill_id, value, new_value);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, skill_id);
|
||||
UpdateCriteria(CRITERIA_TYPE_REACH_SKILL_LEVEL, skill_id);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -5289,7 +5289,7 @@ bool Player::UpdateSkillPro(uint16 skillId, int32 chance, uint32 step)
|
||||
}
|
||||
|
||||
UpdateSkillEnchantments(skillId, value, new_value);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, skillId);
|
||||
UpdateCriteria(CRITERIA_TYPE_REACH_SKILL_LEVEL, skillId);
|
||||
TC_LOG_DEBUG("entities.player.skills", "Player::UpdateSkillPro: Player '%s' (%s), SkillID: %u, Chance: %3.1f%% taken",
|
||||
GetName().c_str(), GetGUID().ToString().c_str(), skillId, chance / 10.0f);
|
||||
return true;
|
||||
@@ -5417,8 +5417,8 @@ void Player::SetSkill(uint16 id, uint16 step, uint16 newVal, uint16 maxVal)
|
||||
if (newVal > currVal)
|
||||
UpdateSkillEnchantments(id, currVal, newVal);
|
||||
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, id);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, id);
|
||||
UpdateCriteria(CRITERIA_TYPE_REACH_SKILL_LEVEL, id);
|
||||
UpdateCriteria(CRITERIA_TYPE_LEARN_SKILL_LEVEL, id);
|
||||
}
|
||||
else //remove
|
||||
{
|
||||
@@ -5483,8 +5483,8 @@ void Player::SetSkill(uint16 id, uint16 step, uint16 newVal, uint16 maxVal)
|
||||
SetUInt16Value(PLAYER_SKILL_LINEID + SKILL_MAX_RANK_OFFSET + field, offset, maxVal);
|
||||
|
||||
UpdateSkillEnchantments(id, currVal, newVal);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL, id);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL, id);
|
||||
UpdateCriteria(CRITERIA_TYPE_REACH_SKILL_LEVEL, id);
|
||||
UpdateCriteria(CRITERIA_TYPE_LEARN_SKILL_LEVEL, id);
|
||||
|
||||
// insert new entry or update if not deleted old entry yet
|
||||
if (itr != mSkillStatus.end())
|
||||
@@ -5896,7 +5896,7 @@ void Player::CheckAreaExploreAndOutdoor()
|
||||
{
|
||||
SetUInt32Value(PLAYER_EXPLORED_ZONES_1 + offset, (uint32)(currFields | val));
|
||||
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA);
|
||||
UpdateCriteria(CRITERIA_TYPE_EXPLORE_AREA);
|
||||
|
||||
if (areaEntry->ExplorationLevel > 0)
|
||||
{
|
||||
@@ -6256,11 +6256,11 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto
|
||||
ApplyModUInt16Value(PLAYER_FIELD_KILLS, PLAYER_FIELD_KILLS_OFFSET_TODAY_KILLS, 1, true);
|
||||
// and those in a lifetime
|
||||
ApplyModUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 1, true);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS, victim->getClass());
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HK_RACE, victim->getRace());
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, GetAreaId());
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL, 1, 0, 0, victim);
|
||||
UpdateCriteria(CRITERIA_TYPE_EARN_HONORABLE_KILL);
|
||||
UpdateCriteria(CRITERIA_TYPE_HK_CLASS, victim->getClass());
|
||||
UpdateCriteria(CRITERIA_TYPE_HK_RACE, victim->getRace());
|
||||
UpdateCriteria(CRITERIA_TYPE_HONORABLE_KILL_AT_AREA, GetAreaId());
|
||||
UpdateCriteria(CRITERIA_TYPE_HONORABLE_KILL, 1, 0, 0, victim);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -6568,7 +6568,7 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo
|
||||
itr->second.TrackedQuantity = newTrackedCount;
|
||||
|
||||
if (count > 0)
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CURRENCY, id, count);
|
||||
UpdateCriteria(CRITERIA_TYPE_CURRENCY, id, count);
|
||||
|
||||
CurrencyChanged(id, count);
|
||||
|
||||
@@ -7040,8 +7040,8 @@ void Player::DuelComplete(DuelCompleteType type)
|
||||
}
|
||||
break;
|
||||
case DUEL_WON:
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOSE_DUEL, 1);
|
||||
duel->opponent->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL, 1);
|
||||
UpdateCriteria(CRITERIA_TYPE_LOSE_DUEL, 1);
|
||||
duel->opponent->UpdateCriteria(CRITERIA_TYPE_WIN_DUEL, 1);
|
||||
|
||||
// Credit for quest Death's Challenge
|
||||
if (getClass() == CLASS_DEATH_KNIGHT && duel->opponent->GetQuestStatus(12733) == QUEST_STATUS_INCOMPLETE)
|
||||
@@ -11031,8 +11031,8 @@ Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool updat
|
||||
if (item)
|
||||
{
|
||||
ItemAddedQuestCheck(itemId, count);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, itemId, count);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, itemId, 1);
|
||||
UpdateCriteria(CRITERIA_TYPE_RECEIVE_EPIC_ITEM, itemId, count);
|
||||
UpdateCriteria(CRITERIA_TYPE_OWN_ITEM, itemId, 1);
|
||||
|
||||
if (sDB2Manager.GetHeirloomByItemId(itemId))
|
||||
GetSession()->GetCollectionMgr()->AddHeirloom(itemId, 0);
|
||||
@@ -11206,7 +11206,7 @@ Item* Player::EquipNewItem(uint16 pos, uint32 item, bool update)
|
||||
if (Item* pItem = Item::CreateItem(item, 1, this))
|
||||
{
|
||||
ItemAddedQuestCheck(item, 1);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, item, 1);
|
||||
UpdateCriteria(CRITERIA_TYPE_RECEIVE_EPIC_ITEM, item, 1);
|
||||
return EquipItem(pos, pItem, update);
|
||||
}
|
||||
|
||||
@@ -11315,8 +11315,8 @@ Item* Player::EquipItem(uint16 pos, Item* pItem, bool update)
|
||||
}
|
||||
|
||||
// only for full equip instead adding to stack
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry());
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot);
|
||||
UpdateCriteria(CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry());
|
||||
UpdateCriteria(CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot);
|
||||
|
||||
return pItem;
|
||||
}
|
||||
@@ -11337,8 +11337,8 @@ void Player::QuickEquipItem(uint16 pos, Item* pItem)
|
||||
pItem->SendUpdateToPlayer(this);
|
||||
}
|
||||
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry());
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot);
|
||||
UpdateCriteria(CRITERIA_TYPE_EQUIP_ITEM, pItem->GetEntry());
|
||||
UpdateCriteria(CRITERIA_TYPE_EQUIP_EPIC_ITEM, pItem->GetEntry(), slot);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11490,7 +11490,7 @@ void Player::MoveItemToInventory(ItemPosCountVec const& dest, Item* pItem, bool
|
||||
{
|
||||
// update quest counters
|
||||
ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount());
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, pItem->GetEntry(), pItem->GetCount());
|
||||
UpdateCriteria(CRITERIA_TYPE_RECEIVE_EPIC_ITEM, pItem->GetEntry(), pItem->GetCount());
|
||||
|
||||
// store item
|
||||
Item* pLastItem = StoreItem(dest, pItem, update);
|
||||
@@ -14099,7 +14099,7 @@ void Player::AddQuest(Quest const* quest, Object* questGiver)
|
||||
|
||||
m_QuestStatusSave[quest_id] = QUEST_DEFAULT_SAVE_TYPE;
|
||||
|
||||
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_QUEST, quest_id);
|
||||
StartCriteriaTimer(CRITERIA_TIMED_TYPE_QUEST, quest_id);
|
||||
|
||||
SendQuestUpdate(quest_id);
|
||||
|
||||
@@ -14307,7 +14307,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
|
||||
ModifyMoney(moneyRew);
|
||||
|
||||
if (moneyRew > 0)
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, uint32(moneyRew));
|
||||
UpdateCriteria(CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD, uint32(moneyRew));
|
||||
}
|
||||
|
||||
// honor reward
|
||||
@@ -14335,8 +14335,8 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
|
||||
SetDailyQuestStatus(quest_id);
|
||||
if (quest->IsDaily())
|
||||
{
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST, quest_id);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, quest_id);
|
||||
UpdateCriteria(CRITERIA_TYPE_COMPLETE_DAILY_QUEST, quest_id);
|
||||
UpdateCriteria(CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY, quest_id);
|
||||
}
|
||||
}
|
||||
else if (quest->IsWeekly())
|
||||
@@ -14383,9 +14383,9 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
|
||||
}
|
||||
|
||||
if (quest->GetZoneOrSort() > 0)
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, quest->GetZoneOrSort());
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, quest->GetQuestId());
|
||||
UpdateCriteria(CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE, quest->GetZoneOrSort());
|
||||
UpdateCriteria(CRITERIA_TYPE_COMPLETE_QUEST_COUNT);
|
||||
UpdateCriteria(CRITERIA_TYPE_COMPLETE_QUEST, quest->GetQuestId());
|
||||
|
||||
if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(quest_id))
|
||||
SetQuestCompletedBit(questBit, true);
|
||||
@@ -15453,8 +15453,8 @@ void Player::KilledMonsterCredit(uint32 entry, ObjectGuid guid /*= ObjectGuid::E
|
||||
real_entry = killed->GetEntry();
|
||||
}
|
||||
|
||||
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_CREATURE, real_entry); // MUST BE CALLED FIRST
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, real_entry, addKillCount, 0, killed);
|
||||
StartCriteriaTimer(CRITERIA_TIMED_TYPE_CREATURE, real_entry); // MUST BE CALLED FIRST
|
||||
UpdateCriteria(CRITERIA_TYPE_KILL_CREATURE, real_entry, addKillCount, 0, killed);
|
||||
|
||||
for (uint8 i = 0; i < MAX_QUEST_LOG_SIZE; ++i)
|
||||
{
|
||||
@@ -16321,7 +16321,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
|
||||
SetObjectScale(1.0f);
|
||||
SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f);
|
||||
|
||||
// load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateAchievementCriteria)
|
||||
// load achievements before anything else to prevent multiple gains for the same achievement/criteria on every loading (as loading does call UpdateCriteria)
|
||||
m_achievementMgr->LoadFromDB(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACHIEVEMENTS), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_CRITERIA_PROGRESS));
|
||||
|
||||
uint64 money = fields[8].GetUInt64();
|
||||
@@ -20794,7 +20794,7 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc
|
||||
}
|
||||
|
||||
//Checks and preparations done, DO FLIGHT
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, 1);
|
||||
UpdateCriteria(CRITERIA_TYPE_FLIGHT_PATHS_TAKEN, 1);
|
||||
|
||||
// prevent stealth flight
|
||||
//RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_TALK);
|
||||
@@ -20805,14 +20805,14 @@ bool Player::ActivateTaxiPathTo(std::vector<uint32> const& nodes, Creature* npc
|
||||
ASSERT(lastPathNode);
|
||||
m_taxi.ClearTaxiDestinations();
|
||||
ModifyMoney(-int64(totalcost));
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, totalcost);
|
||||
UpdateCriteria(CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, totalcost);
|
||||
TeleportTo(lastPathNode->MapID, lastPathNode->Pos.X, lastPathNode->Pos.Y, lastPathNode->Pos.Z, GetOrientation());
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
ModifyMoney(-int64(firstcost));
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, firstcost);
|
||||
UpdateCriteria(CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, firstcost);
|
||||
GetSession()->SendActivateTaxiReply(ERR_TAXIOK);
|
||||
GetSession()->SendDoFlight(mount_display_id, sourcepath);
|
||||
}
|
||||
@@ -22153,7 +22153,7 @@ void Player::SetMoney(uint64 value)
|
||||
{
|
||||
SetUInt64Value(PLAYER_FIELD_COINAGE, value);
|
||||
MoneyChanged(value);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED);
|
||||
UpdateCriteria(CRITERIA_TYPE_HIGHEST_GOLD_VALUE_OWNED);
|
||||
}
|
||||
|
||||
bool Player::IsQuestRewarded(uint32 quest_id) const
|
||||
@@ -22277,7 +22277,7 @@ void Player::SendInitialPacketsBeforeAddToMap()
|
||||
/// SMSG_EQUIPMENT_SET_LIST
|
||||
SendEquipmentSetList();
|
||||
|
||||
m_achievementMgr->SendAllAchievementData(this);
|
||||
m_achievementMgr->SendAllData(this);
|
||||
|
||||
/// SMSG_LOGIN_SETTIMESPEED
|
||||
static float const TimeSpeed = 0.01666667f;
|
||||
@@ -23165,7 +23165,7 @@ void Player::SummonIfPossible(bool agree)
|
||||
|
||||
m_summon_expire = 0;
|
||||
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ACCEPTED_SUMMONINGS, 1);
|
||||
UpdateCriteria(CRITERIA_TYPE_ACCEPTED_SUMMONINGS, 1);
|
||||
|
||||
TeleportTo(m_summon_location);
|
||||
}
|
||||
@@ -24365,9 +24365,9 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot)
|
||||
guild->AddGuildNews(GUILD_NEWS_ITEM_LOOTED, GetGUID(), 0, item->itemid);
|
||||
|
||||
SendNewItem(newitem, uint32(item->count), false, false, true);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, item->itemid, item->count, loot->loot_type);
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM, item->itemid, item->count);
|
||||
UpdateCriteria(CRITERIA_TYPE_LOOT_ITEM, item->itemid, item->count);
|
||||
UpdateCriteria(CRITERIA_TYPE_LOOT_TYPE, item->itemid, item->count, loot->loot_type);
|
||||
UpdateCriteria(CRITERIA_TYPE_LOOT_EPIC_ITEM, item->itemid, item->count);
|
||||
|
||||
// LootItem is being removed (looted) from the container, delete it from the DB.
|
||||
if (!loot->containerID.IsEmpty())
|
||||
@@ -24623,7 +24623,7 @@ void Player::HandleFall(MovementInfo const& movementInfo)
|
||||
|
||||
// recheck alive, might have died of EnvironmentalDamage, avoid cases when player die in fact like Spirit of Redemption case
|
||||
if (IsAlive() && final_damage < original_health)
|
||||
UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING, uint32(z_diff*100));
|
||||
UpdateCriteria(CRITERIA_TYPE_FALL_WITHOUT_DYING, uint32(z_diff*100));
|
||||
}
|
||||
|
||||
//Z given by moveinfo, LastZ, FallTime, WaterZ, MapZ, Damage, Safefall reduction
|
||||
@@ -24653,34 +24653,34 @@ bool Player::HasAchieved(uint32 achievementId) const
|
||||
return m_achievementMgr->HasAchieved(achievementId);
|
||||
}
|
||||
|
||||
void Player::StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost/* = 0*/)
|
||||
void Player::StartCriteriaTimer(CriteriaTimedTypes type, uint32 entry, uint32 timeLost/* = 0*/)
|
||||
{
|
||||
m_achievementMgr->StartTimedAchievement(type, entry, timeLost);
|
||||
m_achievementMgr->StartCriteriaTimer(type, entry, timeLost);
|
||||
}
|
||||
|
||||
void Player::RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
|
||||
void Player::RemoveCriteriaTimer(CriteriaTimedTypes type, uint32 entry)
|
||||
{
|
||||
m_achievementMgr->RemoveTimedAchievement(type, entry);
|
||||
m_achievementMgr->RemoveCriteriaTimer(type, entry);
|
||||
}
|
||||
|
||||
void Player::ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 /*= 0*/, uint64 miscValue2 /*= 0*/, bool evenIfCriteriaComplete /* = false*/)
|
||||
void Player::ResetCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0*/, uint64 miscValue2 /*= 0*/, bool evenIfCriteriaComplete /* = false*/)
|
||||
{
|
||||
m_achievementMgr->ResetAchievementCriteria(type, miscValue1, miscValue2, evenIfCriteriaComplete);
|
||||
m_achievementMgr->ResetCriteria(type, miscValue1, miscValue2, evenIfCriteriaComplete);
|
||||
}
|
||||
|
||||
void Player::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 /*= 0*/, uint64 miscValue2 /*= 0*/, uint64 miscValue3 /*= 0*/, Unit* unit /*= NULL*/)
|
||||
void Player::UpdateCriteria(CriteriaTypes type, uint64 miscValue1 /*= 0*/, uint64 miscValue2 /*= 0*/, uint64 miscValue3 /*= 0*/, Unit* unit /*= NULL*/)
|
||||
{
|
||||
m_achievementMgr->UpdateAchievementCriteria(type, miscValue1, miscValue2, miscValue3, unit, this);
|
||||
m_achievementMgr->UpdateCriteria(type, miscValue1, miscValue2, miscValue3, unit, this);
|
||||
Guild* guild = sGuildMgr->GetGuildById(GetGuildId());
|
||||
if (!guild)
|
||||
return;
|
||||
|
||||
// Update only individual achievement criteria here, otherwise we may get multiple updates
|
||||
// from a single boss kill
|
||||
if (sAchievementMgr->IsGroupCriteriaType(type))
|
||||
if (CriteriaMgr::IsGroupCriteriaType(type))
|
||||
return;
|
||||
|
||||
guild->UpdateAchievementCriteria(type, miscValue1, miscValue2, miscValue3, unit, this);
|
||||
guild->UpdateCriteria(type, miscValue1, miscValue2, miscValue3, unit, this);
|
||||
}
|
||||
|
||||
void Player::CompletedAchievement(AchievementEntry const* entry)
|
||||
|
||||
@@ -40,7 +40,7 @@ struct ItemExtendedCostEntry;
|
||||
struct TrainerSpell;
|
||||
struct VendorItem;
|
||||
|
||||
template<class T> class AchievementMgr;
|
||||
class PlayerAchievementMgr;
|
||||
class ReputationMgr;
|
||||
class Channel;
|
||||
class Creature;
|
||||
@@ -2429,10 +2429,10 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
uint32 GetAchievementPoints() const;
|
||||
bool HasAchieved(uint32 achievementId) const;
|
||||
void ResetAchievements();
|
||||
void ResetAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false);
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, Unit* unit = NULL);
|
||||
void StartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
|
||||
void RemoveTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry);
|
||||
void ResetCriteria(CriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, bool evenIfCriteriaComplete = false);
|
||||
void UpdateCriteria(CriteriaTypes type, uint64 miscValue1 = 0, uint64 miscValue2 = 0, uint64 miscValue3 = 0, Unit* unit = NULL);
|
||||
void StartCriteriaTimer(CriteriaTimedTypes type, uint32 entry, uint32 timeLost = 0);
|
||||
void RemoveCriteriaTimer(CriteriaTimedTypes type, uint32 entry);
|
||||
void CompletedAchievement(AchievementEntry const* entry);
|
||||
|
||||
bool HasTitle(uint32 bitIndex) const;
|
||||
@@ -2813,7 +2813,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
|
||||
uint32 m_temporaryUnsummonedPetNumber;
|
||||
uint32 m_oldpetspell;
|
||||
|
||||
AchievementMgr<Player>* m_achievementMgr;
|
||||
PlayerAchievementMgr* m_achievementMgr;
|
||||
ReputationMgr* m_reputationMgr;
|
||||
|
||||
uint32 m_ChampioningFaction;
|
||||
|
||||
@@ -740,12 +740,12 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam
|
||||
if (Battleground* bg = killer->GetBattleground())
|
||||
bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
|
||||
|
||||
killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, 0, victim);
|
||||
killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage);
|
||||
killer->UpdateCriteria(CRITERIA_TYPE_DAMAGE_DONE, damage, 0, 0, victim);
|
||||
killer->UpdateCriteria(CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage);
|
||||
}
|
||||
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage);
|
||||
victim->ToPlayer()->UpdateCriteria(CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage);
|
||||
else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
|
||||
{
|
||||
if (!victim->ToCreature()->hasLootRecipient())
|
||||
@@ -760,7 +760,7 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam
|
||||
TC_LOG_DEBUG("entities.unit", "DealDamage: victim just died");
|
||||
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER && victim != this)
|
||||
victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health);
|
||||
victim->ToPlayer()->UpdateCriteria(CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health);
|
||||
|
||||
Kill(victim, durabilityLoss);
|
||||
}
|
||||
@@ -769,7 +769,7 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam
|
||||
TC_LOG_DEBUG("entities.unit", "DealDamageAlive");
|
||||
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage);
|
||||
victim->ToPlayer()->UpdateCriteria(CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage);
|
||||
|
||||
victim->ModifyHealth(-(int32)damage);
|
||||
|
||||
@@ -7585,15 +7585,15 @@ int32 Unit::DealHeal(Unit* victim, uint32 addhealth)
|
||||
|
||||
// use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
|
||||
if (gain)
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, 0, victim);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_HEALING_DONE, gain, 0, 0, victim);
|
||||
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CAST, addhealth);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_HIGHEST_HEAL_CAST, addhealth);
|
||||
}
|
||||
|
||||
if (Player* player = victim->ToPlayer())
|
||||
{
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth);
|
||||
}
|
||||
|
||||
return gain;
|
||||
@@ -13165,7 +13165,7 @@ void Unit::Kill(Unit* victim, bool durabilityLoss)
|
||||
// update get killing blow achievements, must be done before setDeathState to be able to require auras on target
|
||||
// and before Spirit of Redemption as it also removes auras
|
||||
if (Player* killerPlayer = GetCharmerOrOwnerPlayerOrPlayerItself())
|
||||
killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, 0, victim);
|
||||
killerPlayer->UpdateCriteria(CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, 0, victim);
|
||||
|
||||
// if talent known but not triggered (check priest class for speedup check)
|
||||
bool spiritOfRedemption = false;
|
||||
@@ -13334,9 +13334,9 @@ void Unit::Kill(Unit* victim, bool durabilityLoss)
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
{
|
||||
if (GetTypeId() == TYPEID_UNIT)
|
||||
victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry());
|
||||
victim->ToPlayer()->UpdateCriteria(CRITERIA_TYPE_KILLED_BY_CREATURE, GetEntry());
|
||||
else if (GetTypeId() == TYPEID_PLAYER && victim != this)
|
||||
victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, 1, ToPlayer()->GetTeam());
|
||||
victim->ToPlayer()->UpdateCriteria(CRITERIA_TYPE_KILLED_BY_PLAYER, 1, ToPlayer()->GetTeam());
|
||||
}
|
||||
|
||||
// Hook for OnPVPKill Event
|
||||
|
||||
@@ -407,7 +407,7 @@ void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId)
|
||||
_owner->SendDirectMessage(buildingRemoved.Write());
|
||||
}
|
||||
|
||||
_owner->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_PLACE_GARRISON_BUILDING, garrBuildingId);
|
||||
_owner->UpdateCriteria(CRITERIA_TYPE_PLACE_GARRISON_BUILDING, garrBuildingId);
|
||||
}
|
||||
|
||||
_owner->SendDirectMessage(placeBuildingResult.Write());
|
||||
@@ -511,7 +511,7 @@ void Garrison::AddFollower(uint32 garrFollowerId)
|
||||
addFollowerResult.Follower = follower.PacketInfo;
|
||||
_owner->SendDirectMessage(addFollowerResult.Write());
|
||||
|
||||
_owner->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECRUIT_GARRISON_FOLLOWER, follower.PacketInfo.DbID);
|
||||
_owner->UpdateCriteria(CRITERIA_TYPE_RECRUIT_GARRISON_FOLLOWER, follower.PacketInfo.DbID);
|
||||
}
|
||||
|
||||
Garrison::Follower const* Garrison::GetFollower(uint64 dbId) const
|
||||
|
||||
@@ -6289,7 +6289,7 @@ void ObjectMgr::LoadAccessRequirements()
|
||||
|
||||
if (ar->achievement)
|
||||
{
|
||||
if (!sAchievementMgr->GetAchievement(ar->achievement))
|
||||
if (!sAchievementStore.LookupEntry(ar->achievement))
|
||||
{
|
||||
TC_LOG_ERROR("sql.sql", "Required Achievement %u not exist for map %u difficulty %u, remove quest done requirement.", ar->achievement, mapid, difficulty);
|
||||
ar->achievement = 0;
|
||||
@@ -8588,12 +8588,12 @@ void ObjectMgr::LoadScriptNames()
|
||||
_scriptNamesStore.emplace_back("");
|
||||
|
||||
QueryResult result = WorldDatabase.Query(
|
||||
"SELECT DISTINCT(ScriptName) FROM achievement_criteria_data WHERE ScriptName <> '' AND type = 11 "
|
||||
"UNION "
|
||||
"SELECT DISTINCT(ScriptName) FROM battleground_template WHERE ScriptName <> '' "
|
||||
"UNION "
|
||||
"SELECT DISTINCT(ScriptName) FROM creature_template WHERE ScriptName <> '' "
|
||||
"UNION "
|
||||
"SELECT DISTINCT(ScriptName) FROM criteria_data WHERE ScriptName <> '' AND type = 11 "
|
||||
"UNION "
|
||||
"SELECT DISTINCT(ScriptName) FROM gameobject_template WHERE ScriptName <> '' "
|
||||
"UNION "
|
||||
"SELECT DISTINCT(ScriptName) FROM item_script_names WHERE ScriptName <> '' "
|
||||
@@ -8775,9 +8775,9 @@ void ObjectMgr::LoadFactionChangeAchievements()
|
||||
uint32 alliance = fields[0].GetUInt32();
|
||||
uint32 horde = fields[1].GetUInt32();
|
||||
|
||||
if (!sAchievementMgr->GetAchievement(alliance))
|
||||
if (!sAchievementStore.LookupEntry(alliance))
|
||||
TC_LOG_ERROR("sql.sql", "Achievement %u (alliance_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", alliance);
|
||||
else if (!sAchievementMgr->GetAchievement(horde))
|
||||
else if (!sAchievementStore.LookupEntry(horde))
|
||||
TC_LOG_ERROR("sql.sql", "Achievement %u (horde_id) referenced in `player_factionchange_achievement` does not exist, pair skipped!", horde);
|
||||
else
|
||||
FactionChangeAchievements[alliance] = horde;
|
||||
|
||||
@@ -1417,7 +1417,7 @@ void Group::CountTheRoll(Rolls::iterator rollI)
|
||||
|
||||
if (player && player->GetSession())
|
||||
{
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT, roll->itemid, maxresul);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_ROLL_NEED_ON_LOOT, roll->itemid, maxresul);
|
||||
|
||||
ItemPosCountVec dest;
|
||||
LootItem* item = &(roll->itemSlot >= roll->getLoot()->items.size() ? roll->getLoot()->quest_items[roll->itemSlot - roll->getLoot()->items.size()] : roll->getLoot()->items[roll->itemSlot]);
|
||||
@@ -1466,7 +1466,7 @@ void Group::CountTheRoll(Rolls::iterator rollI)
|
||||
|
||||
if (player && player->GetSession())
|
||||
{
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT, roll->itemid, maxresul);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_ROLL_GREED_ON_LOOT, roll->itemid, maxresul);
|
||||
|
||||
LootItem* item = &(roll->itemSlot >= roll->getLoot()->items.size() ? roll->getLoot()->quest_items[roll->itemSlot - roll->getLoot()->items.size()] : roll->getLoot()->items[roll->itemSlot]);
|
||||
|
||||
@@ -1493,7 +1493,7 @@ void Group::CountTheRoll(Rolls::iterator rollI)
|
||||
roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
|
||||
roll->getLoot()->unlootedCount--;
|
||||
ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(roll->itemid);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, 13262); // Disenchant
|
||||
player->UpdateCriteria(CRITERIA_TYPE_CAST_SPELL, 13262); // Disenchant
|
||||
|
||||
ItemPosCountVec dest;
|
||||
InventoryResult msg = player->CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, roll->itemid, item->count);
|
||||
|
||||
@@ -1391,11 +1391,11 @@ void Guild::HandleSetAchievementTracking(WorldSession* session, std::set<uint32>
|
||||
|
||||
for (uint32 achievementId : achievementIds)
|
||||
{
|
||||
if (AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementId))
|
||||
if (AchievementEntry const* achievement = sAchievementStore.LookupEntry(achievementId))
|
||||
{
|
||||
if (AchievementCriteriaTree const* tree = sAchievementMgr->GetAchievementCriteriaTree(achievement->CriteriaTree))
|
||||
if (CriteriaTree const* tree = sCriteriaMgr->GetCriteriaTree(achievement->CriteriaTree))
|
||||
{
|
||||
sAchievementMgr->WalkCriteriaTree(tree, [&criteriaIds](AchievementCriteriaTree const* node)
|
||||
CriteriaMgr::WalkCriteriaTree(tree, [&criteriaIds](CriteriaTree const* node)
|
||||
{
|
||||
if (node->Criteria)
|
||||
criteriaIds.insert(node->Criteria->ID);
|
||||
@@ -2162,7 +2162,7 @@ void Guild::SendLoginInfo(WorldSession* session)
|
||||
if (entry->GuildLevel <= GetLevel())
|
||||
player->LearnSpell(entry->SpellID, true);
|
||||
|
||||
m_achievementMgr.SendAllAchievementData(player);
|
||||
m_achievementMgr.SendAllData(player);
|
||||
|
||||
WorldPackets::Guild::GuildMemberDailyReset packet; // tells the client to request bank withdrawal limit
|
||||
player->GetSession()->SendPacket(packet.Write());
|
||||
@@ -3384,9 +3384,9 @@ bool Guild::HasAchieved(uint32 achievementId) const
|
||||
return m_achievementMgr.HasAchieved(achievementId);
|
||||
}
|
||||
|
||||
void Guild::UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit* unit, Player* player)
|
||||
void Guild::UpdateCriteria(CriteriaTypes type, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit* unit, Player* player)
|
||||
{
|
||||
m_achievementMgr.UpdateAchievementCriteria(type, miscValue1, miscValue2, miscValue3, unit, player);
|
||||
m_achievementMgr.UpdateCriteria(type, miscValue1, miscValue2, miscValue3, unit, player);
|
||||
}
|
||||
|
||||
void Guild::HandleNewsSetSticky(WorldSession* session, uint32 newsId, bool sticky)
|
||||
|
||||
@@ -865,8 +865,8 @@ public:
|
||||
// Bank tabs
|
||||
void SetBankTabText(uint8 tabId, std::string const& text);
|
||||
|
||||
AchievementMgr<Guild>& GetAchievementMgr() { return m_achievementMgr; }
|
||||
AchievementMgr<Guild> const& GetAchievementMgr() const { return m_achievementMgr; }
|
||||
GuildAchievementMgr& GetAchievementMgr() { return m_achievementMgr; }
|
||||
GuildAchievementMgr const& GetAchievementMgr() const { return m_achievementMgr; }
|
||||
|
||||
// Guild leveling
|
||||
uint8 GetLevel() const { return _level; }
|
||||
@@ -877,7 +877,7 @@ public:
|
||||
void ResetTimes(bool weekly);
|
||||
|
||||
bool HasAchieved(uint32 achievementId) const;
|
||||
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit* unit, Player* player);
|
||||
void UpdateCriteria(CriteriaTypes type, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit* unit, Player* player);
|
||||
|
||||
protected:
|
||||
ObjectGuid::LowType m_id;
|
||||
@@ -899,7 +899,7 @@ protected:
|
||||
LogHolder* m_eventLog;
|
||||
LogHolder* m_bankEventLog[GUILD_BANK_MAX_TABS + 1];
|
||||
LogHolder* m_newsLog;
|
||||
AchievementMgr<Guild> m_achievementMgr;
|
||||
GuildAchievementMgr m_achievementMgr;
|
||||
|
||||
uint8 _level;
|
||||
|
||||
|
||||
@@ -511,7 +511,7 @@ void GuildMgr::LoadGuildRewards()
|
||||
|
||||
uint32 requiredAchievementId = fields[0].GetUInt32();
|
||||
|
||||
if (!sAchievementMgr->GetAchievement(requiredAchievementId))
|
||||
if (!sAchievementStore.LookupEntry(requiredAchievementId))
|
||||
{
|
||||
TC_LOG_ERROR("server.loading", "Guild rewards constains not existing achievement entry %u", requiredAchievementId);
|
||||
continue;
|
||||
|
||||
@@ -279,7 +279,7 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell
|
||||
|
||||
SendAuctionCommandResult(AH, AUCTION_SELL_ITEM, ERR_AUCTION_OK);
|
||||
|
||||
GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1);
|
||||
GetPlayer()->UpdateCriteria(CRITERIA_TYPE_CREATE_AUCTION, 1);
|
||||
}
|
||||
else // Required stack size of auction does not match to current item stack size, clone item and set correct stack size
|
||||
{
|
||||
@@ -354,7 +354,7 @@ void WorldSession::HandleAuctionSellItem(WorldPackets::AuctionHouse::AuctionSell
|
||||
|
||||
SendAuctionCommandResult(AH, AUCTION_SELL_ITEM, ERR_AUCTION_OK);
|
||||
|
||||
GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CREATE_AUCTION, 1);
|
||||
GetPlayer()->UpdateCriteria(CRITERIA_TYPE_CREATE_AUCTION, 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -437,7 +437,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlac
|
||||
|
||||
auction->bidder = player->GetGUID().GetCounter();
|
||||
auction->bid = packet.BidAmount;
|
||||
GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID, packet.BidAmount);
|
||||
GetPlayer()->UpdateCriteria(CRITERIA_TYPE_HIGHEST_AUCTION_BID, packet.BidAmount);
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_AUCTION_BID);
|
||||
stmt->setUInt64(0, auction->bidder);
|
||||
@@ -466,7 +466,7 @@ void WorldSession::HandleAuctionPlaceBid(WorldPackets::AuctionHouse::AuctionPlac
|
||||
}
|
||||
auction->bidder = player->GetGUID().GetCounter();
|
||||
auction->bid = auction->buyout;
|
||||
GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_AUCTION_BID, auction->buyout);
|
||||
GetPlayer()->UpdateCriteria(CRITERIA_TYPE_HIGHEST_AUCTION_BID, auction->buyout);
|
||||
|
||||
SendAuctionCommandResult(auction, AUCTION_PLACE_BID, ERR_AUCTION_OK);
|
||||
|
||||
|
||||
@@ -159,7 +159,7 @@ void WorldSession::HandleBuyBankSlotOpcode(WorldPackets::Bank::BuyBankSlot& pack
|
||||
data << uint32(ERR_BANKSLOT_OK);
|
||||
SendPacket(&data);
|
||||
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_BUY_BANK_SLOT);
|
||||
}
|
||||
|
||||
void WorldSession::SendShowBank(ObjectGuid guid)
|
||||
|
||||
@@ -1133,7 +1133,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
|
||||
m_playerLoading.Clear();
|
||||
|
||||
// Handle Login-Achievements (should be handled after loading)
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN, 1);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_ON_LOGIN, 1);
|
||||
|
||||
sScriptMgr->OnPlayerLogin(pCurrChar, firstLogin);
|
||||
|
||||
@@ -1460,7 +1460,7 @@ void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance
|
||||
SendBarberShopResult(BARBER_SHOP_RESULT_SUCCESS);
|
||||
|
||||
_player->ModifyMoney(-int64(cost)); // it isn't free
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_AT_BARBER, cost);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_GOLD_SPENT_AT_BARBER, cost);
|
||||
|
||||
_player->SetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID, uint8(bs_hair->Data));
|
||||
_player->SetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID, uint8(packet.NewHairColor));
|
||||
@@ -1470,7 +1470,7 @@ void WorldSession::HandleAlterAppearance(WorldPackets::Character::AlterApperance
|
||||
if (bs_face)
|
||||
_player->SetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID, uint8(bs_face->Data));
|
||||
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP, 1);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_VISIT_BARBER_SHOP, 1);
|
||||
|
||||
_player->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
}
|
||||
@@ -2051,8 +2051,8 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(PreparedQueryResult res
|
||||
trans->Append(stmt);
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ACHIEVEMENT);
|
||||
stmt->setUInt16(0, uint16(newTeamId == TEAM_ALLIANCE ? achiev_alliance : achiev_horde));
|
||||
stmt->setUInt16(1, uint16(newTeamId == TEAM_ALLIANCE ? achiev_horde : achiev_alliance));
|
||||
stmt->setUInt32(0, uint16(newTeamId == TEAM_ALLIANCE ? achiev_alliance : achiev_horde));
|
||||
stmt->setUInt32(1, uint16(newTeamId == TEAM_ALLIANCE ? achiev_horde : achiev_alliance));
|
||||
stmt->setUInt64(2, lowGuid);
|
||||
trans->Append(stmt);
|
||||
}
|
||||
|
||||
@@ -627,7 +627,7 @@ void WorldSession::HandleTextEmoteOpcode(WorldPackets::Chat::CTextEmote& packet)
|
||||
|
||||
Unit* unit = ObjectAccessor::GetUnit(*_player, packet.Target);
|
||||
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE, packet.SoundIndex, 0, 0, unit);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_DO_EMOTE, packet.SoundIndex, 0, 0, unit);
|
||||
|
||||
// Send scripted event call
|
||||
if (unit)
|
||||
|
||||
@@ -376,10 +376,10 @@ void WorldSession::HandleLootRoll(WorldPackets::Loot::LootRoll& packet)
|
||||
switch (packet.RollType)
|
||||
{
|
||||
case ROLL_NEED:
|
||||
GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED, 1);
|
||||
GetPlayer()->UpdateCriteria(CRITERIA_TYPE_ROLL_NEED, 1);
|
||||
break;
|
||||
case ROLL_GREED:
|
||||
GetPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED, 1);
|
||||
GetPlayer()->UpdateCriteria(CRITERIA_TYPE_ROLL_GREED, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -437,7 +437,7 @@ void WorldSession::HandleSellItemOpcode(WorldPackets::Item::SellItem& packet)
|
||||
|
||||
uint32 money = pProto->GetSellPrice() * packet.Amount;
|
||||
_player->ModifyMoney(money);
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_VENDORS, money);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_MONEY_FROM_VENDORS, money);
|
||||
}
|
||||
else
|
||||
_player->SendSellError(SELL_ERR_CANT_SELL_ITEM, creature, packet.ItemGUID);
|
||||
@@ -481,7 +481,7 @@ void WorldSession::HandleBuybackItem(WorldPackets::Item::BuyBackItem& packet)
|
||||
_player->ModifyMoney(-(int32)price);
|
||||
_player->RemoveItemFromBuyBackSlot(packet.Slot, false);
|
||||
_player->ItemAddedQuestCheck(pItem->GetEntry(), pItem->GetCount());
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, pItem->GetEntry(), pItem->GetCount());
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_RECEIVE_EPIC_ITEM, pItem->GetEntry(), pItem->GetCount());
|
||||
_player->StoreItem(dest, pItem, true);
|
||||
}
|
||||
else
|
||||
|
||||
@@ -185,7 +185,7 @@ void WorldSession::HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& /*packet
|
||||
for (std::vector<Player*>::const_iterator i = playersNear.begin(); i != playersNear.end(); ++i)
|
||||
{
|
||||
(*i)->ModifyMoney(goldPerPlayer);
|
||||
(*i)->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer);
|
||||
(*i)->UpdateCriteria(CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer);
|
||||
|
||||
if (Guild* guild = sGuildMgr->GetGuildById((*i)->GetGuildId()))
|
||||
if (uint32 guildGold = CalculatePct(goldPerPlayer, (*i)->GetTotalAuraModifier(SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT)))
|
||||
@@ -200,7 +200,7 @@ void WorldSession::HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& /*packet
|
||||
else
|
||||
{
|
||||
player->ModifyMoney(loot->gold);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY, loot->gold);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_LOOT_MONEY, loot->gold);
|
||||
|
||||
if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId()))
|
||||
if (uint32 guildGold = CalculatePct(loot->gold, player->GetTotalAuraModifier(SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT)))
|
||||
@@ -471,9 +471,9 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData)
|
||||
// now move item from loot to target inventory
|
||||
Item* newitem = target->StoreNewItem(dest, item.itemid, true, item.randomPropertyId, item.GetAllowedLooters(), item.BonusListIDs);
|
||||
target->SendNewItem(newitem, uint32(item.count), false, false, true);
|
||||
target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count);
|
||||
target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, item.itemid, item.count, loot->loot_type);
|
||||
target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_EPIC_ITEM, item.itemid, item.count);
|
||||
target->UpdateCriteria(CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count);
|
||||
target->UpdateCriteria(CRITERIA_TYPE_LOOT_TYPE, item.itemid, item.count, loot->loot_type);
|
||||
target->UpdateCriteria(CRITERIA_TYPE_LOOT_EPIC_ITEM, item.itemid, item.count);
|
||||
|
||||
// mark as looted
|
||||
item.count = 0;
|
||||
|
||||
@@ -274,7 +274,7 @@ void WorldSession::HandleSendMail(WorldPackets::Mail::SendMail& packet)
|
||||
player->SendMailResult(0, MAIL_SEND, MAIL_OK);
|
||||
|
||||
player->ModifyMoney(-reqmoney);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL, cost);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_GOLD_SPENT_FOR_MAIL, cost);
|
||||
|
||||
bool needItemDelay = false;
|
||||
|
||||
|
||||
@@ -436,7 +436,7 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPackets::Quest::QuestLogRemove
|
||||
|
||||
_player->TakeQuestSourceItem(questId, true); // remove quest src item from player
|
||||
_player->RemoveActiveQuest(questId);
|
||||
_player->RemoveTimedAchievement(ACHIEVEMENT_TIMED_TYPE_QUEST, questId);
|
||||
_player->RemoveCriteriaTimer(CRITERIA_TIMED_TYPE_QUEST, questId);
|
||||
|
||||
TC_LOG_INFO("network", "%s abandoned quest %u", _player->GetGUID().ToString().c_str(), questId);
|
||||
|
||||
@@ -454,7 +454,7 @@ void WorldSession::HandleQuestLogRemoveQuest(WorldPackets::Quest::QuestLogRemove
|
||||
|
||||
_player->SetQuestSlot(packet.Entry, 0);
|
||||
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_QUEST_ABANDONED, 1);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_QUEST_ABANDONED, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -238,7 +238,7 @@ void WorldSession::HandleGameobjectReportUse(WorldPackets::GameObject::GameObjRe
|
||||
if (go->AI()->GossipHello(_player))
|
||||
return;
|
||||
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT, go->GetEntry());
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_USE_GAMEOBJECT, go->GetEntry());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -538,36 +538,36 @@ void InstanceScript::DoSendNotifyToInstance(char const* format, ...)
|
||||
}
|
||||
|
||||
// Update Achievement Criteria for all players in instance
|
||||
void InstanceScript::DoUpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /*= 0*/, Unit* unit /*= NULL*/)
|
||||
void InstanceScript::DoUpdateCriteria(CriteriaTypes type, uint32 miscValue1 /*= 0*/, uint32 miscValue2 /*= 0*/, Unit* unit /*= NULL*/)
|
||||
{
|
||||
Map::PlayerList const &PlayerList = instance->GetPlayers();
|
||||
|
||||
if (!PlayerList.isEmpty())
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
if (Player* player = i->GetSource())
|
||||
player->UpdateAchievementCriteria(type, miscValue1, miscValue2, 0, unit);
|
||||
player->UpdateCriteria(type, miscValue1, miscValue2, 0, unit);
|
||||
}
|
||||
|
||||
// Start timed achievement for all players in instance
|
||||
void InstanceScript::DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
|
||||
void InstanceScript::DoStartCriteriaTimer(CriteriaTimedTypes type, uint32 entry)
|
||||
{
|
||||
Map::PlayerList const &PlayerList = instance->GetPlayers();
|
||||
|
||||
if (!PlayerList.isEmpty())
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
if (Player* player = i->GetSource())
|
||||
player->StartTimedAchievement(type, entry);
|
||||
player->StartCriteriaTimer(type, entry);
|
||||
}
|
||||
|
||||
// Stop timed achievement for all players in instance
|
||||
void InstanceScript::DoStopTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry)
|
||||
void InstanceScript::DoStopCriteriaTimer(CriteriaTimedTypes type, uint32 entry)
|
||||
{
|
||||
Map::PlayerList const &PlayerList = instance->GetPlayers();
|
||||
|
||||
if (!PlayerList.isEmpty())
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
if (Player* player = i->GetSource())
|
||||
player->RemoveTimedAchievement(type, entry);
|
||||
player->RemoveCriteriaTimer(type, entry);
|
||||
}
|
||||
|
||||
// Remove Auras due to Spell on all players in instance
|
||||
|
||||
@@ -210,11 +210,11 @@ class TC_GAME_API InstanceScript : public ZoneScript
|
||||
void DoSendNotifyToInstance(char const* format, ...);
|
||||
|
||||
// Update Achievement Criteria for all players in instance
|
||||
void DoUpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, Unit* unit = NULL);
|
||||
void DoUpdateCriteria(CriteriaTypes type, uint32 miscValue1 = 0, uint32 miscValue2 = 0, Unit* unit = NULL);
|
||||
|
||||
// Start/Stop Timed Achievement Criteria for all players in instance
|
||||
void DoStartTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry);
|
||||
void DoStopTimedAchievement(AchievementCriteriaTimedTypes type, uint32 entry);
|
||||
void DoStartCriteriaTimer(CriteriaTimedTypes type, uint32 entry);
|
||||
void DoStopCriteriaTimer(CriteriaTimedTypes type, uint32 entry);
|
||||
|
||||
// Remove Auras due to Spell on all players in instance
|
||||
void DoRemoveAurasDueToSpellOnPlayers(uint32 spell);
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include "Player.h"
|
||||
#include "WorldSession.h"
|
||||
#include "Opcodes.h"
|
||||
#include "AchievementMgr.h"
|
||||
#include "MiscPackets.h"
|
||||
|
||||
MapManager::MapManager()
|
||||
@@ -370,5 +369,4 @@ void MapManager::FreeInstanceId(uint32 instanceId)
|
||||
SetNextInstanceId(instanceId);
|
||||
|
||||
_instanceIds[instanceId] = false;
|
||||
sAchievementMgr->OnInstanceDestroyed(instanceId);
|
||||
}
|
||||
|
||||
@@ -370,7 +370,7 @@ bool FlightPathMovementGenerator::DoUpdate(Player* player, uint32 /*diff*/)
|
||||
player->m_taxi.NextTaxiDestination();
|
||||
if (!_pointsForPathSwitch.empty())
|
||||
{
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, _pointsForPathSwitch.front().Cost);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_GOLD_SPENT_FOR_TRAVELLING, _pointsForPathSwitch.front().Cost);
|
||||
player->ModifyMoney(-_pointsForPathSwitch.front().Cost);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,11 +367,11 @@ bool ReputationMgr::SetOneFactionReputation(FactionEntry const* factionEntry, in
|
||||
UpdateRankCounters(old_rank, new_rank);
|
||||
|
||||
_player->ReputationChanged(factionEntry);
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KNOWN_FACTIONS, factionEntry->ID);
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION, factionEntry->ID);
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION, factionEntry->ID);
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_REVERED_REPUTATION, factionEntry->ID);
|
||||
_player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GAIN_HONORED_REPUTATION, factionEntry->ID);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_KNOWN_FACTIONS, factionEntry->ID);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_GAIN_REPUTATION, factionEntry->ID);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_GAIN_EXALTED_REPUTATION, factionEntry->ID);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_GAIN_REVERED_REPUTATION, factionEntry->ID);
|
||||
_player->UpdateCriteria(CRITERIA_TYPE_GAIN_HONORED_REPUTATION, factionEntry->ID);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -2527,15 +2527,15 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA
|
||||
|
||||
if (Player* player = unit->ToPlayer())
|
||||
{
|
||||
player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, m_spellInfo->Id);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, m_spellInfo->Id, 0, 0, m_caster);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2, m_spellInfo->Id);
|
||||
player->StartCriteriaTimer(CRITERIA_TIMED_TYPE_SPELL_TARGET, m_spellInfo->Id);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BE_SPELL_TARGET, m_spellInfo->Id, 0, 0, m_caster);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_BE_SPELL_TARGET2, m_spellInfo->Id);
|
||||
}
|
||||
|
||||
if (Player* player = m_caster->ToPlayer())
|
||||
{
|
||||
player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_CASTER, m_spellInfo->Id);
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2, m_spellInfo->Id, 0, 0, unit);
|
||||
player->StartCriteriaTimer(CRITERIA_TIMED_TYPE_SPELL_CASTER, m_spellInfo->Id);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_CAST_SPELL2, m_spellInfo->Id, 0, 0, unit);
|
||||
}
|
||||
|
||||
if (m_caster != unit)
|
||||
@@ -3270,11 +3270,11 @@ void Spell::cast(bool skipCheck)
|
||||
{
|
||||
if (!(_triggeredCastFlags & TRIGGERED_IGNORE_CAST_ITEM) && m_CastItem)
|
||||
{
|
||||
player->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_ITEM, m_CastItem->GetEntry());
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM, m_CastItem->GetEntry());
|
||||
player->StartCriteriaTimer(CRITERIA_TIMED_TYPE_ITEM, m_CastItem->GetEntry());
|
||||
player->UpdateCriteria(CRITERIA_TYPE_USE_ITEM, m_CastItem->GetEntry());
|
||||
}
|
||||
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL, m_spellInfo->Id);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_CAST_SPELL, m_spellInfo->Id);
|
||||
}
|
||||
|
||||
if (!(_triggeredCastFlags & TRIGGERED_IGNORE_POWER_AND_REAGENT_COST))
|
||||
|
||||
@@ -2211,7 +2211,7 @@ void Spell::EffectLearnSpell(SpellEffIndex effIndex)
|
||||
if (entry->SummonSpellID == spellToLearn)
|
||||
{
|
||||
battlePetMgr->AddPet(entry->ID, entry->CreatureID, BattlePetMgr::RollPetBreed(entry->ID), BattlePetMgr::GetDefaultPetQuality(entry->ID));
|
||||
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_BATTLE_PET_COUNT);
|
||||
player->UpdateCriteria(CRITERIA_TYPE_OWN_BATTLE_PET_COUNT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
*/
|
||||
|
||||
#include "Common.h"
|
||||
#include "AchievementMgr.h"
|
||||
#include "CriteriaHandler.h"
|
||||
#include "CharacterDatabaseCleaner.h"
|
||||
#include "World.h"
|
||||
#include "Database/DatabaseEnv.h"
|
||||
@@ -109,7 +109,7 @@ void CharacterDatabaseCleaner::CheckUnique(const char* column, const char* table
|
||||
|
||||
bool CharacterDatabaseCleaner::AchievementProgressCheck(uint32 criteria)
|
||||
{
|
||||
return sAchievementMgr->GetAchievementCriteria(criteria) != nullptr;
|
||||
return sCriteriaMgr->GetCriteria(criteria) != nullptr;
|
||||
}
|
||||
|
||||
void CharacterDatabaseCleaner::CleanCharacterAchievementProgress()
|
||||
|
||||
@@ -1816,14 +1816,14 @@ void World::SetInitialWorldSettings()
|
||||
TC_LOG_INFO("server.loading", "Loading skill tier info...");
|
||||
sObjectMgr->LoadSkillTiers();
|
||||
|
||||
TC_LOG_INFO("server.loading", "Loading Criteria Modifier trees...");
|
||||
sCriteriaMgr->LoadCriteriaModifiersTree();
|
||||
TC_LOG_INFO("server.loading", "Loading Criteria Lists...");
|
||||
sCriteriaMgr->LoadCriteriaList();
|
||||
TC_LOG_INFO("server.loading", "Loading Criteria Data...");
|
||||
sCriteriaMgr->LoadCriteriaData();
|
||||
TC_LOG_INFO("server.loading", "Loading Achievements...");
|
||||
sAchievementMgr->LoadAchievementReferenceList();
|
||||
TC_LOG_INFO("server.loading", "Loading Achievement Criteria Modifier trees...");
|
||||
sAchievementMgr->LoadAchievementCriteriaModifiersTree();
|
||||
TC_LOG_INFO("server.loading", "Loading Achievement Criteria Lists...");
|
||||
sAchievementMgr->LoadAchievementCriteriaList();
|
||||
TC_LOG_INFO("server.loading", "Loading Achievement Criteria Data...");
|
||||
sAchievementMgr->LoadAchievementCriteriaData();
|
||||
TC_LOG_INFO("server.loading", "Loading Achievement Rewards...");
|
||||
sAchievementMgr->LoadRewards();
|
||||
TC_LOG_INFO("server.loading", "Loading Achievement Reward Locales...");
|
||||
|
||||
@@ -68,7 +68,7 @@ public:
|
||||
return false;
|
||||
}
|
||||
|
||||
if (AchievementEntry const* achievementEntry = sAchievementMgr->GetAchievement(achievementId))
|
||||
if (AchievementEntry const* achievementEntry = sAchievementStore.LookupEntry(achievementId))
|
||||
target->CompletedAchievement(achievementEntry);
|
||||
|
||||
return true;
|
||||
|
||||
@@ -23,7 +23,7 @@ Category: commandscripts
|
||||
EndScriptData */
|
||||
|
||||
#include "DisableMgr.h"
|
||||
#include "AchievementMgr.h"
|
||||
#include "CriteriaHandler.h"
|
||||
#include "Chat.h"
|
||||
#include "Language.h"
|
||||
#include "ObjectMgr.h"
|
||||
@@ -41,25 +41,25 @@ public:
|
||||
{
|
||||
static std::vector<ChatCommand> removeDisableCommandTable =
|
||||
{
|
||||
{ "spell", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_SPELL, true, &HandleRemoveDisableSpellCommand, "" },
|
||||
{ "quest", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_QUEST, true, &HandleRemoveDisableQuestCommand, "" },
|
||||
{ "map", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_MAP, true, &HandleRemoveDisableMapCommand, "" },
|
||||
{ "battleground", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_BATTLEGROUND, true, &HandleRemoveDisableBattlegroundCommand, "" },
|
||||
{ "achievement_criteria", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_ACHIEVEMENT_CRITERIA, true, &HandleRemoveDisableAchievementCriteriaCommand, "" },
|
||||
{ "outdoorpvp", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_OUTDOORPVP, true, &HandleRemoveDisableOutdoorPvPCommand, "" },
|
||||
{ "vmap", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_VMAP, true, &HandleRemoveDisableVmapCommand, "" },
|
||||
{ "mmap", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_MMAP, true, &HandleRemoveDisableMMapCommand, "" },
|
||||
{ "spell", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_SPELL, true, &HandleRemoveDisableSpellCommand, "" },
|
||||
{ "quest", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_QUEST, true, &HandleRemoveDisableQuestCommand, "" },
|
||||
{ "map", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_MAP, true, &HandleRemoveDisableMapCommand, "" },
|
||||
{ "battleground", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_BATTLEGROUND, true, &HandleRemoveDisableBattlegroundCommand, "" },
|
||||
{ "criteria", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_CRITERIA, true, &HandleRemoveDisableCriteriaCommand, "" },
|
||||
{ "outdoorpvp", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_OUTDOORPVP, true, &HandleRemoveDisableOutdoorPvPCommand, "" },
|
||||
{ "vmap", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_VMAP, true, &HandleRemoveDisableVmapCommand, "" },
|
||||
{ "mmap", rbac::RBAC_PERM_COMMAND_DISABLE_REMOVE_MMAP, true, &HandleRemoveDisableMMapCommand, "" },
|
||||
};
|
||||
static std::vector<ChatCommand> addDisableCommandTable =
|
||||
{
|
||||
{ "spell", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_SPELL, true, &HandleAddDisableSpellCommand, "" },
|
||||
{ "quest", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_QUEST, true, &HandleAddDisableQuestCommand, "" },
|
||||
{ "map", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_MAP, true, &HandleAddDisableMapCommand, "" },
|
||||
{ "battleground", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_BATTLEGROUND, true, &HandleAddDisableBattlegroundCommand, "" },
|
||||
{ "achievement_criteria", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_ACHIEVEMENT_CRITERIA, true, &HandleAddDisableAchievementCriteriaCommand, "" },
|
||||
{ "outdoorpvp", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_OUTDOORPVP, true, &HandleAddDisableOutdoorPvPCommand, "" },
|
||||
{ "vmap", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_VMAP, true, &HandleAddDisableVmapCommand, "" },
|
||||
{ "mmap", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_MMAP, true, &HandleAddDisableMMapCommand, "" },
|
||||
{ "spell", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_SPELL, true, &HandleAddDisableSpellCommand, "" },
|
||||
{ "quest", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_QUEST, true, &HandleAddDisableQuestCommand, "" },
|
||||
{ "map", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_MAP, true, &HandleAddDisableMapCommand, "" },
|
||||
{ "battleground", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_BATTLEGROUND, true, &HandleAddDisableBattlegroundCommand, "" },
|
||||
{ "criteria", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_CRITERIA, true, &HandleAddDisableCriteriaCommand, "" },
|
||||
{ "outdoorpvp", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_OUTDOORPVP, true, &HandleAddDisableOutdoorPvPCommand, "" },
|
||||
{ "vmap", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_VMAP, true, &HandleAddDisableVmapCommand, "" },
|
||||
{ "mmap", rbac::RBAC_PERM_COMMAND_DISABLE_ADD_MMAP, true, &HandleAddDisableMMapCommand, "" },
|
||||
};
|
||||
static std::vector<ChatCommand> disableCommandTable =
|
||||
{
|
||||
@@ -89,7 +89,7 @@ public:
|
||||
std::string disableComment = commentStr;
|
||||
uint32 entry = uint32(atoi(entryStr));
|
||||
|
||||
std::string disableTypeStr = "";
|
||||
char const* disableTypeStr = "";
|
||||
|
||||
switch (disableType)
|
||||
{
|
||||
@@ -137,15 +137,15 @@ public:
|
||||
disableTypeStr = "battleground";
|
||||
break;
|
||||
}
|
||||
case DISABLE_TYPE_ACHIEVEMENT_CRITERIA:
|
||||
case DISABLE_TYPE_CRITERIA:
|
||||
{
|
||||
if (!sAchievementMgr->GetAchievementCriteria(entry))
|
||||
if (!sCriteriaMgr->GetCriteria(entry))
|
||||
{
|
||||
handler->PSendSysMessage(LANG_COMMAND_NO_ACHIEVEMENT_CRITERIA_FOUND);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
disableTypeStr = "achievement criteria";
|
||||
disableTypeStr = "criteria";
|
||||
break;
|
||||
}
|
||||
case DISABLE_TYPE_OUTDOORPVP:
|
||||
@@ -192,7 +192,7 @@ public:
|
||||
PreparedQueryResult result = WorldDatabase.Query(stmt);
|
||||
if (result)
|
||||
{
|
||||
handler->PSendSysMessage("This %s (Id: %u) is already disabled.", disableTypeStr.c_str(), entry);
|
||||
handler->PSendSysMessage("This %s (Id: %u) is already disabled.", disableTypeStr, entry);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
@@ -204,7 +204,7 @@ public:
|
||||
stmt->setString(3, disableComment);
|
||||
WorldDatabase.Execute(stmt);
|
||||
|
||||
handler->PSendSysMessage("Add Disabled %s (Id: %u) for reason %s", disableTypeStr.c_str(), entry, disableComment.c_str());
|
||||
handler->PSendSysMessage("Add Disabled %s (Id: %u) for reason %s", disableTypeStr, entry, disableComment.c_str());
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -240,12 +240,12 @@ public:
|
||||
return HandleAddDisables(handler, args, DISABLE_TYPE_BATTLEGROUND);
|
||||
}
|
||||
|
||||
static bool HandleAddDisableAchievementCriteriaCommand(ChatHandler* handler, char const* args)
|
||||
static bool HandleAddDisableCriteriaCommand(ChatHandler* handler, char const* args)
|
||||
{
|
||||
if (!*args)
|
||||
return false;
|
||||
|
||||
return HandleAddDisables(handler, args, DISABLE_TYPE_ACHIEVEMENT_CRITERIA);
|
||||
return HandleAddDisables(handler, args, DISABLE_TYPE_CRITERIA);
|
||||
}
|
||||
|
||||
static bool HandleAddDisableOutdoorPvPCommand(ChatHandler* handler, char const* args)
|
||||
@@ -281,7 +281,7 @@ public:
|
||||
|
||||
uint32 entry = uint32(atoi(entryStr));
|
||||
|
||||
std::string disableTypeStr = "";
|
||||
char const* disableTypeStr = "";
|
||||
|
||||
switch (disableType)
|
||||
{
|
||||
@@ -297,8 +297,8 @@ public:
|
||||
case DISABLE_TYPE_BATTLEGROUND:
|
||||
disableTypeStr = "battleground";
|
||||
break;
|
||||
case DISABLE_TYPE_ACHIEVEMENT_CRITERIA:
|
||||
disableTypeStr = "achievement criteria";
|
||||
case DISABLE_TYPE_CRITERIA:
|
||||
disableTypeStr = "criteria";
|
||||
break;
|
||||
case DISABLE_TYPE_OUTDOORPVP:
|
||||
disableTypeStr = "outdoorpvp";
|
||||
@@ -318,7 +318,7 @@ public:
|
||||
PreparedQueryResult result = WorldDatabase.Query(stmt);
|
||||
if (!result)
|
||||
{
|
||||
handler->PSendSysMessage("This %s (Id: %u) is not disabled.", disableTypeStr.c_str(), entry);
|
||||
handler->PSendSysMessage("This %s (Id: %u) is not disabled.", disableTypeStr, entry);
|
||||
handler->SetSentErrorMessage(true);
|
||||
return false;
|
||||
}
|
||||
@@ -328,7 +328,7 @@ public:
|
||||
stmt->setUInt8(1, disableType);
|
||||
WorldDatabase.Execute(stmt);
|
||||
|
||||
handler->PSendSysMessage("Remove Disabled %s (Id: %u)", disableTypeStr.c_str(), entry);
|
||||
handler->PSendSysMessage("Remove Disabled %s (Id: %u)", disableTypeStr, entry);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -364,12 +364,12 @@ public:
|
||||
return HandleRemoveDisables(handler, args, DISABLE_TYPE_BATTLEGROUND);
|
||||
}
|
||||
|
||||
static bool HandleRemoveDisableAchievementCriteriaCommand(ChatHandler* handler, char const* args)
|
||||
static bool HandleRemoveDisableCriteriaCommand(ChatHandler* handler, char const* args)
|
||||
{
|
||||
if (!*args)
|
||||
return false;
|
||||
|
||||
return HandleRemoveDisables(handler, args, DISABLE_TYPE_ACHIEVEMENT_CRITERIA);
|
||||
return HandleRemoveDisables(handler, args, DISABLE_TYPE_CRITERIA);
|
||||
}
|
||||
|
||||
static bool HandleRemoveDisableOutdoorPvPCommand(ChatHandler* handler, char const* args)
|
||||
|
||||
@@ -67,7 +67,6 @@ public:
|
||||
{
|
||||
{ "auctions", rbac::RBAC_PERM_COMMAND_RELOAD_AUCTIONS, true, &HandleReloadAuctionsCommand, "" },
|
||||
{ "access_requirement", rbac::RBAC_PERM_COMMAND_RELOAD_ACCESS_REQUIREMENT, true, &HandleReloadAccessRequirementCommand, "" },
|
||||
{ "achievement_criteria_data", rbac::RBAC_PERM_COMMAND_RELOAD_ACHIEVEMENT_CRITERIA_DATA, true, &HandleReloadAchievementCriteriaDataCommand, "" },
|
||||
{ "achievement_reward", rbac::RBAC_PERM_COMMAND_RELOAD_ACHIEVEMENT_REWARD, true, &HandleReloadAchievementRewardCommand, "" },
|
||||
{ "all", rbac::RBAC_PERM_COMMAND_RELOAD_ALL, true, NULL, "", reloadAllCommandTable },
|
||||
{ "areatrigger_involvedrelation", rbac::RBAC_PERM_COMMAND_RELOAD_AREATRIGGER_INVOLVEDRELATION, true, &HandleReloadQuestAreaTriggersCommand, "" },
|
||||
@@ -87,6 +86,7 @@ public:
|
||||
{ "creature_queststarter", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_QUESTSTARTER, true, &HandleReloadCreatureQuestStarterCommand, "" },
|
||||
{ "creature_summon_groups", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_SUMMON_GROUPS, true, &HandleReloadCreatureSummonGroupsCommand, "" },
|
||||
{ "creature_template", rbac::RBAC_PERM_COMMAND_RELOAD_CREATURE_TEMPLATE, true, &HandleReloadCreatureTemplateCommand, "" },
|
||||
{ "criteria_data", rbac::RBAC_PERM_COMMAND_RELOAD_CRITERIA_DATA, true, &HandleReloadCriteriaDataCommand, "" },
|
||||
{ "disables", rbac::RBAC_PERM_COMMAND_RELOAD_DISABLES, true, &HandleReloadDisablesCommand, "" },
|
||||
{ "disenchant_loot_template", rbac::RBAC_PERM_COMMAND_RELOAD_DISENCHANT_LOOT_TEMPLATE, true, &HandleReloadLootTemplatesDisenchantCommand, "" },
|
||||
{ "event_scripts", rbac::RBAC_PERM_COMMAND_RELOAD_EVENT_SCRIPTS, true, &HandleReloadEventScriptsCommand, "" },
|
||||
@@ -205,7 +205,7 @@ public:
|
||||
|
||||
static bool HandleReloadAllAchievementCommand(ChatHandler* handler, const char* /*args*/)
|
||||
{
|
||||
HandleReloadAchievementCriteriaDataCommand(handler, "");
|
||||
HandleReloadCriteriaDataCommand(handler, "");
|
||||
HandleReloadAchievementRewardCommand(handler, "");
|
||||
return true;
|
||||
}
|
||||
@@ -333,11 +333,11 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool HandleReloadAchievementCriteriaDataCommand(ChatHandler* handler, const char* /*args*/)
|
||||
static bool HandleReloadCriteriaDataCommand(ChatHandler* handler, const char* /*args*/)
|
||||
{
|
||||
TC_LOG_INFO("misc", "Re-Loading Additional Achievement Criteria Data...");
|
||||
sAchievementMgr->LoadAchievementCriteriaData();
|
||||
handler->SendGlobalGMSysMessage("DB table `achievement_criteria_data` reloaded.");
|
||||
TC_LOG_INFO("misc", "Re-Loading Additional Criteria Data...");
|
||||
sCriteriaMgr->LoadCriteriaData();
|
||||
handler->SendGlobalGMSysMessage("DB table `criteria_data` reloaded.");
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -64,7 +64,7 @@ public:
|
||||
if (target)
|
||||
target->ResetAchievements();
|
||||
else
|
||||
AchievementMgr<Player>::DeleteFromDB(targetGuid);
|
||||
PlayerAchievementMgr::DeleteFromDB(targetGuid);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -77,7 +77,7 @@ public:
|
||||
|
||||
target->SetUInt32Value(PLAYER_FIELD_KILLS, 0);
|
||||
target->SetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS, 0);
|
||||
target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL);
|
||||
target->UpdateCriteria(CRITERIA_TYPE_EARN_HONORABLE_KILL);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -384,7 +384,7 @@ class npc_brann_bronzebeard_anraphet : public CreatureScript
|
||||
case EVENT_BRANN_UNLOCK_DOOR:
|
||||
Talk(BRANN_SAY_UNLOCK_DOOR);
|
||||
_instance->SetBossState(DATA_VAULT_OF_LIGHTS, DONE);
|
||||
_instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_VAULT_OF_LIGHTS_EVENT);
|
||||
_instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_VAULT_OF_LIGHTS_EVENT);
|
||||
events.ScheduleEvent(EVENT_BRANN_MOVE_INTRO, 3500);
|
||||
break;
|
||||
case EVENT_BRANN_THINK:
|
||||
|
||||
@@ -155,7 +155,7 @@ public:
|
||||
_Reset();
|
||||
me->SetReactState(REACT_AGGRESSIVE);
|
||||
instance->SetData(DATA_ONYXIA_PHASE, Phase);
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -166,7 +166,7 @@ public:
|
||||
events.ScheduleEvent(EVENT_TAIL_SWEEP, urand(15000, 20000));
|
||||
events.ScheduleEvent(EVENT_CLEAVE, urand(2000, 5000));
|
||||
events.ScheduleEvent(EVENT_WING_BUFFET, urand(10000, 20000));
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned) override
|
||||
|
||||
@@ -165,7 +165,7 @@ public:
|
||||
Initialize();
|
||||
|
||||
instance->SetBossState(DATA_HERALD_VOLAZJ, NOT_STARTED);
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
|
||||
|
||||
// Visible for all players in insanity
|
||||
me->SetInPhase(169, true, true);
|
||||
@@ -185,7 +185,7 @@ public:
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
instance->SetBossState(DATA_HERALD_VOLAZJ, IN_PROGRESS);
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_QUICK_DEMISE_START_EVENT);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon) override
|
||||
|
||||
@@ -144,7 +144,7 @@ public:
|
||||
Summons.DespawnAll();
|
||||
|
||||
instance->SetBossState(DATA_ANUBARAK, NOT_STARTED);
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
|
||||
Creature* DoSummonImpaleTarget(Unit* target)
|
||||
@@ -167,7 +167,7 @@ public:
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
DelayTimer = 0;
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
|
||||
void DelayEventStart()
|
||||
|
||||
+2
-2
@@ -371,7 +371,7 @@ class boss_fjola : public CreatureScript
|
||||
TouchSpellId = SPELL_LIGHT_TOUCH;
|
||||
SpikeSpellId = SPELL_LIGHT_TWIN_SPIKE;
|
||||
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT);
|
||||
boss_twin_baseAI::Reset();
|
||||
}
|
||||
|
||||
@@ -410,7 +410,7 @@ class boss_fjola : public CreatureScript
|
||||
|
||||
void EnterCombat(Unit* who) override
|
||||
{
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, EVENT_START_TWINS_FIGHT);
|
||||
events.ScheduleEvent(EVENT_SPECIAL_ABILITY, 45 * IN_MILLISECONDS);
|
||||
me->SummonCreature(NPC_BULLET_CONTROLLER, ToCCommonLoc[1].GetPositionX(), ToCCommonLoc[1].GetPositionY(), ToCCommonLoc[1].GetPositionZ(), 0.0f, TEMPSUMMON_MANUAL_DESPAWN);
|
||||
boss_twin_baseAI::EnterCombat(who);
|
||||
|
||||
+3
-3
@@ -238,9 +238,9 @@ class instance_trial_of_the_crusader : public InstanceMapScript
|
||||
state = IN_PROGRESS;
|
||||
break;
|
||||
case DONE:
|
||||
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFEAT_FACTION_CHAMPIONS);
|
||||
DoUpdateCriteria(CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_DEFEAT_FACTION_CHAMPIONS);
|
||||
if (ResilienceWillFixItTimer > 0)
|
||||
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_CHAMPIONS_KILLED_IN_MINUTE);
|
||||
DoUpdateCriteria(CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_CHAMPIONS_KILLED_IN_MINUTE);
|
||||
DoRespawnGameObject(CrusadersCacheGUID, 7*DAY);
|
||||
if (GameObject* cache = instance->GetGameObject(CrusadersCacheGUID))
|
||||
cache->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
@@ -408,7 +408,7 @@ class instance_trial_of_the_crusader : public InstanceMapScript
|
||||
break;
|
||||
case SNAKES_DONE:
|
||||
if (NotOneButTwoJormungarsTimer > 0)
|
||||
DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_WORMS_KILLED_IN_10_SECONDS);
|
||||
DoUpdateCriteria(CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_WORMS_KILLED_IN_10_SECONDS);
|
||||
EventStage = 300;
|
||||
SetData(TYPE_NORTHREND_BEASTS, IN_PROGRESS);
|
||||
break;
|
||||
|
||||
@@ -815,7 +815,7 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
|
||||
_events.Reset();
|
||||
_icewall = 0;
|
||||
_events.ScheduleEvent(EVENT_ESCAPE, 1000);
|
||||
_instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
|
||||
_instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
@@ -1053,7 +1053,7 @@ class npc_jaina_or_sylvanas_escape_hor : public CreatureScript
|
||||
}
|
||||
}
|
||||
_invincibility = false;
|
||||
_instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
|
||||
_instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
|
||||
_events.ScheduleEvent(EVENT_ESCAPE_7, 1000);
|
||||
break;
|
||||
case EVENT_ESCAPE_7:
|
||||
|
||||
+1
-1
@@ -349,7 +349,7 @@ class instance_halls_of_reflection : public InstanceMapScript
|
||||
}
|
||||
break;
|
||||
case FAIL:
|
||||
DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
|
||||
DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_NOT_RETREATING_EVENT);
|
||||
|
||||
if (Creature* jainaOrSylvanas = instance->GetCreature(JainaOrSylvanasEscapeGUID))
|
||||
jainaOrSylvanas->DespawnOrUnsummon(10000);
|
||||
|
||||
@@ -322,7 +322,7 @@ class boss_lady_deathwhisper : public CreatureScript
|
||||
livingAddEntries.insert(unit->GetEntry());
|
||||
|
||||
if (livingAddEntries.size() >= 5)
|
||||
instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_FULL_HOUSE, 0, me);
|
||||
instance->DoUpdateCriteria(CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_FULL_HOUSE, 0, me);
|
||||
|
||||
if (Creature* darnavan = ObjectAccessor::GetCreature(*me, _darnavanGUID))
|
||||
{
|
||||
|
||||
@@ -151,7 +151,7 @@ public:
|
||||
_JustDied();
|
||||
|
||||
// start achievement timer (kill Maexna within 20 min)
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
|
||||
@@ -286,7 +286,7 @@ struct boss_four_horsemen_baseAI : public BossAI
|
||||
if (instance->GetBossState(BOSS_HORSEMEN) == DONE)
|
||||
return;
|
||||
instance->SetBossState(BOSS_HORSEMEN, DONE);
|
||||
//instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_ENCOUNTER_CREDIT);
|
||||
//instance->DoUpdateCriteria(CRITERIA_TYPE_BE_SPELL_TARGET, SPELL_ENCOUNTER_CREDIT);
|
||||
DoCastAOE(SPELL_ENCOUNTER_CREDIT, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ public:
|
||||
{
|
||||
_Reset();
|
||||
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*Victim*/) override
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
events.ScheduleEvent(EVENT_HATEFUL, Seconds(1));
|
||||
events.ScheduleEvent(EVENT_BERSERK, Minutes(6));
|
||||
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_MAKE_QUICK_WERK_OF_HIM_STARTING_EVENT);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) override
|
||||
|
||||
@@ -383,7 +383,7 @@ public:
|
||||
|
||||
SetPhase(PHASE_NOT_STARTED, true);
|
||||
me->SetReactState(REACT_PASSIVE);
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 data) const override
|
||||
@@ -582,7 +582,7 @@ public:
|
||||
|
||||
Talk(SAY_START_P_ONE);
|
||||
DoCast(SPELL_BERSERK); // periodic aura, first tick in 10 minutes
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
|
||||
void EnterEvadeMode(EvadeReason /*why*/) override
|
||||
|
||||
@@ -133,7 +133,7 @@ class boss_drakos : public CreatureScript
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
// start achievement timer (kill Eregos within 20 min)
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) override
|
||||
|
||||
@@ -97,7 +97,7 @@ public:
|
||||
{
|
||||
Initialize();
|
||||
_Reset();
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -108,7 +108,7 @@ public:
|
||||
events.ScheduleEvent(EVENT_ARC_LIGHTNING, 15000);
|
||||
events.ScheduleEvent(EVENT_LIGHTNING_NOVA, 20000);
|
||||
events.ScheduleEvent(EVENT_RESUME_PULSING_SHOCKWAVE, 1000);
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMELY_DEATH_START_EVENT);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
|
||||
@@ -67,7 +67,7 @@ class boss_maiden_of_grief : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_SHOCK_OF_SORROW, urand(20000, 25000));
|
||||
events.ScheduleEvent(EVENT_PILLAR_OF_WOE, urand(5000, 15000));
|
||||
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -75,7 +75,7 @@ class boss_maiden_of_grief : public CreatureScript
|
||||
_EnterCombat();
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_GOOD_GRIEF_START_EVENT);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) override
|
||||
|
||||
@@ -773,7 +773,7 @@ class npc_living_constellation : public CreatureScript
|
||||
|
||||
me->DespawnOrUnsummon(1);
|
||||
if (InstanceScript* instance = me->GetInstanceScript())
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, EVENT_ID_SUPERMASSIVE_START);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, EVENT_ID_SUPERMASSIVE_START);
|
||||
caster->CastSpell((Unit*)NULL, SPELL_BLACK_HOLE_CREDIT, TRIGGERED_FULL_MASK);
|
||||
caster->ToCreature()->DespawnOrUnsummon(1);
|
||||
}
|
||||
@@ -1348,7 +1348,7 @@ class spell_algalon_supermassive_fail : public SpellScriptLoader
|
||||
if (!GetHitPlayer())
|
||||
return;
|
||||
|
||||
GetHitPlayer()->ResetAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET, ACHIEVEMENT_CRITERIA_CONDITION_NO_SPELL_HIT, GetSpellInfo()->Id, true);
|
||||
GetHitPlayer()->ResetCriteria(CRITERIA_TYPE_BE_SPELL_TARGET, CRITERIA_CONDITION_NO_SPELL_HIT, GetSpellInfo()->Id, true);
|
||||
}
|
||||
|
||||
void Register() override
|
||||
|
||||
@@ -135,7 +135,7 @@ class boss_ignis : public CreatureScript
|
||||
if (Vehicle* _vehicle = me->GetVehicleKit())
|
||||
_vehicle->RemoveAllPassengers();
|
||||
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -149,7 +149,7 @@ class boss_ignis : public CreatureScript
|
||||
events.ScheduleEvent(EVENT_END_POT, 40000);
|
||||
events.ScheduleEvent(EVENT_BERSERK, 480000);
|
||||
Initialize();
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEVEMENT_IGNIS_START_EVENT);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) override
|
||||
|
||||
@@ -196,7 +196,7 @@ class boss_kologarn : public CreatureScript
|
||||
if (!right && !left)
|
||||
events.ScheduleEvent(EVENT_STONE_SHOUT, 5000);
|
||||
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_DISARMED);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, CRITERIA_DISARMED);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -220,7 +220,7 @@ class boss_xt002 : public CreatureScript
|
||||
|
||||
Initialize();
|
||||
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) override
|
||||
@@ -234,7 +234,7 @@ class boss_xt002 : public CreatureScript
|
||||
//Tantrum is cast a bit slower the first time.
|
||||
events.ScheduleEvent(EVENT_TYMPANIC_TANTRUM, urand(TIMER_TYMPANIC_TANTRUM_MIN, TIMER_TYMPANIC_TANTRUM_MAX) * 2);
|
||||
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_MUST_DECONSTRUCT_FASTER);
|
||||
}
|
||||
|
||||
void DoAction(int32 action) override
|
||||
|
||||
@@ -485,7 +485,7 @@ class boss_voice_of_yogg_saron : public CreatureScript
|
||||
events.SetPhase(PHASE_ONE);
|
||||
|
||||
instance->SetData(DATA_DRIVE_ME_CRAZY, uint32(true));
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
|
||||
Initialize();
|
||||
|
||||
@@ -509,7 +509,7 @@ class boss_voice_of_yogg_saron : public CreatureScript
|
||||
if (Creature* keeper = ObjectAccessor::GetCreature(*me, instance->GetGuidData(i)))
|
||||
keeper->SetInCombatWith(me);
|
||||
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
|
||||
me->CastCustomSpell(SPELL_SUMMON_GUARDIAN_2, SPELLVALUE_MAX_TARGETS, 1);
|
||||
DoCast(me, SPELL_SANITY_PERIODIC);
|
||||
|
||||
@@ -660,7 +660,7 @@ class instance_ulduar : public InstanceMapScript
|
||||
case NPC_GUARDIAN_OF_LIFE:
|
||||
if (!conSpeedAtory)
|
||||
{
|
||||
DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_CON_SPEED_ATORY);
|
||||
DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, CRITERIA_CON_SPEED_ATORY);
|
||||
conSpeedAtory = true;
|
||||
}
|
||||
break;
|
||||
@@ -669,7 +669,7 @@ class instance_ulduar : public InstanceMapScript
|
||||
case NPC_BRIGHTLEAF:
|
||||
if (!lumberjacked)
|
||||
{
|
||||
DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, CRITERIA_LUMBERJACKED);
|
||||
DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, CRITERIA_LUMBERJACKED);
|
||||
lumberjacked = true;
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -213,7 +213,7 @@ public:
|
||||
if ((ObjectAccessor::GetCreature(*me, m_uiGraufGUID) == NULL) && !me->IsMounted())
|
||||
me->SummonCreature(NPC_GRAUF, Location[0].GetPositionX(), Location[0].GetPositionY(), Location[0].GetPositionZ(), 3.0f);
|
||||
instance->SetBossState(DATA_SKADI_THE_RUTHLESS, NOT_STARTED);
|
||||
instance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStopCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
}
|
||||
|
||||
void JustReachedHome() override
|
||||
@@ -237,7 +237,7 @@ public:
|
||||
m_uiSummonTimer = 10000;
|
||||
me->SetInCombatWithZone();
|
||||
instance->SetBossState(DATA_SKADI_THE_RUTHLESS, IN_PROGRESS);
|
||||
instance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
instance->DoStartCriteriaTimer(CRITERIA_TIMED_TYPE_EVENT, ACHIEV_TIMED_START_EVENT);
|
||||
me->GetMotionMaster()->MoveJump(Location[0], 5.0f, 10.0f);
|
||||
me->SetWalk(false);
|
||||
m_uiMountTimer = 1000;
|
||||
|
||||
@@ -3650,7 +3650,6 @@ Logger.sql.sql=5,Console DBErrors
|
||||
Logger.sql.updates=3,Console Server
|
||||
Logger.mmaps=3,Server
|
||||
|
||||
#Logger.achievement=3,Console Server
|
||||
#Logger.addon=3,Console Server
|
||||
#Logger.ahbot=3,Console Server
|
||||
#Logger.auctionHouse=3,Console Server
|
||||
@@ -3663,6 +3662,8 @@ Logger.mmaps=3,Server
|
||||
#Logger.cheat=3,Console Server
|
||||
#Logger.commands.ra=3,Console Server
|
||||
#Logger.condition=3,Console Server
|
||||
#Logger.criteria=3,Console Server
|
||||
#Logger.criteria.achievement=3,Console Server
|
||||
#Logger.entities.pet=3,Console Server
|
||||
#Logger.entities.player.character=3,Console Server
|
||||
#Logger.entities.player.dump=3,Console Server
|
||||
|
||||
Reference in New Issue
Block a user