mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Items: Implemented new item bonus types: ITEM_BONUS_OVERRIDE_CAN_SALVAGE, ITEM_BONUS_OVERRIDE_CAN_RECRAFT, ITEM_BONUS_OVERRIDE_CANNOT_TRADE_BOP and ITEM_BONUS_ITEM_LEVEL_BASE
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user