diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 3 | ||||
| -rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 22 | ||||
| -rw-r--r-- | src/server/game/DataStores/DB2fmt.h | 1 | ||||
| -rwxr-xr-x | src/server/game/Globals/ObjectMgr.cpp | 41 |
5 files changed, 49 insertions, 24 deletions
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 77d16501415..2db85542132 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -25,8 +25,9 @@ #include <map> DB2Storage <ItemEntry> sItemStore(Itemfmt); -DB2Storage <ItemSparseEntry> sItemSparseStore (ItemSparsefmt); +DB2Storage <ItemCurrencyCostEntry> sItemCurrencyCostStore(ItemCurrencyCostfmt); DB2Storage <ItemExtendedCostEntry> sItemExtendedCostStore(ItemExtendedCostEntryfmt); +DB2Storage <ItemSparseEntry> sItemSparseStore (ItemSparsefmt); typedef std::list<std::string> StoreProblemList1; @@ -86,6 +87,7 @@ void LoadDB2Stores(const std::string& dataPath) uint32 availableDb2Locales = 0xFFFFFFFF; LoadDB2(availableDb2Locales, bad_db2_files, sItemStore, db2Path, "Item.db2"); + LoadDB2(availableDb2Locales, bad_db2_files, sItemCurrencyCostStore, db2Path, "ItemCurrencyCost.db2"); LoadDB2(availableDb2Locales, bad_db2_files, sItemSparseStore, db2Path, "Item-sparse.db2"); LoadDB2(availableDb2Locales, bad_db2_files, sItemExtendedCostStore, db2Path, "ItemExtendedCost.db2"); // error checks @@ -115,4 +117,4 @@ void LoadDB2Stores(const std::string& dataPath) sLog->outString(">> Initialized %d DB2 data stores.", DB2FilesCount); sLog->outString(); -}
\ No newline at end of file +} diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index e60892e05eb..6cf719da70b 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -25,8 +25,9 @@ #include <list> extern DB2Storage <ItemEntry> sItemStore; -extern DB2Storage <ItemSparseEntry> sItemSparseStore; +extern DB2Storage <ItemCurrencyCostEntry> sItemCurrencyCostStore; extern DB2Storage <ItemExtendedCostEntry> sItemExtendedCostStore; +extern DB2Storage <ItemSparseEntry> sItemSparseStore; void LoadDB2Stores(const std::string& dataPath); diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 1f455eec0c2..23bf8339c0d 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -33,14 +33,20 @@ // Structures used to access raw DB2 data and required packing to portability struct ItemEntry { - uint32 ID; // 0 - uint32 Class; // 1 - uint32 SubClass; // 2 - int32 Unk0; // 3 - int32 Material; // 4 - uint32 DisplayId; // 5 - uint32 InventoryType; // 6 - uint32 Sheath; // 7 + uint32 ID; // 0 + uint32 Class; // 1 + uint32 SubClass; // 2 + int32 Unk0; // 3 + int32 Material; // 4 + uint32 DisplayId; // 5 + uint32 InventoryType; // 6 + uint32 Sheath; // 7 +}; + +struct ItemCurrencyCostEntry +{ + uint32 Id; + uint32 ItemId; }; struct ItemSparseEntry diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h index 435309cbae4..ed48443d543 100644 --- a/src/server/game/DataStores/DB2fmt.h +++ b/src/server/game/DataStores/DB2fmt.h @@ -19,6 +19,7 @@ #define TRINITY_DB2SFRM_H const char Itemfmt[]="niiiiiii"; +const char ItemCurrencyCostfmt[]="xn"; const char ItemSparsefmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisssssiiiiiiiiiiiiiiiiiiiiiiifiiifii"; const char ItemExtendedCostEntryfmt[]="nxxiiiiiiiiiiiixiiiiiiiiiixxxxx"; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 8a47e91b32b..bac87dd1f25 100755 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -2194,27 +2194,44 @@ uint32 FillItemArmor(uint32 itemlevel, uint32 itemClass, uint32 itemSubclass, ui return uint32(shield->Value[quality] + 0.5f); } -void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, uint32 itemClass, uint32 quality, uint32 itemLevel) +void FillDisenchantFields(uint32* disenchantID, uint32* requiredDisenchantSkill, ItemTemplate const& itemTemplate) { + *disenchantID = 0; + *(int32*)requiredDisenchantSkill = -1; + if ((itemTemplate.Flags & (ITEM_PROTO_FLAG_CONJURED | ITEM_PROTO_FLAG_UNK6)) || + itemTemplate.Bonding == BIND_QUEST_ITEM || itemTemplate.Area || itemTemplate.Map || + itemTemplate.Stackable > 1 || + !(itemTemplate.SellPrice || sItemCurrencyCostStore.LookupEntry(itemTemplate.ItemId))) + return; + for (uint32 i = 0; i < sItemDisenchantLootStore.GetNumRows(); ++i) { ItemDisenchantLootEntry const* disenchant = sItemDisenchantLootStore.LookupEntry(i); if (!disenchant) continue; - if (disenchant->ItemClass == itemClass && - disenchant->ItemQuality == quality && - disenchant->MinItemLevel <= itemLevel && - disenchant->MaxItemLevel >= itemLevel) + if (disenchant->ItemClass == itemTemplate.Class && + disenchant->ItemQuality == itemTemplate.Quality && + disenchant->MinItemLevel <= itemTemplate.ItemLevel && + disenchant->MaxItemLevel >= itemTemplate.ItemLevel) { + // extra check for epics in range 90 - 99 + if (disenchant->MinItemLevel < 90) + { + if (itemTemplate.RequiredLevel > 60 || itemTemplate.RequiredSkillRank > 300) + continue; + } + else + { + if (itemTemplate.RequiredLevel <= 60 || itemTemplate.RequiredSkillRank <= 300) + continue; + } + *disenchantID = disenchant->Id; *requiredDisenchantSkill = disenchant->RequiredDisenchantSkill; return; } } - - *disenchantID = 0; - *(int32*)requiredDisenchantSkill = -1; } void ObjectMgr::LoadItemTemplates() @@ -2314,8 +2331,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.socketBonus = sparse->SocketBonus; itemTemplate.GemProperties = sparse->GemProperties; - FillDisenchantFields(&itemTemplate.DisenchantID, &itemTemplate.RequiredDisenchantSkill, - db2Data->Class, sparse->Quality, sparse->ItemLevel); + FillDisenchantFields(&itemTemplate.DisenchantID, &itemTemplate.RequiredDisenchantSkill, itemTemplate); itemTemplate.ArmorDamageModifier = sparse->ArmorDamageModifier; itemTemplate.Duration = sparse->Duration; @@ -2463,8 +2479,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.socketBonus = fields[123].GetUInt32(); itemTemplate.GemProperties = fields[124].GetUInt32(); - FillDisenchantFields(&itemTemplate.DisenchantID, &itemTemplate.RequiredDisenchantSkill, - itemTemplate.Class, itemTemplate.Quality, itemTemplate.ItemLevel); + FillDisenchantFields(&itemTemplate.DisenchantID, &itemTemplate.RequiredDisenchantSkill, itemTemplate); itemTemplate.ArmorDamageModifier = fields[125].GetFloat(); itemTemplate.Duration = fields[126].GetUInt32(); @@ -3589,7 +3604,7 @@ void ObjectMgr::LoadQuests() QueryResult result = WorldDatabase.Query("SELECT " //0 1 2 3 4 5 6 7 8 9 10 11 12 "Id, Method, Level, MinLevel, MaxLevel, ZoneOrSort, Type, SuggestedPlayers, LimitTime, RequiredClasses, RequiredRaces, RequiredSkillId, RequiredSkillPoints, " - // 13 14 15 16 17 18 19 20 + // 13 14 15 16 17 18 19 20 "RequiredFactionId1, RequiredFactionId2, RequiredFactionValue1, RequiredFactionValue2, RequiredMinRepFaction, RequiredMaxRepFaction, RequiredMinRepValue, RequiredMaxRepValue, " // 21 22 23 24 25 26 27 28 29 30 31 "PrevQuestId, NextQuestId, ExclusiveGroup, NextQuestIdChain, RewardXPId, RewardOrRequiredMoney, RewardMoneyMaxLevel, RewardSpell, RewardSpellCast, RewardHonor, RewardHonorMultiplier, " |
