diff options
author | Ryan <roc13x@gmail.com> | 2017-09-15 20:23:41 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2017-09-15 21:23:41 +0200 |
commit | 115dffde983019acb1f167583b60f0ce1aaa90de (patch) | |
tree | 6713a964debd945ef472cdbe86320c330a1e6395 | |
parent | 6eb997394722fcd4b5248646b5abfa185a7ec58f (diff) |
Core/Items: Implement ItemLevelSelector.db2 (#20325)
ItemLevelSelector replaced ITEM_BONUS_ITEM_LEVEL_OVERRIDE in 7.2
-rw-r--r-- | sql/updates/hotfixes/master/2017_09_15_00_hotfixes.sql | 10 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.cpp | 3 | ||||
-rw-r--r-- | src/server/database/Database/Implementation/HotfixDatabase.h | 2 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2LoadInfo.h | 14 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Stores.cpp | 27 | ||||
-rw-r--r-- | src/server/game/DataStores/DB2Structure.h | 6 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 32 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.h | 2 |
9 files changed, 72 insertions, 26 deletions
diff --git a/sql/updates/hotfixes/master/2017_09_15_00_hotfixes.sql b/sql/updates/hotfixes/master/2017_09_15_00_hotfixes.sql new file mode 100644 index 00000000000..c3ad0b8de7f --- /dev/null +++ b/sql/updates/hotfixes/master/2017_09_15_00_hotfixes.sql @@ -0,0 +1,10 @@ +-- +-- Table structure for table `item_level_selector` +-- +DROP TABLE IF EXISTS `item_level_selector`; +CREATE TABLE `item_level_selector` ( + `ID` int(10) unsigned NOT NULL DEFAULT '0', + `ItemLevel` smallint(5) unsigned NOT NULL DEFAULT '0', + `VerifiedBuild` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`) +) ENGINE=MyISAM DEFAULT CHARSET=utf8; diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 930d215a354..425de74eda7 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -490,6 +490,9 @@ void HotfixDatabaseConnection::DoPrepareStatements() "RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, RequiredCurrency5, RequiredArenaSlot, RequiredFactionId, RequiredFactionStanding, " "RequirementFlags, RequiredAchievement FROM item_extended_cost ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemLevelSelector.db2 + PrepareStatement(HOTFIX_SEL_ITEM_LEVEL_SELECTOR, "SELECT ID, ItemLevel FROM item_level_selector ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemLimitCategory.db2 PrepareStatement(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name, Quantity, Flags FROM item_limit_category ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name_lang FROM item_limit_category_locale WHERE locale = ?", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 88d43f21476..6d987d0f1f2 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -274,6 +274,8 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_ITEM_EXTENDED_COST, + HOTFIX_SEL_ITEM_LEVEL_SELECTOR, + HOTFIX_SEL_ITEM_LIMIT_CATEGORY, HOTFIX_SEL_ITEM_LIMIT_CATEGORY_LOCALE, diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 8cd1be9c7b3..c37a2ab3aab 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -2356,6 +2356,20 @@ struct ItemExtendedCostLoadInfo } }; +struct ItemLevelSelectorLoadInfo +{ + static DB2LoadInfo const* Instance() + { + static DB2FieldMeta const fields[] = + { + { false, FT_INT, "ID" }, + { false, FT_SHORT, "ItemLevel" }, + }; + static DB2LoadInfo const loadInfo(&fields[0], std::extent<decltype(fields)>::value, ItemLevelSelectorMeta::Instance(), HOTFIX_SEL_ITEM_LEVEL_SELECTOR); + return &loadInfo; + } +}; + struct ItemLimitCategoryLoadInfo { static DB2LoadInfo const* Instance() diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index d8903360d80..d83ab0c88d4 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -140,6 +140,7 @@ DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore("ItemDi DB2Storage<ItemEffectEntry> sItemEffectStore("ItemEffect.db2", ItemEffectLoadInfo::Instance()); DB2Storage<ItemEntry> sItemStore("Item.db2", ItemLoadInfo::Instance()); DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore("ItemExtendedCost.db2", ItemExtendedCostLoadInfo::Instance()); +DB2Storage<ItemLevelSelectorEntry> sItemLevelSelectorStore("ItemLevelSelector.db2", ItemLevelSelectorLoadInfo::Instance()); DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore("ItemLimitCategory.db2", ItemLimitCategoryLoadInfo::Instance()); DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", ItemModifiedAppearanceLoadInfo::Instance()); DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseLoadInfo::Instance()); @@ -548,6 +549,7 @@ void DB2Manager::LoadStores(std::string const& dataPath, uint32 defaultLocale) LOAD_DB2(sItemEffectStore); LOAD_DB2(sItemStore); LOAD_DB2(sItemExtendedCostStore); + LOAD_DB2(sItemLevelSelectorStore); LOAD_DB2(sItemLimitCategoryStore); LOAD_DB2(sItemModifiedAppearanceStore); LOAD_DB2(sItemPriceBaseStore); @@ -1499,6 +1501,11 @@ uint32 DB2Manager::GetItemBonusListForItemLevelDelta(int16 delta) const std::set<uint32> DB2Manager::GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const { std::set<uint32> bonusListIDs; + + ItemSparseEntry const* proto = sItemSparseStore.LookupEntry(itemId); + if (!proto) + return bonusListIDs; + auto itemIdRange = _itemToBonusTree.equal_range(itemId); if (itemIdRange.first == itemIdRange.second) return bonusListIDs; @@ -1510,8 +1517,26 @@ std::set<uint32> DB2Manager::GetItemBonusTree(uint32 itemId, uint32 itemBonusTre continue; for (ItemBonusTreeNodeEntry const* bonusTreeNode : treeItr->second) - if (bonusTreeNode->BonusTreeModID == itemBonusTreeMod) + { + if (bonusTreeNode->BonusTreeModID != itemBonusTreeMod) + continue; + + if (bonusTreeNode->BonusListID) + { bonusListIDs.insert(bonusTreeNode->BonusListID); + } + else if (bonusTreeNode->ItemLevelSelectorID) + { + ItemLevelSelectorEntry const* selector = sItemLevelSelectorStore.LookupEntry(bonusTreeNode->ItemLevelSelectorID); + if (!selector) + continue; + + int16 delta = int16(selector->ItemLevel) - proto->ItemLevel; + + if (uint32 bonus = GetItemBonusListForItemLevelDelta(delta)) + bonusListIDs.insert(bonus); + } + } } return bonusListIDs; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 325b5108673..55e7241a05f 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -1458,6 +1458,12 @@ struct ItemExtendedCostEntry uint8 RequiredAchievement; }; +struct ItemLevelSelectorEntry +{ + uint32 ID; + uint16 ItemLevel; +}; + struct ItemLimitCategoryEntry { uint32 ID; diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index cdb52accfbf..c7d09e982e8 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -713,7 +713,7 @@ enum ItemBonusType ITEM_BONUS_SCALING_STAT_DISTRIBUTION = 11, ITEM_BONUS_DISENCHANT_LOOT_ID = 12, ITEM_BONUS_SCALING_STAT_DISTRIBUTION_2 = 13, - ITEM_BONUS_ITEM_LEVEL_OVERRIDE = 14, + ITEM_BONUS_ITEM_LEVEL_CAN_INCREASE = 14, // Displays a + next to item level indicating it can warforge ITEM_BONUS_RANDOM_ENCHANTMENT = 15, // Responsible for showing "<Random additional stats>" or "+%d Rank Random Minor Trait" in the tooltip before item is obtained ITEM_BONUS_BONDING = 16, ITEM_BONUS_RELIC_TYPE = 17 diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 20fc96a2394..abb36054914 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -2170,21 +2170,18 @@ uint32 Item::GetItemLevel(Player const* owner) const return MIN_ITEM_LEVEL; uint32 itemLevel = stats->GetBaseItemLevel(); - if (_bonusData.HasItemLevelBonus || !_bonusData.ItemLevelOverride) + if (ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(GetScalingStatDistribution())) { - if (ScalingStatDistributionEntry const* ssd = sScalingStatDistributionStore.LookupEntry(GetScalingStatDistribution())) - { - uint32 level = owner->getLevel(); - if (uint32 fixedLevel = GetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL)) - level = fixedLevel; - if (uint32 heirloomIlvl = uint32(sDB2Manager.GetCurveValueAt(ssd->ItemLevelCurveID, level))) - itemLevel = heirloomIlvl; - } - - itemLevel += _bonusData.ItemLevelBonus; + uint32 level = owner->getLevel(); + if (uint32 fixedLevel = GetModifier(ITEM_MODIFIER_SCALING_STAT_DISTRIBUTION_FIXED_LEVEL)) + level = fixedLevel; + else + level = std::min(std::max(level, ssd->MinLevel), ssd->MaxLevel); + if (uint32 heirloomIlvl = uint32(sDB2Manager.GetCurveValueAt(ssd->ItemLevelCurveID, level))) + itemLevel = heirloomIlvl; } - else - itemLevel = _bonusData.ItemLevelOverride; + + itemLevel += _bonusData.ItemLevelBonus; if (ItemUpgradeEntry const* upgrade = sItemUpgradeStore.LookupEntry(GetModifier(ITEM_MODIFIER_UPGRADE_ID))) itemLevel += upgrade->ItemLevelBonus; @@ -2509,13 +2506,11 @@ void BonusData::Initialize(ItemTemplate const* proto) AppearanceModID = 0; RepairCostMultiplier = 1.0f; ScalingStatDistribution = proto->GetScalingStatDistribution(); - ItemLevelOverride = 0; RelicType = -1; HasItemLevelBonus = false; _state.AppearanceModPriority = std::numeric_limits<int32>::max(); _state.ScalingStatDistributionPriority = std::numeric_limits<int32>::max(); - _state.ItemLevelOverridePriority = std::numeric_limits<int32>::max(); _state.HasQualityBonus = false; } @@ -2599,13 +2594,6 @@ void BonusData::AddBonus(uint32 type, int32 const (&values)[2]) _state.ScalingStatDistributionPriority = values[1]; } break; - case ITEM_BONUS_ITEM_LEVEL_OVERRIDE: - if (values[1] < _state.ItemLevelOverridePriority) - { - ItemLevelOverride = static_cast<uint32>(values[0]); - _state.ItemLevelOverridePriority = values[1]; - } - break; case ITEM_BONUS_BONDING: Bonding = ItemBondingType(values[0]); break; diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index 84e3e0f200a..b1721ed98a7 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -86,7 +86,6 @@ struct BonusData uint32 AppearanceModID; float RepairCostMultiplier; uint32 ScalingStatDistribution; - uint32 ItemLevelOverride; uint32 GemItemLevelBonus[MAX_ITEM_PROTO_SOCKETS]; int32 GemRelicType[MAX_ITEM_PROTO_SOCKETS]; uint16 GemRelicRankBonus[MAX_ITEM_PROTO_SOCKETS]; @@ -102,7 +101,6 @@ private: { int32 AppearanceModPriority; int32 ScalingStatDistributionPriority; - int32 ItemLevelOverridePriority; bool HasQualityBonus; } _state; }; |