Core/Items: Item bonus generation improvements

* Pass ItemContext to item creation wherever possible
* Support scaling item levels with m+ keystone levels (not used currently)
* Fixed item link validation when client sends it as default uninitialized bonus list with context only
* Support scaling items depending on current active season (seasons not implemented)
* Implemented content tuning redirection
Port From (https://github.com/TrinityCore/TrinityCore/commit/0fb8765a6638fd947b59fce44d5c31251d0cdadd)
This commit is contained in:
hondacrx
2023-06-21 09:19:40 -04:00
parent 378b0ffccd
commit 49a07ebcce
30 changed files with 796 additions and 336 deletions
+1 -1
View File
@@ -337,7 +337,7 @@ namespace Game.Entities
public override float GetBlockPercent(uint attackerLevel)
{
float blockArmor = (float)m_activePlayerData.ShieldBlock;
float armorConstant = Global.DB2Mgr.EvaluateExpectedStat(ExpectedStatType.ArmorConstant, attackerLevel, -2, 0, Class.None);
float armorConstant = Global.DB2Mgr.EvaluateExpectedStat(ExpectedStatType.ArmorConstant, attackerLevel, -2, 0, Class.None, 0);
if ((blockArmor + armorConstant) == 0)
return 0;
+7 -8
View File
@@ -1209,8 +1209,6 @@ namespace Game.Entities
{
Log.outDebug(LogFilter.Player, "STORAGE: Creating initial item, itemId = {0}, count = {1}", itemId, amount);
var bonusListIDs = Global.DB2Mgr.GetDefaultItemBonusTree(itemId, context);
InventoryResult msg;
// attempt equip by one
while (amount > 0)
@@ -1219,8 +1217,7 @@ namespace Game.Entities
if (msg != InventoryResult.Ok)
break;
Item item = EquipNewItem(eDest, itemId, context, true);
item.SetBonuses(bonusListIDs);
EquipNewItem(eDest, itemId, context, true);
AutoUnequipOffhandIfNeed();
--amount;
}
@@ -1234,7 +1231,7 @@ namespace Game.Entities
msg = CanStoreNewItem(InventorySlots.Bag0, ItemConst.NullSlot, sDest, itemId, amount);
if (msg == InventoryResult.Ok)
{
StoreNewItem(sDest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId), null, context, bonusListIDs);
StoreNewItem(sDest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId), null, context);
return true; // stored
}
@@ -1242,18 +1239,20 @@ namespace Game.Entities
Log.outError(LogFilter.Player, "STORAGE: Can't equip or store initial item {0} for race {1} class {2}, error msg = {3}", itemId, GetRace(), GetClass(), msg);
return false;
}
public Item StoreNewItem(List<ItemPosCount> pos, uint itemId, bool update, uint randomBonusListId = 0, List<ObjectGuid> allowedLooters = null, ItemContext context = 0, List<uint> bonusListIDs = null, bool addToCollection = true)
{
uint count = 0;
foreach (var itemPosCount in pos)
count += itemPosCount.count;
Item item = Item.CreateItem(itemId, count, context, this);
Item item = Item.CreateItem(itemId, count, context, this, bonusListIDs == null);
if (item != null)
{
item.SetItemFlag(ItemFieldFlags.NewItem);
item.SetBonuses(bonusListIDs);
if (bonusListIDs != null)
item.SetBonuses(bonusListIDs);
item = StoreItem(pos, item, update);
@@ -6090,7 +6089,7 @@ namespace Game.Entities
InventoryResult msg = CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, item.itemid, item.count);
if (msg == InventoryResult.Ok)
{
Item newitem = StoreNewItem(dest, item.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context, item.BonusListIDs);
Item newitem = StoreNewItem(dest, item.itemid, true, item.randomBonusListId, item.GetAllowedLooters(), item.context);
if (ffaItem != null)
{
//freeforall case, notify only one player of the removal
+8 -8
View File
@@ -922,7 +922,7 @@ namespace Game.Entities
return false;
}
public void RewardQuestPackage(uint questPackageId, uint onlyItemId = 0)
public void RewardQuestPackage(uint questPackageId, ItemContext context, uint onlyItemId = 0)
{
bool hasFilteredQuestPackageReward = false;
var questPackageItems = Global.DB2Mgr.GetQuestPackageItems(questPackageId);
@@ -939,7 +939,7 @@ namespace Game.Entities
List<ItemPosCount> dest = new();
if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemQuantity) == InventoryResult.Ok)
{
Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(questPackageItem.ItemID));
Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(questPackageItem.ItemID), null, context);
SendNewItem(item, questPackageItem.ItemQuantity, true, false);
}
}
@@ -959,7 +959,7 @@ namespace Game.Entities
List<ItemPosCount> dest = new();
if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, questPackageItem.ItemID, questPackageItem.ItemQuantity) == InventoryResult.Ok)
{
Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(questPackageItem.ItemID));
Item item = StoreNewItem(dest, questPackageItem.ItemID, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(questPackageItem.ItemID), null, context);
SendNewItem(item, questPackageItem.ItemQuantity, true, false);
}
}
@@ -1020,7 +1020,7 @@ namespace Game.Entities
List<ItemPosCount> dest = new();
if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, itemId, quest.RewardItemCount[i]) == InventoryResult.Ok)
{
Item item = StoreNewItem(dest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId));
Item item = StoreNewItem(dest, itemId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(itemId), null, ItemContext.QuestReward);
SendNewItem(item, quest.RewardItemCount[i], true, false);
}
else if (quest.IsDFQuest())
@@ -1035,8 +1035,8 @@ namespace Game.Entities
{
if (quest.IsWorldQuest())
currencyGainSource = CurrencyGainSource.WorldQuestRewardIgnoreCaps;
currencyGainSource = CurrencyGainSource.QuestRewardIgnoreCaps;
else
currencyGainSource = CurrencyGainSource.QuestRewardIgnoreCaps;
}
else if (quest.IsDaily())
currencyGainSource = CurrencyGainSource.DailyQuestReward;
@@ -1058,7 +1058,7 @@ namespace Game.Entities
List<ItemPosCount> dest = new();
if (CanStoreNewItem(ItemConst.NullBag, ItemConst.NullSlot, dest, rewardId, quest.RewardChoiceItemCount[i]) == InventoryResult.Ok)
{
Item item = StoreNewItem(dest, rewardId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(rewardId));
Item item = StoreNewItem(dest, rewardId, true, ItemEnchantmentManager.GenerateItemRandomBonusListId(rewardId), null, ItemContext.QuestReward);
SendNewItem(item, quest.RewardChoiceItemCount[i], true, false);
}
}
@@ -1068,7 +1068,7 @@ namespace Game.Entities
// QuestPackageItem.db2
if (rewardProto != null && quest.PackageID != 0)
RewardQuestPackage(quest.PackageID, rewardId);
RewardQuestPackage(quest.PackageID, ItemContext.QuestReward, rewardId);
break;
case LootItemType.Currency:
if (CliDB.CurrencyTypesStorage.HasRecord(rewardId) && quest.GetRewChoiceItemsCount() != 0)