mirror of
https://github.com/araxiaonline/TrinityCore.git
synced 2026-06-21 07:22:02 -04:00
Core/Items: Implement ItemLevelSelector.db2 (#20325)
ItemLevelSelector replaced ITEM_BONUS_ITEM_LEVEL_OVERRIDE in 7.2
This commit is contained in:
@@ -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,
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user