Core/Items: Implement ItemLevelSelector.db2 (#20325)

ItemLevelSelector replaced ITEM_BONUS_ITEM_LEVEL_OVERRIDE in 7.2
This commit is contained in:
Ryan
2017-09-15 20:23:41 +01:00
committed by Shauren
parent 6eb9973947
commit 115dffde98
9 changed files with 72 additions and 26 deletions
@@ -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;
@@ -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);
@@ -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,
+14
View File
@@ -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()
+26 -1
View File
@@ -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;
@@ -1458,6 +1458,12 @@ struct ItemExtendedCostEntry
uint8 RequiredAchievement;
};
struct ItemLevelSelectorEntry
{
uint32 ID;
uint16 ItemLevel;
};
struct ItemLimitCategoryEntry
{
uint32 ID;
+1 -1
View File
@@ -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
+10 -22
View File
@@ -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;
-2
View File
@@ -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;
};