diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/DataStores/DB2Stores.h | 2 | ||||
| -rw-r--r-- | src/server/game/DataStores/DBCEnums.h | 18 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 25 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/Item.h | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 4 |
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); |
