aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp7
-rw-r--r--src/server/game/DataStores/DBCStructure.h118
-rw-r--r--src/server/game/DataStores/DBCfmt.h2
-rw-r--r--src/server/shared/DataStores/DBCFileLoader.cpp14
-rw-r--r--src/server/shared/DataStores/DBCFileLoader.h15
-rw-r--r--src/server/shared/DataStores/DBCStore.h8
-rw-r--r--src/server/shared/Define.h21
7 files changed, 101 insertions, 84 deletions
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index f1263fa0239..09b0981c751 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -2676,13 +2676,6 @@ bool AchievementMgr<T>::AdditionalRequirementsSatisfied(AchievementCriteriaEntry
for (uint8 i = 0; i < MAX_ADDITIONAL_CRITERIA_CONDITIONS; ++i)
{
uint32 reqType = criteria->additionalConditionType[i];
-
- ///@TODO Extract additionalConditionValue[2] column from an older dbc and store it in database
- /// This column is not present in 4.3.4 Achievement_Criteria.dbc
- /// so for now, just return as failed condition to prevent invalid memory access
- if (i == 2 && reqType)
- return false;
-
uint32 reqValue = criteria->additionalConditionValue[i];
switch (AchievementCriteriaAdditionalCondition(reqType))
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index 7fb905b429f..c4c078718f1 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -76,14 +76,14 @@ struct AchievementCriteriaEntry
struct
{
uint32 creatureID; // 3
- uint32 creatureCount; // 4
+ uint64 creatureCount; // 4
} kill_creature;
// ACHIEVEMENT_CRITERIA_TYPE_WIN_BG = 1
struct
{
uint32 bgMapID; // 3
- uint32 winCount; // 4
+ uint64 winCount; // 4
} win_bg;
// ACHIEVEMENT_CRITERIA_TYPE_REACH_LEVEL = 5
@@ -91,14 +91,14 @@ struct AchievementCriteriaEntry
struct
{
uint32 unused; // 3
- uint32 level; // 4
+ uint64 level; // 4
} reach_level;
// ACHIEVEMENT_CRITERIA_TYPE_REACH_SKILL_LEVEL = 7
struct
{
uint32 skillID; // 3
- uint32 skillLevel; // 4
+ uint64 skillLevel; // 4
} reach_skill_level;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT = 8
@@ -111,35 +111,35 @@ struct AchievementCriteriaEntry
struct
{
uint32 unused; // 3
- uint32 totalQuestCount; // 4
+ uint64 totalQuestCount; // 4
} complete_quest_count;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST_DAILY = 10
struct
{
uint32 unused; // 3
- uint32 numberOfDays; // 4
+ uint64 numberOfDays; // 4
} complete_daily_quest_daily;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUESTS_IN_ZONE = 11
struct
{
uint32 zoneID; // 3
- uint32 questCount; // 4
+ uint64 questCount; // 4
} complete_quests_in_zone;
// ACHIEVEMENT_CRITERIA_TYPE_CURRENCY = 12
struct
{
uint32 currency;
- uint32 count;
+ uint64 count;
} currencyGain;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DAILY_QUEST = 14
struct
{
uint32 unused; // 3
- uint32 questCount; // 4
+ uint64 questCount; // 4
} complete_daily_quest;
// ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND = 15
@@ -176,7 +176,7 @@ struct AchievementCriteriaEntry
struct
{
uint32 unused; // 3
- uint32 fallHeight; // 4
+ uint64 fallHeight; // 4
} fall_without_dying;
// ACHIEVEMENT_CRITERIA_TYPE_DEATHS_FROM = 26
@@ -189,7 +189,7 @@ struct AchievementCriteriaEntry
struct
{
uint32 questID; // 3
- uint32 questCount; // 4
+ uint64 questCount; // 4
} complete_quest;
// ACHIEVEMENT_CRITERIA_TYPE_BE_SPELL_TARGET = 28
@@ -197,7 +197,7 @@ struct AchievementCriteriaEntry
struct
{
uint32 spellID; // 3
- uint32 spellCount; // 4
+ uint64 spellCount; // 4
} be_spell_target;
// ACHIEVEMENT_CRITERIA_TYPE_CAST_SPELL = 29
@@ -205,28 +205,28 @@ struct AchievementCriteriaEntry
struct
{
uint32 spellID; // 3
- uint32 castCount; // 4
+ uint64 castCount; // 4
} cast_spell;
// ACHIEVEMENT_CRITERIA_TYPE_BG_OBJECTIVE_CAPTURE
struct
{
uint32 objectiveId; // 3
- uint32 completeCount; // 4
+ uint64 completeCount; // 4
} bg_objective;
// ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA = 31
struct
{
uint32 areaID; // 3 Reference to AreaTable.dbc
- uint32 killCount; // 4
+ uint64 killCount; // 4
} honorable_kill_at_area;
// ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA = 32
struct
{
uint32 mapID; // 3 Reference to Map.dbc
- uint32 count; // 4 Number of times that the arena must be won.
+ uint64 count; // 4 Number of times that the arena must be won.
} win_arena;
// ACHIEVEMENT_CRITERIA_TYPE_PLAY_ARENA = 33
@@ -245,14 +245,14 @@ struct AchievementCriteriaEntry
struct
{
uint32 itemID; // 3
- uint32 itemCount; // 4
+ uint64 itemCount; // 4
} own_item;
// ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA = 37
struct
{
uint32 unused; // 3
- uint32 count; // 4
+ uint64 count; // 4
} win_rated_arena;
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING = 38
@@ -265,35 +265,35 @@ struct AchievementCriteriaEntry
struct
{
uint32 teamtype; // 3 {2, 3, 5}
- uint32 teamrating; // 4
+ uint64 teamrating; // 4
} reach_team_rating;
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_PERSONAL_RATING = 39
struct
{
uint32 teamtype; // 3 {2, 3, 5}
- uint32 PersonalRating; // 4
+ uint64 PersonalRating; // 4
} highest_personal_rating;
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LEVEL = 40
struct
{
uint32 skillID; // 3
- uint32 skillLevel; // 4 apprentice=1, journeyman=2, expert=3, artisan=4, master=5, grand master=6
+ 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
- uint32 itemCount; // 4
+ uint64 itemCount; // 4
} use_item;
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM = 42
struct
{
uint32 itemID; // 3
- uint32 itemCount; // 4
+ uint64 itemCount; // 4
} loot_item;
// ACHIEVEMENT_CRITERIA_TYPE_EXPLORE_AREA = 43
@@ -314,28 +314,28 @@ struct AchievementCriteriaEntry
struct
{
uint32 unused; // 3
- uint32 numberOfSlots; // 4
+ uint64 numberOfSlots; // 4
} buy_bank_slot;
// ACHIEVEMENT_CRITERIA_TYPE_GAIN_REPUTATION = 46
struct
{
uint32 factionID; // 3
- uint32 reputationAmount; // 4 Total reputation amount, so 42000 = exalted
+ uint64 reputationAmount; // 4 Total reputation amount, so 42000 = exalted
} gain_reputation;
// ACHIEVEMENT_CRITERIA_TYPE_GAIN_EXALTED_REPUTATION= 47
struct
{
uint32 unused; // 3
- uint32 numberOfExaltedFactions; // 4
+ uint64 numberOfExaltedFactions; // 4
} gain_exalted_reputation;
// ACHIEVEMENT_CRITERIA_TYPE_VISIT_BARBER_SHOP = 48
struct
{
uint32 unused; // 3
- uint32 numberOfVisits; // 4
+ uint64 numberOfVisits; // 4
} visit_barber;
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_EPIC_ITEM = 49
@@ -343,34 +343,34 @@ struct AchievementCriteriaEntry
struct
{
uint32 itemSlot; // 3
- uint32 count; // 4
+ uint64 count; // 4
} equip_epic_item;
// ACHIEVEMENT_CRITERIA_TYPE_ROLL_NEED_ON_LOOT = 50
struct
{
uint32 rollValue; // 3
- uint32 count; // 4
+ uint64 count; // 4
} roll_need_on_loot;
// ACHIEVEMENT_CRITERIA_TYPE_ROLL_GREED_ON_LOOT = 51
struct
{
uint32 rollValue; // 3
- uint32 count; // 4
+ uint64 count; // 4
} roll_greed_on_loot;
// ACHIEVEMENT_CRITERIA_TYPE_HK_CLASS = 52
struct
{
uint32 classID; // 3
- uint32 count; // 4
+ uint64 count; // 4
} hk_class;
// ACHIEVEMENT_CRITERIA_TYPE_HK_RACE = 53
struct
{
uint32 raceID; // 3
- uint32 count; // 4
+ uint64 count; // 4
} hk_race;
// ACHIEVEMENT_CRITERIA_TYPE_DO_EMOTE = 54
@@ -378,7 +378,7 @@ struct AchievementCriteriaEntry
struct
{
uint32 emoteID; // 3 enum TextEmotes
- uint32 count; // 4 count of emotes, always required special target or requirements
+ 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
@@ -386,42 +386,42 @@ struct AchievementCriteriaEntry
struct
{
uint32 unused; // 3
- uint32 count; // 4
+ uint64 count; // 4
} healing_done;
// ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS = 56
struct
{
uint32 unused;
- uint32 killCount;
+ uint64 killCount;
} get_killing_blow;
// ACHIEVEMENT_CRITERIA_TYPE_EQUIP_ITEM = 57
struct
{
uint32 itemID; // 3
- uint32 count; // 4
+ uint64 count; // 4
} equip_item;
// ACHIEVEMENT_CRITERIA_TYPE_MONEY_FROM_QUEST_REWARD= 62
struct
{
uint32 unused; // 3
- uint32 goldInCopper; // 4
+ uint64 goldInCopper; // 4
} quest_reward_money;
// ACHIEVEMENT_CRITERIA_TYPE_LOOT_MONEY = 67
struct
{
uint32 unused; // 3
- uint32 goldInCopper; // 4
+ uint64 goldInCopper; // 4
} loot_money;
// ACHIEVEMENT_CRITERIA_TYPE_USE_GAMEOBJECT = 68
struct
{
uint32 goEntry; // 3
- uint32 useCount; // 4
+ uint64 useCount; // 4
} use_gameobject;
// ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL = 70
@@ -429,28 +429,28 @@ struct AchievementCriteriaEntry
struct
{
uint32 unused; // 3
- uint32 killCount; // 4
+ uint64 killCount; // 4
} special_pvp_kill;
// ACHIEVEMENT_CRITERIA_TYPE_FISH_IN_GAMEOBJECT = 72
struct
{
uint32 goEntry; // 3
- uint32 lootCount; // 4
+ uint64 lootCount; // 4
} fish_in_gameobject;
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILLLINE_SPELLS = 75
struct
{
uint32 skillLine; // 3
- uint32 spellCount; // 4
+ uint64 spellCount; // 4
} learn_skillline_spell;
// ACHIEVEMENT_CRITERIA_TYPE_WIN_DUEL = 76
struct
{
uint32 unused; // 3
- uint32 duelCount; // 4
+ uint64 duelCount; // 4
} win_duel;
// ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_POWER = 96
@@ -481,57 +481,55 @@ struct AchievementCriteriaEntry
struct
{
uint32 lootType; // 3 3=fishing, 2=pickpocket, 4=disentchant
- uint32 lootTypeCount; // 4
+ uint64 lootTypeCount; // 4
} loot_type;
// ACHIEVEMENT_CRITERIA_TYPE_LEARN_SKILL_LINE = 112
struct
{
uint32 skillLine; // 3
- uint32 spellCount; // 4
+ uint64 spellCount; // 4
} learn_skill_line;
// ACHIEVEMENT_CRITERIA_TYPE_EARN_HONORABLE_KILL = 113
struct
{
uint32 unused; // 3
- uint32 killCount; // 4
+ uint64 killCount; // 4
} honorable_kill;
struct
{
uint32 unused;
- uint32 dungeonsComplete;
+ uint64 dungeonsComplete;
} use_lfg;
struct
{
uint32 field3; // 3 main requirement
- uint32 count; // 4 main requirement count
+ uint64 count; // 4 main requirement count
} raw;
};
- //uint32 unk; // 5
-
struct
{
uint32 additionalRequirement_type;
uint32 additionalRequirement_value;
} additionalRequirements[MAX_CRITERIA_REQUIREMENTS];
- char* name; // 10 m_description_lang
- uint32 completionFlag; // 11 m_flags
- uint32 timedCriteriaStartType; // 12 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
+ 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; // 13 m_timer_asset_id Alway appears with timed events, used internally to start the achievement, store
- uint32 timeLimit; // 14 m_timer_time time limit in seconds
- uint32 showOrder; // 15 m_ui_order also used in achievement shift-links as index in state bitmask
- //uint32 unk1; // 16 only one value, still unknown
- //uint32 unk2; // 17 all zeros
- uint32 additionalConditionType[MAX_ADDITIONAL_CRITERIA_CONDITIONS]; // 18-20
- uint32 additionalConditionValue[MAX_ADDITIONAL_CRITERIA_CONDITIONS - 1]; // 21-22 WTF one column was cut off here in 4.3.4
+ 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
};
struct AreaTableEntry
diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
index 33aff1249d7..bea6d0bdd9a 100644
--- a/src/server/game/DataStores/DBCfmt.h
+++ b/src/server/game/DataStores/DBCfmt.h
@@ -25,7 +25,7 @@
char const Achievementfmt[] = "niixsxiixixxii";
const std::string CustomAchievementfmt = "pppaaaapapaapp";
const std::string CustomAchievementIndex = "ID";
-char const AchievementCriteriafmt[] = "niiiixiiiisiiiiixxiiiii";
+char const AchievementCriteriafmt[] = "niiiliiiisiiiiixxiiiiii";
char const AreaTableEntryfmt[] = "iiinixxxxxisiiiiiffixxxxxx";
char const AreaGroupEntryfmt[] = "niiiiiii";
char const AreaPOIEntryfmt[] = "niiiiiiiiiiiffixixxixx";
diff --git a/src/server/shared/DataStores/DBCFileLoader.cpp b/src/server/shared/DataStores/DBCFileLoader.cpp
index ab46bca9b72..f8c8693216d 100644
--- a/src/server/shared/DataStores/DBCFileLoader.cpp
+++ b/src/server/shared/DataStores/DBCFileLoader.cpp
@@ -90,8 +90,10 @@ bool DBCFileLoader::Load(const char* filename, const char* fmt)
for (uint32 i = 1; i < fieldCount; ++i)
{
fieldsOffset[i] = fieldsOffset[i - 1];
- if (fmt[i - 1] == 'b' || fmt[i - 1] == 'X') // byte fields
+ if (fmt[i - 1] == FT_BYTE || fmt[i - 1] == FT_NA_BYTE) // byte fields
fieldsOffset[i] += sizeof(uint8);
+ else if (fmt[i - 1] == FT_LONG)
+ fieldsOffset[i] += sizeof(uint64);
else // 4 byte fields (int32/float/strings)
fieldsOffset[i] += sizeof(uint32);
}
@@ -152,6 +154,9 @@ uint32 DBCFileLoader::GetFormatRecordSize(const char* format, int32* index_pos)
case FT_BYTE:
recordsize += sizeof(uint8);
break;
+ case FT_LONG:
+ recordsize += sizeof(uint64);
+ break;
case FT_NA:
case FT_NA_BYTE:
break;
@@ -242,6 +247,10 @@ char* DBCFileLoader::AutoProduceData(const char* format, uint32& records, char**
*((uint8*)(&dataTable[offset])) = getRecord(y).getUInt8(x);
offset += sizeof(uint8);
break;
+ case FT_LONG:
+ *((uint64*)(&dataTable[offset])) = getRecord(y).getUInt64(x);
+ offset += sizeof(uint64);
+ break;
case FT_STRING:
*((char**)(&dataTable[offset])) = NULL; // will replace non-empty or "" strings in AutoProduceStrings
offset += sizeof(char*);
@@ -288,6 +297,9 @@ char* DBCFileLoader::AutoProduceStrings(const char* format, char* dataTable)
case FT_BYTE:
offset += sizeof(uint8);
break;
+ case FT_LONG:
+ offset += sizeof(uint64);
+ break;
case FT_STRING:
{
// fill only not filled entries
diff --git a/src/server/shared/DataStores/DBCFileLoader.h b/src/server/shared/DataStores/DBCFileLoader.h
index 84ee6e93e68..f05e7800d3b 100644
--- a/src/server/shared/DataStores/DBCFileLoader.h
+++ b/src/server/shared/DataStores/DBCFileLoader.h
@@ -36,21 +36,26 @@ class DBCFileLoader
float getFloat(size_t field) const
{
assert(field < file.fieldCount);
- float val = *reinterpret_cast<float*>(offset+file.GetOffset(field));
+ float val = *reinterpret_cast<float*>(offset + file.GetOffset(field));
EndianConvert(val);
return val;
}
uint32 getUInt(size_t field) const
{
assert(field < file.fieldCount);
- uint32 val = *reinterpret_cast<uint32*>(offset+file.GetOffset(field));
+ uint32 val = *reinterpret_cast<uint32*>(offset + file.GetOffset(field));
EndianConvert(val);
return val;
}
uint8 getUInt8(size_t field) const
{
assert(field < file.fieldCount);
- return *reinterpret_cast<uint8*>(offset+file.GetOffset(field));
+ return *reinterpret_cast<uint8*>(offset + file.GetOffset(field));
+ }
+ uint64 getUInt64(size_t field) const
+ {
+ assert(field < file.fieldCount);
+ return *reinterpret_cast<uint64*>(offset + file.GetOffset(field));
}
const char *getString(size_t field) const
@@ -63,8 +68,8 @@ class DBCFileLoader
private:
Record(DBCFileLoader &file_, unsigned char *offset_): offset(offset_), file(file_) { }
- unsigned char *offset;
- DBCFileLoader &file;
+ unsigned char* offset;
+ DBCFileLoader& file;
friend class DBCFileLoader;
diff --git a/src/server/shared/DataStores/DBCStore.h b/src/server/shared/DataStores/DBCStore.h
index 9d5836fcf0b..055a8691a87 100644
--- a/src/server/shared/DataStores/DBCStore.h
+++ b/src/server/shared/DataStores/DBCStore.h
@@ -186,6 +186,10 @@ class DBCStorage
*reinterpret_cast<uint8*>(&sqlDataTable[offset]) = uint8(0);
offset += 1;
break;
+ case FT_LONG:
+ *reinterpret_cast<uint64*>(&sqlDataTable[offset]) = uint64(0);
+ offset += 8;
+ break;
case FT_STRING:
// Beginning of the pool - empty string
*reinterpret_cast<char**>(&sqlDataTable[offset]) = stringPoolList.back();
@@ -211,6 +215,10 @@ class DBCStorage
*reinterpret_cast<uint8*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt8();
offset += 1;
break;
+ case FT_LONG:
+ *reinterpret_cast<uint64*>(&sqlDataTable[offset]) = fields[sqlColumnNumber].GetUInt64();
+ offset += 8;
+ break;
case FT_STRING:
TC_LOG_ERROR("server.loading", "Unsupported data type in table '%s' at char %d", sql->sqlTableName.c_str(), columnNumber);
return false;
diff --git a/src/server/shared/Define.h b/src/server/shared/Define.h
index 0d62ccb4e83..1e2a9676cd5 100644
--- a/src/server/shared/Define.h
+++ b/src/server/shared/Define.h
@@ -89,16 +89,17 @@ typedef ACE_UINT8 uint8;
enum DBCFormer
{
- FT_NA='x', //not used or unknown, 4 byte size
- FT_NA_BYTE='X', //not used or unknown, byte
- FT_STRING='s', //char*
- FT_FLOAT='f', //float
- FT_INT='i', //uint32
- FT_BYTE='b', //uint8
- FT_SORT='d', //sorted by this field, field is not included
- FT_IND='n', //the same, but parsed to data
- FT_SQL_PRESENT='p', //Used in sql format to mark column present in sql dbc
- FT_SQL_ABSENT='a' //Used in sql format to mark column absent in sql dbc
+ FT_NA = 'x', //not used or unknown, 4 byte size
+ FT_NA_BYTE = 'X', //not used or unknown, byte
+ FT_STRING = 's', //char*
+ FT_FLOAT = 'f', //float
+ FT_INT = 'i', //uint32
+ FT_BYTE = 'b', //uint8
+ FT_LONG = 'l', //uint64
+ FT_SORT = 'd', //sorted by this field, field is not included
+ FT_IND = 'n', //the same, but parsed to data
+ FT_SQL_PRESENT = 'p', //Used in sql format to mark column present in sql dbc
+ FT_SQL_ABSENT = 'a' //Used in sql format to mark column absent in sql dbc
};
#endif //TRINITY_DEFINE_H