aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/DB2Stores.h2
-rw-r--r--src/server/game/DataStores/DBCEnums.h18
-rw-r--r--src/server/game/Entities/Item/Item.cpp25
-rw-r--r--src/server/game/Entities/Item/Item.h5
-rw-r--r--src/server/game/Entities/Player/Player.cpp4
5 files changed, 45 insertions, 9 deletions
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index f5bef9577af..c670211c7e0 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -153,7 +153,6 @@ TC_GAME_API extern DB2Storage<ItemDamageTwoHandEntry> sItemDamageT
TC_GAME_API extern DB2Storage<ItemDamageTwoHandCasterEntry> sItemDamageTwoHandCasterStore;
TC_GAME_API extern DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore;
TC_GAME_API extern DB2Storage<ItemEffectEntry> sItemEffectStore;
-TC_GAME_API extern DB2Storage<ItemNameDescriptionEntry> sItemNameDescriptionStore;
TC_GAME_API extern DB2Storage<ItemEntry> sItemStore;
TC_GAME_API extern DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore;
TC_GAME_API extern DB2Storage<ItemLevelSelectorEntry> sItemLevelSelectorStore;
@@ -162,6 +161,7 @@ TC_GAME_API extern DB2Storage<ItemLevelSelectorQualitySetEntry> sItemLevelSe
TC_GAME_API extern DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore;
TC_GAME_API extern DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore;
TC_GAME_API extern DB2Storage<ItemModifiedAppearanceExtraEntry> sItemModifiedAppearanceExtraStore;
+TC_GAME_API extern DB2Storage<ItemNameDescriptionEntry> sItemNameDescriptionStore;
TC_GAME_API extern DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore;
TC_GAME_API extern DB2Storage<ItemSearchNameEntry> sItemSearchNameStore;
TC_GAME_API extern DB2Storage<ItemSetEntry> sItemSetStore;
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 542470a7bbf..00ad0d2a5d2 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -1206,20 +1206,28 @@ enum ItemBonusType
ITEM_BONUS_RELIC_TYPE = 17,
ITEM_BONUS_OVERRIDE_REQUIRED_LEVEL = 18,
ITEM_BONUS_AZERITE_TIER_UNLOCK_SET = 19,
- ITEM_BONUS_SCRAPPING_LOOT_ID = 20,
+ ITEM_BONUS_SCRAPPING_LOOT_ID = 20, /*NYI*/
ITEM_BONUS_OVERRIDE_CAN_DISENCHANT = 21,
ITEM_BONUS_OVERRIDE_CAN_SCRAP = 22,
ITEM_BONUS_ITEM_EFFECT_ID = 23,
- ITEM_BONUS_MODIFIED_CRAFTING_STAT = 25,
+ ITEM_BONUS_MODIFIED_CRAFTING_STAT = 25, /*NYI*/
ITEM_BONUS_REQUIRED_LEVEL_CURVE = 27,
+ ITEM_BONUS_ICON_FILE_DATA_ID = 28,
ITEM_BONUS_DESCRIPTION_TEXT = 30, // Item description
ITEM_BONUS_OVERRIDE_NAME = 31, // ItemNameDescription id
- ITEM_BONUS_ITEM_BONUS_LIST_GROUP = 34,
+ ITEM_BONUS_UPGRADE_SEQUENCE_VALUE = 33, /*NYI*/
+ ITEM_BONUS_ITEM_BONUS_LIST_GROUP = 34, /*NYI*/
ITEM_BONUS_ITEM_LIMIT_CATEGORY = 35,
ITEM_BONUS_PVP_ITEM_LEVEL_INCREMENT = 36,
- ITEM_BONUS_ITEM_CONVERSION = 37,
- ITEM_BONUS_ITEM_HISTORY_SLOT = 38,
+ ITEM_BONUS_ITEM_CONVERSION = 37, /*NYI*/
+ ITEM_BONUS_ITEM_HISTORY_SLOT = 38, /*NYI*/
+ ITEM_BONUS_OVERRIDE_CAN_SALVAGE = 39,
+ ITEM_BONUS_OVERRIDE_CAN_RECRAFT = 41,
+ ITEM_BONUS_ITEM_LEVEL_BASE = 42,
ITEM_BONUS_PVP_ITEM_LEVEL_BASE = 43,
+ ITEM_BONUS_COSMETIC_STAT = 44,
+ ITEM_BONUS_OVERRIDE_DESCRIPTION_COLOR = 45, // Overrides color of item description and upgrade track if TimeEvent from value[1] has passed
+ ITEM_BONUS_OVERRIDE_CANNOT_TRADE_BOP = 46,
ITEM_BONUS_BONDING_WITH_PRIORITY = 47,
};
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 6df3558d66b..0dc621bd8ce 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -1588,7 +1588,7 @@ void Item::SetGem(uint16 slot, ItemDynamicFieldGems const* gem, uint32 gemScalin
for (uint16 bonusListId : gem->BonusListIDs)
gemBonus.AddBonusList(bonusListId);
- uint32 gemBaseItemLevel = gemTemplate->GetBaseItemLevel();
+ uint32 gemBaseItemLevel = gemBonus.ItemLevel;
if (gemBonus.PlayerLevelToItemLevelCurveId)
if (uint32 scaledIlvl = uint32(sDB2Manager.GetCurveValueAt(gemBonus.PlayerLevelToItemLevelCurveId, gemScalingLevel)))
gemBaseItemLevel = scaledIlvl;
@@ -2323,7 +2323,7 @@ uint32 Item::GetItemLevel(ItemTemplate const* itemTemplate, BonusData const& bon
if (!itemTemplate)
return MIN_ITEM_LEVEL;
- uint32 itemLevel = itemTemplate->GetBaseItemLevel();
+ uint32 itemLevel = bonusData.ItemLevel;
if (AzeriteLevelInfoEntry const* azeriteLevelInfo = sAzeriteLevelInfoStore.LookupEntry(azeriteLevel))
itemLevel = azeriteLevelInfo->ItemLevel;
@@ -2897,6 +2897,7 @@ std::string Item::GetDebugInfo() const
void BonusData::Initialize(ItemTemplate const* proto)
{
Quality = proto->GetQuality();
+ ItemLevel = proto->GetBaseItemLevel();
ItemLevelBonus = 0;
RequiredLevel = proto->GetBaseRequiredLevel();
for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i)
@@ -2945,6 +2946,9 @@ void BonusData::Initialize(ItemTemplate const* proto)
CanDisenchant = !proto->HasFlag(ITEM_FLAG_NO_DISENCHANT);
CanScrap = proto->HasFlag(ITEM_FLAG4_SCRAPABLE);
+ CanSalvage = !proto->HasFlag(ITEM_FLAG4_NO_SALVAGE);
+ CanRecraft = proto->HasFlag(ITEM_FLAG4_RECRAFTABLE);
+ CannotTradeBindOnPickup = proto->HasFlag(ITEM_FLAG2_NO_TRADE_BIND_ON_ACQUIRE);
_state.SuffixPriority = std::numeric_limits<int32>::max();
_state.AppearanceModPriority = std::numeric_limits<int32>::max();
@@ -2952,6 +2956,7 @@ void BonusData::Initialize(ItemTemplate const* proto)
_state.ScalingStatDistributionPriority = std::numeric_limits<int32>::max();
_state.AzeriteTierUnlockSetPriority = std::numeric_limits<int32>::max();
_state.RequiredLevelCurvePriority = std::numeric_limits<int32>::max();
+ _state.ItemLevelPriority = std::numeric_limits<int32>::max();
_state.PvpItemLevelPriority = std::numeric_limits<int32>::max();
_state.BondingPriority = std::numeric_limits<int32>::max();
_state.HasQualityBonus = false;
@@ -3102,6 +3107,19 @@ void BonusData::AddBonus(uint32 type, std::array<int32, 4> const& values)
case ITEM_BONUS_PVP_ITEM_LEVEL_INCREMENT:
PvpItemLevelBonus += values[0];
break;
+ case ITEM_BONUS_OVERRIDE_CAN_SALVAGE:
+ CanSalvage = values[0] != 0;
+ break;
+ case ITEM_BONUS_OVERRIDE_CAN_RECRAFT:
+ CanRecraft = values[0] != 0;
+ break;
+ case ITEM_BONUS_ITEM_LEVEL_BASE:
+ if (values[1] < _state.ItemLevelPriority)
+ {
+ ItemLevel = values[0];
+ _state.ItemLevelPriority = values[1];
+ }
+ break;
case ITEM_BONUS_PVP_ITEM_LEVEL_BASE:
if (values[1] < _state.PvpItemLevelPriority)
{
@@ -3109,6 +3127,9 @@ void BonusData::AddBonus(uint32 type, std::array<int32, 4> const& values)
_state.PvpItemLevelPriority = values[1];
}
break;
+ case ITEM_BONUS_OVERRIDE_CANNOT_TRADE_BOP:
+ CannotTradeBindOnPickup = values[0] != 0;
+ break;
case ITEM_BONUS_BONDING_WITH_PRIORITY:
if (values[1] < _state.BondingPriority)
{
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index d7bb941284d..f1815c0c337 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -60,6 +60,7 @@ extern int32 const ItemTransmogrificationSlots[MAX_INVTYPE];
struct BonusData
{
uint32 Quality;
+ uint32 ItemLevel;
int32 ItemLevelBonus;
int32 RequiredLevel;
int32 ItemStatType[MAX_ITEM_PROTO_STATS];
@@ -87,7 +88,10 @@ struct BonusData
uint32 LimitCategory;
bool CanDisenchant;
bool CanScrap;
+ bool CanSalvage;
+ bool CanRecraft;
bool HasFixedLevel;
+ bool CannotTradeBindOnPickup;
void Initialize(ItemTemplate const* proto);
void Initialize(WorldPackets::Item::ItemInstance const& itemInstance);
@@ -103,6 +107,7 @@ private:
int32 ScalingStatDistributionPriority;
int32 AzeriteTierUnlockSetPriority;
int32 RequiredLevelCurvePriority;
+ int32 ItemLevelPriority;
int32 PvpItemLevelPriority;
int32 BondingPriority;
bool HasQualityBonus;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index f8ab0096a05..fbc391ceff6 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -11374,7 +11374,9 @@ Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool updat
UpdateCriteria(CriteriaType::ObtainAnyItem, itemId, count);
UpdateCriteria(CriteriaType::AcquireItem, itemId, count);
- if (allowedLooters.size() > 1 && item->GetTemplate()->GetMaxStackSize() == 1 && item->IsSoulBound())
+ if (allowedLooters.size() > 1 && item->IsSoulBound()
+ && (item->GetTemplate()->GetMaxStackSize() == 1 || item->GetTemplate()->HasFlag(ITEM_FLAG2_CAN_TRADE_BIND_ON_ACQUIRE))
+ && !item->GetBonus()->CannotTradeBindOnPickup)
{
item->SetSoulboundTradeable(allowedLooters);
AddTradeableItem(item);