Skip to content

Commit

Permalink
Core/Items: Fixed generating default bonuses based on context
Browse files Browse the repository at this point in the history
  • Loading branch information
hondacrx committed Jun 10, 2020
1 parent d09ddf2 commit dc66cc5
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 90 deletions.
3 changes: 2 additions & 1 deletion Source/Framework/Constants/ItemConst.cs
Expand Up @@ -412,7 +412,8 @@ public enum ItemContext : byte
WorldQuest12 = 54,
WorldQuest13 = 55,
PvpRankedJackpot = 56,
TournamentRealm = 57
TournamentRealm = 57,
Relinquished = 58
}

public enum ItemEnchantmentType : byte
Expand Down
187 changes: 99 additions & 88 deletions Source/Game/DataStorage/DB2Manager.cs
Expand Up @@ -257,16 +257,8 @@ public void LoadStores()

CliDB.ItemBonusListLevelDeltaStorage.Clear();

foreach (var key in CliDB.ItemBonusTreeNodeStorage.Keys)
{
ItemBonusTreeNodeRecord bonusTreeNode = CliDB.ItemBonusTreeNodeStorage[key];
uint bonusTreeId = bonusTreeNode.ParentItemBonusTreeID;
while (bonusTreeNode != null)
{
_itemBonusTrees.Add(bonusTreeId, bonusTreeNode);
bonusTreeNode = CliDB.ItemBonusTreeNodeStorage.LookupByKey(bonusTreeNode.ChildItemBonusTreeID);
}
}
foreach (var bonusTreeNode in CliDB.ItemBonusTreeNodeStorage.Values)
_itemBonusTrees.Add(bonusTreeNode.ParentItemBonusTreeID, bonusTreeNode);

CliDB.ItemBonusTreeNodeStorage.Clear();

Expand Down Expand Up @@ -752,7 +744,7 @@ public uint GetEmptyAnimStateID()
// TEMP: well... AnimationData.db2 in 8.3.0 has more rows than max hardcoded anim id in client
// return sAnimationDataStore.GetNumRows();
}

public List<uint> GetAreasForGroup(uint areaGroupId)
{
return _areaGroupMembers.LookupByKey(areaGroupId);
Expand Down Expand Up @@ -1221,127 +1213,146 @@ public uint GetItemBonusListForItemLevelDelta(short 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);
if (itemIdRange.Empty())
var bonusTreeNodeList = _itemBonusTrees.LookupByKey(itemBonusTreeId);
if (bonusTreeNodeList.Empty())
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>();

ItemSparseRecord proto = CliDB.ItemSparseStorage.LookupByKey(itemId);
if (proto == null)
return bonusListIDs;

VisitItemBonusTree(itemId, bonusTreeNode =>
{
if ((ItemContext)bonusTreeNode.ItemContext != itemContext)
return;
var itemIdRange = _itemToBonusTree.LookupByKey(itemId);
if (itemIdRange == null)
return bonusListIDs;

if (bonusTreeNode.ChildItemBonusListID != 0)
ushort itemLevelSelectorId = 0;
foreach (var itemBonusTreeId in itemIdRange)
{
uint matchingNodes = 0;
VisitItemBonusTree(itemBonusTreeId, false, bonusTreeNode =>
{
bonusListIDs.Add(bonusTreeNode.ChildItemBonusListID);
}
else if (bonusTreeNode.ChildItemLevelSelectorID != 0)
if ((ItemContext)bonusTreeNode.ItemContext == ItemContext.None || itemContext == (ItemContext)bonusTreeNode.ItemContext)
++matchingNodes;
});

if (matchingNodes != 1)
continue;

VisitItemBonusTree(itemBonusTreeId, true, bonusTreeNode =>
{
ItemLevelSelectorRecord selector = CliDB.ItemLevelSelectorStorage.LookupByKey(bonusTreeNode.ChildItemLevelSelectorID);
if (selector == null)
ItemContext requiredContext = (ItemContext)bonusTreeNode.ItemContext != ItemContext.ForceToNone ? (ItemContext)bonusTreeNode.ItemContext : ItemContext.None;
if ((ItemContext)bonusTreeNode.ItemContext != ItemContext.None && itemContext != requiredContext)
return;
short delta = (short)(selector.MinItemLevel - proto.ItemLevel);
if (bonusTreeNode.ChildItemBonusListID != 0)
{
bonusListIDs.Add(bonusTreeNode.ChildItemBonusListID);
}
else if (bonusTreeNode.ChildItemLevelSelectorID != 0)
{
itemLevelSelectorId = bonusTreeNode.ChildItemLevelSelectorID;
}
});
}
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);
uint bonus = GetItemBonusListForItemLevelDelta(delta);
if (bonus != 0)
bonusListIDs.Add(bonus);

ItemLevelSelectorQualitySetRecord selectorQualitySet = CliDB.ItemLevelSelectorQualitySetStorage.LookupByKey(selector.ItemLevelSelectorQualitySetID);
if (selectorQualitySet != null)
ItemLevelSelectorQualitySetRecord selectorQualitySet = CliDB.ItemLevelSelectorQualitySetStorage.LookupByKey(selector.ItemLevelSelectorQualitySetID);
if (selectorQualitySet != null)
{
var itemSelectorQualities = _itemLevelQualitySelectorQualities.LookupByKey(selector.ItemLevelSelectorQualitySetID);
if (itemSelectorQualities != 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;
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);
var itemSelectorQuality = itemSelectorQualities.Find(p => p.Quality < (sbyte)quality);

if (itemSelectorQuality != null)
bonusListIDs.Add(itemSelectorQuality.QualityItemBonusListID);
}
if (itemSelectorQuality != null)
bonusListIDs.Add(itemSelectorQuality.QualityItemBonusListID);
}
}

