aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/DataStores
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-12-28 16:21:35 +0100
committerShauren <shauren.trinity@gmail.com>2014-12-28 16:21:35 +0100
commit483b6ad5a8a36c85cb657b3ed6d0c31b241eeb87 (patch)
tree32072653efe0be590623993e7c4ffc3811dfe975 /src/server/game/DataStores
parent12ef5ad90a2bbe367651f82224d785c97b786930 (diff)
Core/Achievements: Updated achievements - progress is currently not saved until a conversion of existing data from old to new criteria is made
Diffstat (limited to 'src/server/game/DataStores')
-rw-r--r--src/server/game/DataStores/DBCEnums.h18
-rw-r--r--src/server/game/DataStores/DBCStores.cpp25
-rw-r--r--src/server/game/DataStores/DBCStores.h4
-rw-r--r--src/server/game/DataStores/DBCStructure.h608
-rw-r--r--src/server/game/DataStores/DBCfmt.h8
5 files changed, 169 insertions, 494 deletions
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 3187b5f9f77..8b93ba5222b 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -93,12 +93,6 @@ enum AchievementFlags
ACHIEVEMENT_FLAG_SHOW_CRITERIA_MEMBERS = 0x00010000 //
};
-enum AchievementCriteriaLimits
-{
- MAX_CRITERIA_REQUIREMENTS = 2,
- MAX_ADDITIONAL_CRITERIA_CONDITIONS = 3
-};
-
enum AchievementCriteriaCondition
{
ACHIEVEMENT_CRITERIA_CONDITION_NONE = 0,
@@ -132,7 +126,7 @@ enum AchievementCriteriaAdditionalCondition
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, // 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,
@@ -179,6 +173,8 @@ enum AchievementCriteriaTimedTypes
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
};
@@ -299,7 +295,13 @@ enum AchievementCriteriaTypes
ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_GUILD_CHALLENGE = 139 //struct { uint32 count; } Guild Challenge
};
-#define ACHIEVEMENT_CRITERIA_TYPE_TOTAL 140
+#define ACHIEVEMENT_CRITERIA_TYPE_TOTAL 188
+
+enum AchievementCriteriaTreeOperator
+{
+ ACHIEVEMENT_CRITERIA_TREE_OPERATOR_ALL = 4,
+ ACHIEVEMENT_CRITERIA_TREE_OPERATOR_ANY = 8
+};
enum AreaFlags
{
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index b801fd7b3f3..6647fa08fc2 100644
--- a/src/server/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
@@ -60,7 +60,6 @@ static AreaFlagByMapID sAreaFlagByMapID; // for instances wit
static WMOAreaInfoByTripple sWMOAreaInfoByTripple;
DBCStorage <AchievementEntry> sAchievementStore(Achievementfmt);
-DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore(AchievementCriteriafmt);
DBCStorage <AreaTriggerEntry> sAreaTriggerStore(AreaTriggerEntryfmt);
DBCStorage <ArmorLocationEntry> sArmorLocationStore(ArmorLocationfmt);
DBCStorage <AuctionHouseEntry> sAuctionHouseStore(AuctionHouseEntryfmt);
@@ -85,6 +84,8 @@ DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore(CreatureFamilyfmt);
DBCStorage <CreatureModelDataEntry> sCreatureModelDataStore(CreatureModelDatafmt);
DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore(CreatureSpellDatafmt);
DBCStorage <CreatureTypeEntry> sCreatureTypeStore(CreatureTypefmt);
+DBCStorage <CriteriaEntry> sCriteriaStore(Criteriafmt);
+DBCStorage <CriteriaTreeEntry> sCriteriaTreeStore(CriteriaTreefmt);
DBCStorage <CurrencyTypesEntry> sCurrencyTypesStore(CurrencyTypesfmt);
uint32 PowersByClass[MAX_CLASSES][MAX_POWERS];
@@ -163,6 +164,7 @@ DBCStorage <MapEntry> sMapStore(MapEntryfmt);
DBCStorage <MapDifficultyEntry> sMapDifficultyStore(MapDifficultyEntryfmt); // only for loading
MapDifficultyMap sMapDifficultyMap;
+DBCStorage <ModifierTreeEntry> sModifierTreeStore(ModifierTreefmt);
DBCStorage <MovieEntry> sMovieStore(MovieEntryfmt);
DBCStorage <MountCapabilityEntry> sMountCapabilityStore(MountCapabilityfmt);
DBCStorage <MountTypeEntry> sMountTypeStore(MountTypefmt);
@@ -240,19 +242,13 @@ typedef std::list<std::string> StoreProblemList;
uint32 DBCFileCount = 0;
-static bool LoadDBC_assert_print(uint32 fsize, uint32 rsize, const std::string& filename)
-{
- TC_LOG_ERROR("misc", "Size of '%s' set by format string (%u) not equal size of C++ structure (%u).", filename.c_str(), fsize, rsize);
-
- // ASSERT must fail after function call
- return false;
-}
-
template<class T>
inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCStorage<T>& storage, std::string const& dbcPath, std::string const& filename, std::string const* customFormat = NULL, std::string const* customIndexName = NULL)
{
// compatibility format and C++ structure sizes
- ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T), filename));
+ ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T),
+ "Size of '%s' set by format string (%u) not equal size of C++ structure (%u).",
+ filename.c_str(), DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T));
++DBCFileCount;
std::string dbcFilename = dbcPath + filename;
@@ -298,7 +294,9 @@ template<class T>
inline void LoadGameTable(StoreProblemList& errors, std::string const& tableName, GameTable<T>& storage, std::string const& dbcPath, std::string const& filename)
{
// compatibility format and C++ structure sizes
- ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T) || LoadDBC_assert_print(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T), filename));
+ ASSERT(DBCFileLoader::GetFormatRecordSize(storage.GetFormat()) == sizeof(T),
+ "Size of '%s' set by format string (%u) not equal size of C++ structure (%u).",
+ filename.c_str(), DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), sizeof(T));
++DBCFileCount;
std::string dbcFilename = dbcPath + filename;
@@ -365,8 +363,6 @@ void LoadDBCStores(const std::string& dataPath)
}
LoadDBC(availableDbcLocales, bad_dbc_files, sAchievementStore, dbcPath, "Achievement.dbc"/*, &CustomAchievementfmt, &CustomAchievementIndex*/);//19116
- // TODO: 6.x remove this and update achievement system with new dbcs
- //LoadDBC(availableDbcLocales, bad_dbc_files, sAchievementCriteriaStore, dbcPath, "Achievement_Criteria.dbc");
LoadDBC(availableDbcLocales, bad_dbc_files, sAreaTriggerStore, dbcPath, "AreaTrigger.dbc");//19116
LoadDBC(availableDbcLocales, bad_dbc_files, sAreaGroupStore, dbcPath, "AreaGroup.dbc");//19116
LoadDBC(availableDbcLocales, bad_dbc_files, sAuctionHouseStore, dbcPath, "AuctionHouse.dbc");//19116
@@ -415,6 +411,8 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureModelDataStore, dbcPath, "CreatureModelData.dbc");//19116
LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureSpellDataStore, dbcPath, "CreatureSpellData.dbc");//19116
LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureTypeStore, dbcPath, "CreatureType.dbc");//19116
+ LoadDBC(availableDbcLocales, bad_dbc_files, sCriteriaStore, dbcPath, "Criteria.dbc");//19342
+ LoadDBC(availableDbcLocales, bad_dbc_files, sCriteriaTreeStore, dbcPath, "CriteriaTree.dbc");//19342
LoadDBC(availableDbcLocales, bad_dbc_files, sCurrencyTypesStore, dbcPath, "CurrencyTypes.dbc");//19116
LoadDBC(availableDbcLocales, bad_dbc_files, sDestructibleModelDataStore, dbcPath, "DestructibleModelData.dbc");//19116
LoadDBC(availableDbcLocales, bad_dbc_files, sDungeonEncounterStore, dbcPath, "DungeonEncounter.dbc");//19116
@@ -499,6 +497,7 @@ void LoadDBCStores(const std::string& dataPath)
sMapDifficultyMap[MAKE_PAIR32(entry->MapID, entry->DifficultyID)] = MapDifficulty(entry->RaidDuration, entry->MaxPlayers, entry->Message_lang[0] > 0);
sMapDifficultyStore.Clear();
+ LoadDBC(availableDbcLocales, bad_dbc_files, sModifierTreeStore, dbcPath, "ModifierTree.dbc");//19342
LoadDBC(availableDbcLocales, bad_dbc_files, sMountCapabilityStore, dbcPath, "MountCapability.dbc");//19116
LoadDBC(availableDbcLocales, bad_dbc_files, sMountTypeStore, dbcPath, "MountType.dbc");//19116
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
index 0c25e359483..92770e2e618 100644
--- a/src/server/game/DataStores/DBCStores.h
+++ b/src/server/game/DataStores/DBCStores.h
@@ -131,7 +131,6 @@ private:
};
extern DBCStorage <AchievementEntry> sAchievementStore;
-extern DBCStorage <AchievementCriteriaEntry> sAchievementCriteriaStore;
extern DBCStorage <AreaTableEntry> sAreaStore;// recommend access using functions
extern DBCStorage <AreaGroupEntry> sAreaGroupStore;
extern DBCStorage <AreaTriggerEntry> sAreaTriggerStore;
@@ -156,6 +155,8 @@ extern DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore;
extern DBCStorage <CreatureModelDataEntry> sCreatureModelDataStore;
extern DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore;
extern DBCStorage <CreatureTypeEntry> sCreatureTypeStore;
+extern DBCStorage <CriteriaEntry> sCriteriaStore;
+extern DBCStorage <CriteriaTreeEntry> sCriteriaTreeStore;
extern DBCStorage <CurrencyTypesEntry> sCurrencyTypesStore;
extern DBCStorage <DestructibleModelDataEntry> sDestructibleModelDataStore;
extern DBCStorage <DungeonEncounterEntry> sDungeonEncounterStore;
@@ -217,6 +218,7 @@ extern DBCStorage <LockEntry> sLockStore;
extern DBCStorage <MailTemplateEntry> sMailTemplateStore;
extern DBCStorage <MapEntry> sMapStore;
extern DBCStorage <MinorTalentEntry> sMinorTalentStore;
+extern DBCStorage <ModifierTreeEntry> sModifierTreeStore;
extern DBCStorage <MountCapabilityEntry> sMountCapabilityStore;
extern DBCStorage <MountTypeEntry> sMountTypeStore;
extern DBCStorage <NameGenEntry> sNameGenStore;
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index a03f6370c62..32bd3c35fee 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -54,7 +54,7 @@ struct AchievementEntry
//char* Reward_lang; // 11
uint32 MinimumCriteria; // 12 - need this count of completed criterias (own or referenced achievement criterias)
uint32 SharesCriteria; // 13 - referenced achievement (counting of all completed criterias)
- //uint32 CriteriaTree; // 14
+ uint32 CriteriaTree; // 14
};
//19116
@@ -66,474 +66,6 @@ struct AchievementCategoryEntry
//uint32 UIOrder; // 3
};
-struct AchievementCriteriaEntry
-{
- uint32 ID; // 0
- uint32 achievement; // 1
- uint32 type; // 2
- union
- {
- // ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0
- /// @todo also used for player deaths..
- struct
- {
- uint32 creatureID; // 3
- uint64 creatureCount; // 4
- } kill_creature;
-
- // ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1
- struct
- {
- uint32 bgMapID; // 3
- uint64 winCount; // 4
- } win_bg;
-
- // ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5
- // ACHIEVEMENT_CRITERIA_TYPE_REACH_GUILD_LEVEL = 125
- struct
- {
- uint32 unused; // 3
- uint64 level; // 4
- } reach_level;
-
- // ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7
- struct
- {
- uint32 skillID; // 3
- uint64 skillLevel; // 4
- } reach_skill_level;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
- struct
- {
- uint32 linkedAchievement; // 3
- } complete_achievement;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT = 9
- struct
- {
- uint32 unused; // 3
- uint64 totalQuestCount; // 4
- } complete_quest_count;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10
- struct
- {
- uint32 unused; // 3
- uint64 numberOfDays; // 4
- } complete_daily_quest_daily;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11
- struct
- {
- uint32 zoneID; // 3
- uint64 questCount; // 4
- } complete_quests_in_zone;
-
- // ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12
- struct
- {
- uint32 currency;
- uint64 count;
- } currencyGain;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14
- struct
- {
- uint32 unused; // 3
- uint64 questCount; // 4
- } complete_daily_quest;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15
- struct
- {
- uint32 mapID; // 3
- } complete_battleground;
-
- // ACHIEVEMENT_CRITERIA_TYPE_DEATH_AT_MAP = 16
- struct
- {
- uint32 mapID; // 3
- } death_at_map;
-
- // ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18
- struct
- {
- uint32 manLimit; // 3
- } death_in_dungeon;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19
- struct
- {
- uint32 groupSize; // 3 can be 5, 10 or 25
- } complete_raid;
-
- // ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE = 20
- struct
- {
- uint32 creatureEntry; // 3
- } killed_by_creature;
-
- // ACHIEVEMENT_CRITERIA_TYPE_FALL_WITHOUT_DYING = 24
- struct
- {
- uint32 unused; // 3
- uint64 fallHeight; // 4
- } fall_without_dying;
-
- // ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26
- struct
- {
- uint32 type; // 3, see enum EnviromentalDamage
- } death_from;
-
- // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST = 27
- struct
- {
- uint32 questID; // 3
- uint64 questCount; // 4
- } complete_quest;
-
- // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28
- // ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET2 = 69
- struct
- {
- uint32 spellID; // 3
- uint64 spellCount; // 4
- } be_spell_target;
-
- // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL = 29
- // ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL2 = 110
- struct
- {
- uint32 spellID; // 3
- uint64 castCount; // 4
- } cast_spell;
-
- // ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
- struct
- {
- uint32 objectiveId; // 3
- uint64 completeCount; // 4
- } bg_objective;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31
- struct
- {
- uint32 areaID; // 3 Reference to AreaTable.dbc
- uint64 killCount; // 4
- } honorable_kill_at_area;
-
- // ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32
- struct
- {
- uint32 mapID; // 3 Reference to Map.dbc
- uint64 count; // 4 Number of times that the arena must be won.
- } win_arena;
-
- // ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33
- struct
- {
- uint32 mapID; // 3 Reference to Map.dbc
- } play_arena;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SPELL = 34
- struct
- {
- uint32 spellID; // 3 Reference to Map.dbc
- } learn_spell;
-
- // ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM = 36
- struct
- {
- uint32 itemID; // 3
- uint64 itemCount; // 4
- } own_item;
-
- // ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37
- struct
- {
- uint32 unused; // 3
- uint64 count; // 4
- } win_rated_arena;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38
- struct
- {
- uint32 teamtype; // 3 {2, 3, 5}
- } highest_team_rating;
-
- // ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39
- struct
- {
- uint32 teamtype; // 3 {2, 3, 5}
- uint64 teamrating; // 4
- } reach_team_rating;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39
- struct
- {
- uint32 teamtype; // 3 {2, 3, 5}
- uint64 PersonalRating; // 4
- } highest_personal_rating;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
- struct
- {
- uint32 skillID; // 3
- uint64 skillLevel; // 4 apprentice=1, journeyman=2, expert=3, artisan=4, master=5, grand master=6
- } learn_skill_level;
-
- // ACHIEVEMENT_CRITERIA_TYPE_USE_ITEM = 41
- struct
- {
- uint32 itemID; // 3
- uint64 itemCount; // 4
- } use_item;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42
- struct
- {
- uint32 itemID; // 3
- uint64 itemCount; // 4
- } loot_item;
-
- // ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43
- struct
- {
- /// @todo This rank is _NOT_ the index from AreaTable.dbc
- uint32 areaReference; // 3
- } explore_area;
-
- // ACHIEVEMENT_CRITERIA_TYPE_OWN_RANK = 44
- struct
- {
- /// @todo This rank is _NOT_ the index from CharTitles.dbc
- uint32 rank; // 3
- } own_rank;
-
- // ACHIEVEMENT_CRITERIA_TYPE_BUY_BANK_SLOT = 45
- struct
- {
- uint32 unused; // 3
- uint64 numberOfSlots; // 4
- } buy_bank_slot;
-
- // ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46
- struct
- {
- uint32 factionID; // 3
- uint64 reputationAmount; // 4 Total reputation amount, so 42000 = exalted
- } gain_reputation;
-
- // ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION= 47
- struct
- {
- uint32 unused; // 3
- uint64 numberOfExaltedFactions; // 4
- } gain_exalted_reputation;
-
- // ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP = 48
- struct
- {
- uint32 unused; // 3
- uint64 numberOfVisits; // 4
- } visit_barber;
-
- // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49
- /// @todo where is the required itemlevel stored?
- struct
- {
- uint32 itemSlot; // 3
- uint64 count; // 4
- } equip_epic_item;
-
- // ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50
- struct
- {
- uint32 rollValue; // 3
- uint64 count; // 4
- } roll_need_on_loot;
- // ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51
- struct
- {
- uint32 rollValue; // 3
- uint64 count; // 4
- } roll_greed_on_loot;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52
- struct
- {
- uint32 classID; // 3
- uint64 count; // 4
- } hk_class;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53
- struct
- {
- uint32 raceID; // 3
- uint64 count; // 4
- } hk_race;
-
- // ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54
- /// @todo where is the information about the target stored?
- struct
- {
- uint32 emoteID; // 3 enum TextEmotes
- uint64 count; // 4 count of emotes, always required special target or requirements
- } do_emote;
- // ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE = 13
- // ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE = 55
- // ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56
- struct
- {
- uint32 unused; // 3
- uint64 count; // 4
- } healing_done;
-
- // ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56
- struct
- {
- uint32 unused;
- uint64 killCount;
- } get_killing_blow;
-
- // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57
- struct
- {
- uint32 itemID; // 3
- uint64 count; // 4
- } equip_item;
-
- // ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD= 62
- struct
- {
- uint32 unused; // 3
- uint64 goldInCopper; // 4
- } quest_reward_money;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67
- struct
- {
- uint32 unused; // 3
- uint64 goldInCopper; // 4
- } loot_money;
-
- // ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68
- struct
- {
- uint32 goEntry; // 3
- uint64 useCount; // 4
- } use_gameobject;
-
- // ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL = 70
- /// @todo are those special criteria stored in the dbc or do we have to add another sql table?
- struct
- {
- uint32 unused; // 3
- uint64 killCount; // 4
- } special_pvp_kill;
-
- // ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72
- struct
- {
- uint32 goEntry; // 3
- uint64 lootCount; // 4
- } fish_in_gameobject;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75
- struct
- {
- uint32 skillLine; // 3
- uint64 spellCount; // 4
- } learn_skillline_spell;
-
- // ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76
- struct
- {
- uint32 unused; // 3
- uint64 duelCount; // 4
- } win_duel;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96
- struct
- {
- uint32 powerType; // 3 mana=0, 1=rage, 3=energy, 6=runic power
- } highest_power;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97
- struct
- {
- uint32 statType; // 3 4=spirit, 3=int, 2=stamina, 1=agi, 0=strength
- } highest_stat;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98
- struct
- {
- uint32 spellSchool; // 3
- } highest_spellpower;
-
- // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_RATING = 100
- struct
- {
- uint32 ratingType; // 3
- } highest_rating;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109
- struct
- {
- uint32 lootType; // 3 3=fishing, 2=pickpocket, 4=disentchant
- uint64 lootTypeCount; // 4
- } loot_type;
-
- // ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112
- struct
- {
- uint32 skillLine; // 3
- uint64 spellCount; // 4
- } learn_skill_line;
-
- // ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113
- struct
- {
- uint32 unused; // 3
- uint64 killCount; // 4
- } honorable_kill;
-
- struct
- {
- uint32 unused;
- uint64 dungeonsComplete;
- } use_lfg;
-
- struct
- {
- uint32 field3; // 3 main requirement
- uint64 count; // 4 main requirement count
- } raw;
- };
-
- struct
- {
- uint32 additionalRequirement_type;
- uint32 additionalRequirement_value;
- } additionalRequirements[MAX_CRITERIA_REQUIREMENTS];
-
- char* name; // 9 m_description_lang
- uint32 completionFlag; // 10 m_flags
- uint32 timedCriteriaStartType; // 11 m_timer_start_event Only appears with timed achievements, seems to be the type of starting a timed Achievement, only type 1 and some of type 6 need manual starting
- // 1: ByEventId(?) (serverside IDs), 2: ByQuestId, 5: ByCastSpellId(?)
- // 6: BySpellIdTarget(some of these are unknown spells, some not, some maybe spells)
- // 7: ByKillNpcId, 9: ByUseItemId
- uint32 timedCriteriaMiscId; // 12 m_timer_asset_id Alway appears with timed events, used internally to start the achievement, store
- uint32 timeLimit; // 13 m_timer_time time limit in seconds
- uint32 showOrder; // 14 m_ui_order also used in achievement shift-links as index in state bitmask
- //uint32 unk1; // 15 only one value, still unknown
- //uint32 unk2; // 16 all zeros
- uint32 additionalConditionType[MAX_ADDITIONAL_CRITERIA_CONDITIONS]; // 17-19
- uint32 additionalConditionValue[MAX_ADDITIONAL_CRITERIA_CONDITIONS]; // 20-22
-};
-
// Temporary define until max depth is found somewhere (adt?)
#define MAX_MAP_DEPTH -5000
@@ -897,6 +429,134 @@ struct CreatureTypeEntry
//uint32 Flags; // 2 no exp? critters, non-combat pets, gas cloud.
};
+struct CriteriaEntry
+{
+ uint32 ID; // 0
+ uint32 Type; // 1
+ union
+ {
+ uint32 ID;
+ // ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE = 0
+ // ACHIEVEMENT_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
+ 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
+ uint32 SkillID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
+ uint32 AchievementID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11
+ uint32 ZoneID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12
+ uint32 CurrencyID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_DEATH_IN_DUNGEON = 18
+ // ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_RAID = 19
+ uint32 GroupSize;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26
+ uint32 DamageType;
+
+ // ACHIEVEMENT_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
+ uint32 SpellID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
+ uint32 ObjectiveId;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31
+ 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
+ uint32 ItemID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38
+ // ACHIEVEMENT_CRITERIA_TYPE_REACH_TEAM_RATING = 39
+ // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39
+ uint32 TeamType;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43
+ uint32 WorldMapOverlayID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46
+ uint32 FactionID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49
+ uint32 ItemSlot;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50
+ // ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51
+ uint32 RollValue;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52
+ uint32 ClassID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53
+ uint32 RaceID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54
+ uint32 EmoteID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68
+ // ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72
+ uint32 GameObjectID;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96
+ uint32 PowerType;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_STAT = 97
+ uint32 StatType;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_SPELLPOWER = 98
+ uint32 SpellSchool;
+
+ // ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE = 109
+ uint32 LootType;
+ } Asset; // 2
+ uint32 StartEvent; // 3
+ uint32 StartAsset; // 4
+ uint32 StartTimer; // 5
+ uint32 FailEvent; // 6
+ uint32 FailAsset; // 7
+ uint32 ModifierTreeId; // 8
+ //uint32 Flags; // 9
+ uint32 EligibilityWorldStateID; // 10
+ uint32 EligibilityWorldStateValue; // 11
+};
+
+struct CriteriaTreeEntry
+{
+ uint32 ID; // 0
+ uint32 CriteriaID; // 1
+ uint64 Amount; // 2
+ uint32 Operator; // 3
+ uint32 Parent; // 4
+ //uint32 Flags; // 5
+ //char* DescriptionLang; // 6
+ //uint32 OrderIndex; // 7
+};
+
/* not used
struct CurrencyCategoryEntry
{
@@ -1567,6 +1227,16 @@ struct MinorTalentEntry
uint32 OrderIndex; // 3
};
+struct ModifierTreeEntry
+{
+ uint32 ID; // 0
+ uint32 Type; // 1
+ uint32 Asset[2]; // 2-3
+ uint32 Operator; // 4
+ uint32 Amount; // 5
+ uint32 Parent; // 6
+};
+
struct MountCapabilityEntry
{
uint32 ID; // 0
diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
index 852af09fdb2..bbba02b5ea5 100644
--- a/src/server/game/DataStores/DBCfmt.h
+++ b/src/server/game/DataStores/DBCfmt.h
@@ -20,12 +20,11 @@
#define TRINITY_DBCSFRM_H
// x - skip<uint32>, X - skip<uint8>, s - char*, f - float, i - uint32, b - uint8, d - index (not included)
-// n - index (included), l - bool, p - field present in sql dbc, a - field absent in sql dbc
+// n - index (included), l - uint64, p - field present in sql dbc, a - field absent in sql dbc
-char const Achievementfmt[] = "niixsxiixixxiix";
+char const Achievementfmt[] = "niixsxiixixxiii";
const std::string CustomAchievementfmt = "pppaaaapapaapp";
const std::string CustomAchievementIndex = "ID";
-char const AchievementCriteriafmt[] = "niiiliiiisiiiiixxiiiiii";
char const AreaTableEntryfmt[] = "iiiniixxxxsxixiiiiixxxxxxxxxx";
char const AreaGroupEntryfmt[] = "niiiiiii";
char const AreaTriggerEntryfmt[] = "nifffxxxfffffxxxx";
@@ -49,6 +48,8 @@ char const CreatureFamilyfmt[] = "nfifiiiiixsx";
char const CreatureModelDatafmt[] = "nixxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx";
char const CreatureSpellDatafmt[] = "niiiixxxx";
char const CreatureTypefmt[] = "nxx";
+char const Criteriafmt[] = "niiiiiiiixii";
+char const CriteriaTreefmt[] = "niliixxx";
char const CurrencyTypesfmt[] = "nixxxxxiiixx";
char const DestructibleModelDatafmt[] = "nixxxixxxxixxxxixxxxxxxx";
char const DungeonEncounterfmt[] = "niiixsxxx";
@@ -108,6 +109,7 @@ char const MapEntryfmt[] = "nxiixxsixxixiffxiiiixx";
char const MapDifficultyEntryfmt[] = "diisiixx";
char const MinorTalentEntryfmt[] = "niii";
char const MovieEntryfmt[] = "nxxxx";
+char const ModifierTreefmt[] = "niiiiii";
char const MountCapabilityfmt[] = "niiiiiii";
char const MountTypefmt[] = "niiiiiiiiiiiiiiiiiiiiiiii";
char const NameGenfmt[] = "dsii";