diff options
-rw-r--r-- | src/server/game/Achievements/AchievementMgr.cpp | 7 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCStructure.h | 118 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCfmt.h | 2 | ||||
-rw-r--r-- | src/server/shared/DataStores/DBCFileLoader.cpp | 14 | ||||
-rw-r--r-- | src/server/shared/DataStores/DBCFileLoader.h | 15 | ||||
-rw-r--r-- | src/server/shared/DataStores/DBCStore.h | 8 | ||||
-rw-r--r-- | src/server/shared/Define.h | 21 |
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 |