AzeriteUnlockMappingRecord azeriteUnlockMapping = _azeriteUnlockMappings.LookupByKey((proto.Id, itemContext));
if (azeriteUnlockMapping != null)
AzeriteUnlockMappingRecord azeriteUnlockMapping = _azeriteUnlockMappings.LookupByKey((proto.Id, itemContext));
if (azeriteUnlockMapping != null)
{
switch (proto.inventoryType)
{
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;
}
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;
}

void LoadAzeriteEmpoweredItemUnlockMappings(MultiMap<uint, AzeriteUnlockMappingRecord> azeriteUnlockMappingsBySet, uint itemId)
{
ItemSparseRecord proto = CliDB.ItemSparseStorage.LookupByKey(itemId);
if (proto == null)
var itemIdRange = _itemToBonusTree.LookupByKey(itemId);
if (itemIdRange == null)
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 (selector == null)
return;
var azeriteUnlockMappings = azeriteUnlockMappingsBySet.LookupByKey(selector.AzeriteUnlockMappingSet);
if (azeriteUnlockMappings != null)
if (bonusTreeNode.ChildItemBonusListID == 0 && bonusTreeNode.ChildItemLevelSelectorID != 0)
{
AzeriteUnlockMappingRecord selectedAzeriteUnlockMapping = null;
foreach (AzeriteUnlockMappingRecord azeriteUnlockMapping in azeriteUnlockMappings)
ItemLevelSelectorRecord selector = CliDB.ItemLevelSelectorStorage.LookupByKey(bonusTreeNode.ChildItemLevelSelectorID);
if (selector == null)
return;
var azeriteUnlockMappings = azeriteUnlockMappingsBySet.LookupByKey(selector.AzeriteUnlockMappingSet);
if (azeriteUnlockMappings != null)
{
if (azeriteUnlockMapping.ItemLevel > selector.MinItemLevel ||
(selectedAzeriteUnlockMapping != null && selectedAzeriteUnlockMapping.ItemLevel > azeriteUnlockMapping.ItemLevel))
continue;
AzeriteUnlockMappingRecord selectedAzeriteUnlockMapping = null;
foreach (AzeriteUnlockMappingRecord azeriteUnlockMapping in azeriteUnlockMappings)
{
if (azeriteUnlockMapping.ItemLevel > selector.MinItemLevel ||
(selectedAzeriteUnlockMapping != null && selectedAzeriteUnlockMapping.ItemLevel > azeriteUnlockMapping.ItemLevel))
continue;
selectedAzeriteUnlockMapping = azeriteUnlockMapping;
}
selectedAzeriteUnlockMapping = azeriteUnlockMapping;
}
if (selectedAzeriteUnlockMapping != null)
_azeriteUnlockMappings[(proto.Id, (ItemContext)bonusTreeNode.ItemContext)] = selectedAzeriteUnlockMapping;
if (selectedAzeriteUnlockMapping != null)
_azeriteUnlockMappings[(itemId, (ItemContext)bonusTreeNode.ItemContext)] = selectedAzeriteUnlockMapping;
}
}
}
});
});
}
}

public ItemChildEquipmentRecord GetItemChildEquipment(uint itemId)
Expand Down
2 changes: 1 addition & 1 deletion Source/Game/Loot/Loot.cs
Expand Up @@ -165,7 +165,7 @@ public void AddItem(LootStoreItem item)
generatedLoot.count = (byte)Math.Min(count, proto.GetMaxStackSize());
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);
}
lootItems.Add(generatedLoot);
Expand Down

0 comments on commit dc66cc5

Please sign in to comment.