aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/hotfixes/master/2017_09_15_00_hotfixes.sql10
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp3
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h2
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h14
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp27
-rw-r--r--src/server/game/DataStores/DB2Structure.h6
-rw-r--r--src/server/game/DataStores/DBCEnums.h2
-rw-r--r--src/server/game/Entities/Item/Item.cpp32
-rw-r--r--src/server/game/Entities/Item/Item.h2
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;
};