Core/Items: Fixed generating default bonuses based on context
Port From (https://github.com/TrinityCore/TrinityCore/commit/e5a6552abcbf0f179aebb67751527242968522f7)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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);
|
visitor(bonusTreeNode);
|
||||||
if (treeList.Empty())
|
if (visitChildren && bonusTreeNode.ChildItemBonusTreeID != 0)
|
||||||
continue;
|
VisitItemBonusTree(bonusTreeNode.ChildItemBonusTreeID, true, visitor);
|
||||||
|
|
||||||
foreach (ItemBonusTreeNodeRecord bonusTreeNode in treeList)
|
|
||||||
visitor(bonusTreeNode);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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,102 +1235,124 @@ namespace Game.DataStorage
|
|||||||
if (proto == null)
|
if (proto == null)
|
||||||
return bonusListIDs;
|
return bonusListIDs;
|
||||||
|
|
||||||
VisitItemBonusTree(itemId, bonusTreeNode =>
|
var itemIdRange = _itemToBonusTree.LookupByKey(itemId);
|
||||||
{
|
if (itemIdRange == null)
|
||||||
if ((ItemContext)bonusTreeNode.ItemContext != itemContext)
|
return bonusListIDs;
|
||||||
return;
|
|
||||||
|
|
||||||
if (bonusTreeNode.ChildItemBonusListID != 0)
|
ushort itemLevelSelectorId = 0;
|
||||||
|
foreach (var itemBonusTreeId in itemIdRange)
|
||||||
|
{
|
||||||
|
uint matchingNodes = 0;
|
||||||
|
VisitItemBonusTree(itemBonusTreeId, false, bonusTreeNode =>
|
||||||
{
|
{
|
||||||
bonusListIDs.Add(bonusTreeNode.ChildItemBonusListID);
|
if ((ItemContext)bonusTreeNode.ItemContext == ItemContext.None || itemContext == (ItemContext)bonusTreeNode.ItemContext)
|
||||||
}
|
++matchingNodes;
|
||||||
else if (bonusTreeNode.ChildItemLevelSelectorID != 0)
|
});
|
||||||
|
|
||||||
|
if (matchingNodes != 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
VisitItemBonusTree(itemBonusTreeId, true, bonusTreeNode =>
|
||||||
{
|
{
|
||||||
ItemLevelSelectorRecord selector = CliDB.ItemLevelSelectorStorage.LookupByKey(bonusTreeNode.ChildItemLevelSelectorID);
|
ItemContext requiredContext = (ItemContext)bonusTreeNode.ItemContext != ItemContext.ForceToNone ? (ItemContext)bonusTreeNode.ItemContext : ItemContext.None;
|
||||||
if (selector == null)
|
if ((ItemContext)bonusTreeNode.ItemContext != ItemContext.None && itemContext != requiredContext)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
short delta = (short)(selector.MinItemLevel - proto.ItemLevel);
|
if (bonusTreeNode.ChildItemBonusListID != 0)
|
||||||
|
|
||||||
uint bonus = GetItemBonusListForItemLevelDelta(delta);
|
|
||||||
if (bonus != 0)
|
|
||||||
bonusListIDs.Add(bonus);
|
|
||||||
|
|
||||||
ItemLevelSelectorQualitySetRecord selectorQualitySet = CliDB.ItemLevelSelectorQualitySetStorage.LookupByKey(selector.ItemLevelSelectorQualitySetID);
|
|
||||||
if (selectorQualitySet != null)
|
|
||||||
{
|
{
|
||||||
var itemSelectorQualities = _itemLevelQualitySelectorQualities.LookupByKey(selector.ItemLevelSelectorQualitySetID);
|
bonusListIDs.Add(bonusTreeNode.ChildItemBonusListID);
|
||||||
if (itemSelectorQualities != null)
|
|
||||||
{
|
|
||||||
ItemQuality quality = ItemQuality.Uncommon;
|
|
||||||
if (selector.MinItemLevel >= selectorQualitySet.IlvlEpic)
|
|
||||||
quality = ItemQuality.Epic;
|
|
||||||
else if (selector.MinItemLevel >= selectorQualitySet.IlvlRare)
|
|
||||||
quality = ItemQuality.Rare;
|
|
||||||
|
|
||||||
var itemSelectorQuality = itemSelectorQualities.FirstOrDefault(p => p.Quality < (byte)quality);
|
|
||||||
|
|
||||||
if (itemSelectorQuality != null)
|
|
||||||
bonusListIDs.Add(itemSelectorQuality.QualityItemBonusListID);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else if (bonusTreeNode.ChildItemLevelSelectorID != 0)
|
||||||
AzeriteUnlockMappingRecord azeriteUnlockMapping = _azeriteUnlockMappings.LookupByKey((proto.Id, itemContext));
|
|
||||||
if (azeriteUnlockMapping != null)
|
|
||||||
{
|
{
|
||||||
switch (proto.inventoryType)
|
itemLevelSelectorId = bonusTreeNode.ChildItemLevelSelectorID;
|
||||||
{
|
|
||||||
case InventoryType.Head:
|
|
||||||
bonusListIDs.Add(azeriteUnlockMapping.ItemBonusListHead);
|
|
||||||
break;
|
|
||||||
case InventoryType.Shoulders:
|
|
||||||
bonusListIDs.Add(azeriteUnlockMapping.ItemBonusListShoulders);
|
|
||||||
break;
|
|
||||||
case InventoryType.Chest:
|
|
||||||
case InventoryType.Robe:
|
|
||||||
bonusListIDs.Add(azeriteUnlockMapping.ItemBonusListChest);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
ItemLevelSelectorRecord selector = CliDB.ItemLevelSelectorStorage.LookupByKey(itemLevelSelectorId);
|
||||||
|
if (selector != null)
|
||||||
|
{
|
||||||
|
short delta = (short)(selector.MinItemLevel - proto.ItemLevel);
|
||||||
|
|
||||||
|
uint bonus = GetItemBonusListForItemLevelDelta(delta);
|
||||||
|
if (bonus != 0)
|
||||||
|
bonusListIDs.Add(bonus);
|
||||||
|
|
||||||
|
ItemLevelSelectorQualitySetRecord selectorQualitySet = CliDB.ItemLevelSelectorQualitySetStorage.LookupByKey(selector.ItemLevelSelectorQualitySetID);
|
||||||
|
if (selectorQualitySet != null)
|
||||||
|
{
|
||||||
|
var itemSelectorQualities = _itemLevelQualitySelectorQualities.LookupByKey(selector.ItemLevelSelectorQualitySetID);
|
||||||
|
if (itemSelectorQualities != null)
|
||||||
|
{
|
||||||
|
ItemQuality quality = ItemQuality.Uncommon;
|
||||||
|
if (selector.MinItemLevel >= selectorQualitySet.IlvlEpic)
|
||||||
|
quality = ItemQuality.Epic;
|
||||||
|
else if (selector.MinItemLevel >= selectorQualitySet.IlvlRare)
|
||||||
|
quality = ItemQuality.Rare;
|
||||||
|
|
||||||
|
var itemSelectorQuality = itemSelectorQualities.Find(p => p.Quality < (sbyte)quality);
|
||||||
|
|
||||||
|
if (itemSelectorQuality != null)
|
||||||
|
bonusListIDs.Add(itemSelectorQuality.QualityItemBonusListID);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
AzeriteUnlockMappingRecord azeriteUnlockMapping = _azeriteUnlockMappings.LookupByKey((proto.Id, itemContext));
|
||||||
|
if (azeriteUnlockMapping != null)
|
||||||
|
{
|
||||||
|
switch (proto.inventoryType)
|
||||||
|
{
|
||||||
|
case InventoryType.Head:
|
||||||
|
bonusListIDs.Add(azeriteUnlockMapping.ItemBonusListHead);
|
||||||
|
break;
|
||||||
|
case InventoryType.Shoulders:
|
||||||
|
bonusListIDs.Add(azeriteUnlockMapping.ItemBonusListShoulders);
|
||||||
|
break;
|
||||||
|
case InventoryType.Chest:
|
||||||
|
case InventoryType.Robe:
|
||||||
|
bonusListIDs.Add(azeriteUnlockMapping.ItemBonusListChest);
|
||||||
|
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)
|
||||||
{
|
{
|
||||||
if (bonusTreeNode.ChildItemBonusListID == 0 && bonusTreeNode.ChildItemLevelSelectorID != 0)
|
VisitItemBonusTree(itemTreeItr, true, bonusTreeNode =>
|
||||||
{
|
{
|
||||||
ItemLevelSelectorRecord selector = CliDB.ItemLevelSelectorStorage.LookupByKey(bonusTreeNode.ChildItemLevelSelectorID);
|
if (bonusTreeNode.ChildItemBonusListID == 0 && bonusTreeNode.ChildItemLevelSelectorID != 0)
|
||||||
if (selector == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
var azeriteUnlockMappings = azeriteUnlockMappingsBySet.LookupByKey(selector.AzeriteUnlockMappingSet);
|
|
||||||
if (azeriteUnlockMappings != null)
|
|
||||||
{
|
{
|
||||||
AzeriteUnlockMappingRecord selectedAzeriteUnlockMapping = null;
|
ItemLevelSelectorRecord selector = CliDB.ItemLevelSelectorStorage.LookupByKey(bonusTreeNode.ChildItemLevelSelectorID);
|
||||||
foreach (AzeriteUnlockMappingRecord azeriteUnlockMapping in azeriteUnlockMappings)
|
if (selector == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var azeriteUnlockMappings = azeriteUnlockMappingsBySet.LookupByKey(selector.AzeriteUnlockMappingSet);
|
||||||
|
if (azeriteUnlockMappings != null)
|
||||||
{
|
{
|
||||||
if (azeriteUnlockMapping.ItemLevel > selector.MinItemLevel ||
|
AzeriteUnlockMappingRecord selectedAzeriteUnlockMapping = null;
|
||||||
(selectedAzeriteUnlockMapping != null && selectedAzeriteUnlockMapping.ItemLevel > azeriteUnlockMapping.ItemLevel))
|
foreach (AzeriteUnlockMappingRecord azeriteUnlockMapping in azeriteUnlockMappings)
|
||||||
continue;
|
{
|
||||||
|
if (azeriteUnlockMapping.ItemLevel > selector.MinItemLevel ||
|
||||||
|
(selectedAzeriteUnlockMapping != null && selectedAzeriteUnlockMapping.ItemLevel > azeriteUnlockMapping.ItemLevel))
|
||||||
|
continue;
|
||||||
|
|
||||||
selectedAzeriteUnlockMapping = azeriteUnlockMapping;
|
selectedAzeriteUnlockMapping = azeriteUnlockMapping;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedAzeriteUnlockMapping != null)
|
||||||
|
_azeriteUnlockMappings[(itemId, (ItemContext)bonusTreeNode.ItemContext)] = selectedAzeriteUnlockMapping;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectedAzeriteUnlockMapping != null)
|
|
||||||
_azeriteUnlockMappings[(proto.Id, (ItemContext)bonusTreeNode.ItemContext)] = selectedAzeriteUnlockMapping;
|
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
});
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ItemChildEquipmentRecord GetItemChildEquipment(uint itemId)
|
public ItemChildEquipmentRecord GetItemChildEquipment(uint itemId)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user