Core/Items: Fixed generating default bonuses based on context

Port From (https://github.com/TrinityCore/TrinityCore/commit/e5a6552abcbf0f179aebb67751527242968522f7)
This commit is contained in:
hondacrx
2020-06-10 14:35:32 -04:00
parent d09ddf2032
commit dc66cc54cd
3 changed files with 106 additions and 94 deletions
+2 -1
View File
@@ -412,7 +412,8 @@ namespace Framework.Constants
WorldQuest12 = 54, WorldQuest12 = 54,
WorldQuest13 = 55, WorldQuest13 = 55,
PvpRankedJackpot = 56, PvpRankedJackpot = 56,
TournamentRealm = 57 TournamentRealm = 57,
Relinquished = 58
} }
public enum ItemEnchantmentType : byte public enum ItemEnchantmentType : byte
+44 -33
View File
@@ -257,16 +257,8 @@ namespace Game.DataStorage
CliDB.ItemBonusListLevelDeltaStorage.Clear(); CliDB.ItemBonusListLevelDeltaStorage.Clear();
foreach (var key in CliDB.ItemBonusTreeNodeStorage.Keys) foreach (var bonusTreeNode in CliDB.ItemBonusTreeNodeStorage.Values)
{ _itemBonusTrees.Add(bonusTreeNode.ParentItemBonusTreeID, bonusTreeNode);
ItemBonusTreeNodeRecord bonusTreeNode = CliDB.ItemBonusTreeNodeStorage[key];
uint bonusTreeId = bonusTreeNode.ParentItemBonusTreeID;
while (bonusTreeNode != null)
{
_itemBonusTrees.Add(bonusTreeId, bonusTreeNode);
bonusTreeNode = CliDB.ItemBonusTreeNodeStorage.LookupByKey(bonusTreeNode.ChildItemBonusTreeID);
}
}
CliDB.ItemBonusTreeNodeStorage.Clear(); CliDB.ItemBonusTreeNodeStorage.Clear();
@@ -1221,24 +1213,21 @@ namespace Game.DataStorage
return _itemLevelDeltaToBonusListContainer.LookupByKey(delta); return _itemLevelDeltaToBonusListContainer.LookupByKey(delta);
} }
void VisitItemBonusTree(uint itemId, Action<ItemBonusTreeNodeRecord> visitor) void VisitItemBonusTree(uint itemBonusTreeId, bool visitChildren, Action<ItemBonusTreeNodeRecord> visitor)
{ {
var itemIdRange = _itemToBonusTree.LookupByKey(itemId); var bonusTreeNodeList = _itemBonusTrees.LookupByKey(itemBonusTreeId);
if (itemIdRange.Empty()) if (bonusTreeNodeList.Empty())
return; return;
foreach (var itemTreeId in itemIdRange) foreach (var bonusTreeNode in bonusTreeNodeList)
{ {
var treeList = _itemBonusTrees.LookupByKey(itemTreeId);
if (treeList.Empty())
continue;
foreach (ItemBonusTreeNodeRecord bonusTreeNode in treeList)
visitor(bonusTreeNode); visitor(bonusTreeNode);
if (visitChildren && bonusTreeNode.ChildItemBonusTreeID != 0)
VisitItemBonusTree(bonusTreeNode.ChildItemBonusTreeID, true, visitor);
} }
} }
public List<uint> GetItemBonusTree(uint itemId, ItemContext itemContext) public List<uint> GetDefaultItemBonusTree(uint itemId, ItemContext itemContext)
{ {
List<uint> bonusListIDs = new List<uint>(); List<uint> bonusListIDs = new List<uint>();
@@ -1246,9 +1235,27 @@ namespace Game.DataStorage
if (proto == null) if (proto == null)
return bonusListIDs; return bonusListIDs;
VisitItemBonusTree(itemId, bonusTreeNode => var itemIdRange = _itemToBonusTree.LookupByKey(itemId);
if (itemIdRange == null)
return bonusListIDs;
ushort itemLevelSelectorId = 0;
foreach (var itemBonusTreeId in itemIdRange)
{ {
if ((ItemContext)bonusTreeNode.ItemContext != itemContext) uint matchingNodes = 0;
VisitItemBonusTree(itemBonusTreeId, false, bonusTreeNode =>
{
if ((ItemContext)bonusTreeNode.ItemContext == ItemContext.None || itemContext == (ItemContext)bonusTreeNode.ItemContext)
++matchingNodes;
});
if (matchingNodes != 1)
continue;
VisitItemBonusTree(itemBonusTreeId, true, bonusTreeNode =>
{
ItemContext requiredContext = (ItemContext)bonusTreeNode.ItemContext != ItemContext.ForceToNone ? (ItemContext)bonusTreeNode.ItemContext : ItemContext.None;
if ((ItemContext)bonusTreeNode.ItemContext != ItemContext.None && itemContext != requiredContext)
return; return;
if (bonusTreeNode.ChildItemBonusListID != 0) if (bonusTreeNode.ChildItemBonusListID != 0)
@@ -1257,10 +1264,13 @@ namespace Game.DataStorage
} }
else if (bonusTreeNode.ChildItemLevelSelectorID != 0) else if (bonusTreeNode.ChildItemLevelSelectorID != 0)
{ {
ItemLevelSelectorRecord selector = CliDB.ItemLevelSelectorStorage.LookupByKey(bonusTreeNode.ChildItemLevelSelectorID); itemLevelSelectorId = bonusTreeNode.ChildItemLevelSelectorID;
if (selector == null) }
return; });
}
ItemLevelSelectorRecord selector = CliDB.ItemLevelSelectorStorage.LookupByKey(itemLevelSelectorId);
if (selector != null)
{
short delta = (short)(selector.MinItemLevel - proto.ItemLevel); short delta = (short)(selector.MinItemLevel - proto.ItemLevel);
uint bonus = GetItemBonusListForItemLevelDelta(delta); uint bonus = GetItemBonusListForItemLevelDelta(delta);
@@ -1279,7 +1289,7 @@ namespace Game.DataStorage
else if (selector.MinItemLevel >= selectorQualitySet.IlvlRare) else if (selector.MinItemLevel >= selectorQualitySet.IlvlRare)
quality = ItemQuality.Rare; quality = ItemQuality.Rare;
var itemSelectorQuality = itemSelectorQualities.FirstOrDefault(p => p.Quality < (byte)quality); var itemSelectorQuality = itemSelectorQualities.Find(p => p.Quality < (sbyte)quality);
if (itemSelectorQuality != null) if (itemSelectorQuality != null)
bonusListIDs.Add(itemSelectorQuality.QualityItemBonusListID); bonusListIDs.Add(itemSelectorQuality.QualityItemBonusListID);
@@ -1303,20 +1313,20 @@ namespace Game.DataStorage
break; break;
} }
} }
} }
});
return bonusListIDs; return bonusListIDs;
} }
void LoadAzeriteEmpoweredItemUnlockMappings(MultiMap<uint, AzeriteUnlockMappingRecord> azeriteUnlockMappingsBySet, uint itemId) void LoadAzeriteEmpoweredItemUnlockMappings(MultiMap<uint, AzeriteUnlockMappingRecord> azeriteUnlockMappingsBySet, uint itemId)
{ {
ItemSparseRecord proto = CliDB.ItemSparseStorage.LookupByKey(itemId); var itemIdRange = _itemToBonusTree.LookupByKey(itemId);
if (proto == null) if (itemIdRange == null)
return; return;
VisitItemBonusTree(itemId, bonusTreeNode => foreach (var itemTreeItr in itemIdRange)
{
VisitItemBonusTree(itemTreeItr, true, bonusTreeNode =>
{ {
if (bonusTreeNode.ChildItemBonusListID == 0 && bonusTreeNode.ChildItemLevelSelectorID != 0) if (bonusTreeNode.ChildItemBonusListID == 0 && bonusTreeNode.ChildItemLevelSelectorID != 0)
{ {
@@ -1338,11 +1348,12 @@ namespace Game.DataStorage
} }
if (selectedAzeriteUnlockMapping != null) if (selectedAzeriteUnlockMapping != null)
_azeriteUnlockMappings[(proto.Id, (ItemContext)bonusTreeNode.ItemContext)] = selectedAzeriteUnlockMapping; _azeriteUnlockMappings[(itemId, (ItemContext)bonusTreeNode.ItemContext)] = selectedAzeriteUnlockMapping;
} }
} }
}); });
} }
}
public ItemChildEquipmentRecord GetItemChildEquipment(uint itemId) public ItemChildEquipmentRecord GetItemChildEquipment(uint itemId)
{ {
+1 -1
View File
@@ -165,7 +165,7 @@ namespace Game.Loots
generatedLoot.count = (byte)Math.Min(count, proto.GetMaxStackSize()); generatedLoot.count = (byte)Math.Min(count, proto.GetMaxStackSize());
if (_itemContext != 0) if (_itemContext != 0)
{ {
List<uint> bonusListIDs = Global.DB2Mgr.GetItemBonusTree(generatedLoot.itemid, _itemContext); List<uint> bonusListIDs = Global.DB2Mgr.GetDefaultItemBonusTree(generatedLoot.itemid, _itemContext);
generatedLoot.BonusListIDs.AddRange(bonusListIDs); generatedLoot.BonusListIDs.AddRange(bonusListIDs);
} }
lootItems.Add(generatedLoot); lootItems.Add(generatedLoot);