Implement ItemLevelSelector.db2

Implemented glowing new items in inventory
This commit is contained in:
hondacrx
2017-09-20 00:26:09 -04:00
parent 2673fe277e
commit bd1252b3c2
9 changed files with 85 additions and 30 deletions
+3 -3
View File
@@ -339,8 +339,8 @@ namespace Framework.Constants
ScalingStatDistribution = 11, ScalingStatDistribution = 11,
DisenchantLootId = 12, DisenchantLootId = 12,
ScalingStatDistribution2 = 13, ScalingStatDistribution2 = 13,
ItemLevelOverride = 14, ItemLevelCanIncrease = 14, // Displays a + next to item level indicating it can warforge
RandomEnchantment = 15, // Responsible for showing "<Random additional stats>" or "+%d Rank Random Minor Trait" in the tooltip before item is obtained RandomEnchantment = 15, // Responsible for showing "<Random additional stats>" or "+%d Rank Random Minor Trait" in the tooltip before item is obtained
Bounding = 16, Bounding = 16,
RelicType = 17 RelicType = 17
} }
@@ -751,7 +751,7 @@ namespace Framework.Constants
Unk13 = 0x00040000, // ? Unk13 = 0x00040000, // ?
Child = 0x00080000, Child = 0x00080000,
Unk15 = 0x00100000, // ? Unk15 = 0x00100000, // ?
Unk16 = 0x00200000, // ? NewItem = 0x00200000, // Item glows in inventory
Unk17 = 0x00400000, // ? Unk17 = 0x00400000, // ?
Unk18 = 0x00800000, // ? Unk18 = 0x00800000, // ?
Unk19 = 0x01000000, // ? Unk19 = 0x01000000, // ?
@@ -476,6 +476,9 @@ namespace Framework.Database
"RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, RequiredCurrency5, RequiredArenaSlot, RequiredFactionId, RequiredFactionStanding, " + "RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, RequiredCurrency5, RequiredArenaSlot, RequiredFactionId, RequiredFactionStanding, " +
"RequirementFlags, RequiredAchievement FROM item_extended_cost ORDER BY ID DESC"); "RequirementFlags, RequiredAchievement FROM item_extended_cost ORDER BY ID DESC");
// ItemLevelSelector.db2
PrepareStatement(HotfixStatements.SEL_ITEM_LEVEL_SELECTOR, "SELECT ID, ItemLevel FROM item_level_selector ORDER BY ID DESC");
// ItemLimitCategory.db2 // ItemLimitCategory.db2
PrepareStatement(HotfixStatements.SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name, Quantity, Flags FROM item_limit_category ORDER BY ID DESC"); PrepareStatement(HotfixStatements.SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name, Quantity, Flags FROM item_limit_category ORDER BY ID DESC");
PrepareStatement(HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_LOCALE, "SELECT ID, Name_lang FROM item_limit_category_locale WHERE locale = ?"); PrepareStatement(HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_LOCALE, "SELECT ID, Name_lang FROM item_limit_category_locale WHERE locale = ?");
@@ -1255,6 +1258,8 @@ namespace Framework.Database
SEL_ITEM_EXTENDED_COST, SEL_ITEM_EXTENDED_COST,
SEL_ITEM_LEVEL_SELECTOR,
SEL_ITEM_LIMIT_CATEGORY, SEL_ITEM_LIMIT_CATEGORY,
SEL_ITEM_LIMIT_CATEGORY_LOCALE, SEL_ITEM_LIMIT_CATEGORY_LOCALE,
+2
View File
@@ -140,6 +140,7 @@ namespace Game.DataStorage
ItemEffectStorage = DB6Reader.Read<ItemEffectRecord>("ItemEffect.db2", DB6Metas.ItemEffectMeta, HotfixStatements.SEL_ITEM_EFFECT); ItemEffectStorage = DB6Reader.Read<ItemEffectRecord>("ItemEffect.db2", DB6Metas.ItemEffectMeta, HotfixStatements.SEL_ITEM_EFFECT);
ItemStorage = DB6Reader.Read<ItemRecord>("Item.db2", DB6Metas.ItemMeta, HotfixStatements.SEL_ITEM); ItemStorage = DB6Reader.Read<ItemRecord>("Item.db2", DB6Metas.ItemMeta, HotfixStatements.SEL_ITEM);
ItemExtendedCostStorage = DB6Reader.Read<ItemExtendedCostRecord>("ItemExtendedCost.db2", DB6Metas.ItemExtendedCostMeta, HotfixStatements.SEL_ITEM_EXTENDED_COST); ItemExtendedCostStorage = DB6Reader.Read<ItemExtendedCostRecord>("ItemExtendedCost.db2", DB6Metas.ItemExtendedCostMeta, HotfixStatements.SEL_ITEM_EXTENDED_COST);
ItemLevelSelectorStorage = DB6Reader.Read<ItemLevelSelectorRecord>("ItemLevelSelector.db2", DB6Metas.ItemLevelSelectorMeta, HotfixStatements.SEL_ITEM_LEVEL_SELECTOR);
ItemLimitCategoryStorage = DB6Reader.Read<ItemLimitCategoryRecord>("ItemLimitCategory.db2", DB6Metas.ItemLimitCategoryMeta, HotfixStatements.SEL_ITEM_LIMIT_CATEGORY, HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_LOCALE); ItemLimitCategoryStorage = DB6Reader.Read<ItemLimitCategoryRecord>("ItemLimitCategory.db2", DB6Metas.ItemLimitCategoryMeta, HotfixStatements.SEL_ITEM_LIMIT_CATEGORY, HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_LOCALE);
ItemModifiedAppearanceStorage = DB6Reader.Read<ItemModifiedAppearanceRecord>("ItemModifiedAppearance.db2", DB6Metas.ItemModifiedAppearanceMeta, HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE); ItemModifiedAppearanceStorage = DB6Reader.Read<ItemModifiedAppearanceRecord>("ItemModifiedAppearance.db2", DB6Metas.ItemModifiedAppearanceMeta, HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE);
ItemPriceBaseStorage = DB6Reader.Read<ItemPriceBaseRecord>("ItemPriceBase.db2", DB6Metas.ItemPriceBaseMeta, HotfixStatements.SEL_ITEM_PRICE_BASE); ItemPriceBaseStorage = DB6Reader.Read<ItemPriceBaseRecord>("ItemPriceBase.db2", DB6Metas.ItemPriceBaseMeta, HotfixStatements.SEL_ITEM_PRICE_BASE);
@@ -464,6 +465,7 @@ namespace Game.DataStorage
public static DB6Storage<ItemEffectRecord> ItemEffectStorage; public static DB6Storage<ItemEffectRecord> ItemEffectStorage;
public static DB6Storage<ItemRecord> ItemStorage; public static DB6Storage<ItemRecord> ItemStorage;
public static DB6Storage<ItemExtendedCostRecord> ItemExtendedCostStorage; public static DB6Storage<ItemExtendedCostRecord> ItemExtendedCostStorage;
public static DB6Storage<ItemLevelSelectorRecord> ItemLevelSelectorStorage;
public static DB6Storage<ItemLimitCategoryRecord> ItemLimitCategoryStorage; public static DB6Storage<ItemLimitCategoryRecord> ItemLimitCategoryStorage;
public static DB6Storage<ItemModifiedAppearanceRecord> ItemModifiedAppearanceStorage; public static DB6Storage<ItemModifiedAppearanceRecord> ItemModifiedAppearanceStorage;
public static DB6Storage<ItemPriceBaseRecord> ItemPriceBaseStorage; public static DB6Storage<ItemPriceBaseRecord> ItemPriceBaseStorage;
+25 -1
View File
@@ -777,6 +777,11 @@ namespace Game.DataStorage
public List<uint> GetItemBonusTree(uint itemId, uint itemBonusTreeMod) public List<uint> GetItemBonusTree(uint itemId, uint itemBonusTreeMod)
{ {
List<uint> bonusListIDs = new List<uint>(); List<uint> bonusListIDs = new List<uint>();
ItemSparseRecord proto = CliDB.ItemSparseStorage.LookupByKey(itemId);
if (proto == null)
return bonusListIDs;
var itemIdRange = _itemToBonusTree.LookupByKey(itemId); var itemIdRange = _itemToBonusTree.LookupByKey(itemId);
if (itemIdRange.Empty()) if (itemIdRange.Empty())
return bonusListIDs; return bonusListIDs;
@@ -788,8 +793,27 @@ namespace Game.DataStorage
continue; continue;
foreach (ItemBonusTreeNodeRecord bonusTreeNode in treeList) foreach (ItemBonusTreeNodeRecord bonusTreeNode in treeList)
if (bonusTreeNode.BonusTreeModID == itemBonusTreeMod) {
if (bonusTreeNode.BonusTreeModID != itemBonusTreeMod)
continue;
if (bonusTreeNode.BonusListID != 0)
{
bonusListIDs.Add(bonusTreeNode.BonusListID); bonusListIDs.Add(bonusTreeNode.BonusListID);
}
else if (bonusTreeNode.ItemLevelSelectorID != 0)
{
ItemLevelSelectorRecord selector = CliDB.ItemLevelSelectorStorage.LookupByKey(bonusTreeNode.ItemLevelSelectorID);
if (selector == null)
continue;
short delta = (short)(selector.ItemLevel - proto.ItemLevel);
uint bonus = GetItemBonusListForItemLevelDelta(delta);
if (bonus != 0)
bonusListIDs.Add(bonus);
}
}
} }
return bonusListIDs; return bonusListIDs;
+6
View File
@@ -199,6 +199,12 @@ namespace Game.DataStorage
public byte RequiredAchievement; public byte RequiredAchievement;
} }
public sealed class ItemLevelSelectorRecord
{
public uint ID;
public ushort ItemLevel;
}
public sealed class ItemLimitCategoryRecord public sealed class ItemLimitCategoryRecord
{ {
public uint Id; public uint Id;
+14 -26
View File
@@ -1969,24 +1969,23 @@ namespace Game.Entities
return 1; return 1;
uint itemLevel = stats.GetBaseItemLevel(); uint itemLevel = stats.GetBaseItemLevel();
if (_bonusData.HasItemLevelBonus || _bonusData.ItemLevelOverride == 0) ScalingStatDistributionRecord ssd = CliDB.ScalingStatDistributionStorage.LookupByKey(GetScalingStatDistribution());
if (ssd != null)
{ {
ScalingStatDistributionRecord ssd = CliDB.ScalingStatDistributionStorage.LookupByKey(GetScalingStatDistribution()); uint level = owner.getLevel();
if (ssd != null)
{
uint level = owner.getLevel();
uint fixedLevel = GetModifier(ItemModifier.ScalingStatDistributionFixedLevel);
if (fixedLevel != 0)
level = fixedLevel;
uint heirloomIlvl = (uint)Global.DB2Mgr.GetCurveValueAt(ssd.ItemLevelCurveID, level);
if (heirloomIlvl != 0)
itemLevel = heirloomIlvl;
}
itemLevel += (uint)_bonusData.ItemLevelBonus; uint fixedLevel = GetModifier(ItemModifier.ScalingStatDistributionFixedLevel);
if (fixedLevel != 0)
level = fixedLevel;
else
level = Math.Min(Math.Max(level, ssd.MinLevel), ssd.MaxLevel);
uint heirloomIlvl = (uint)Global.DB2Mgr.GetCurveValueAt(ssd.ItemLevelCurveID, level);
if (heirloomIlvl != 0)
itemLevel = heirloomIlvl;
} }
else
itemLevel = _bonusData.ItemLevelOverride; itemLevel += (uint)_bonusData.ItemLevelBonus;
ItemUpgradeRecord upgrade = CliDB.ItemUpgradeStorage.LookupByKey(GetModifier(ItemModifier.UpgradeId)); ItemUpgradeRecord upgrade = CliDB.ItemUpgradeStorage.LookupByKey(GetModifier(ItemModifier.UpgradeId));
if (upgrade != null) if (upgrade != null)
@@ -2716,13 +2715,11 @@ namespace Game.Entities
AppearanceModID = 0; AppearanceModID = 0;
RepairCostMultiplier = 1.0f; RepairCostMultiplier = 1.0f;
ScalingStatDistribution = proto.GetScalingStatDistribution(); ScalingStatDistribution = proto.GetScalingStatDistribution();
ItemLevelOverride = 0;
RelicType = -1; RelicType = -1;
HasItemLevelBonus = false; HasItemLevelBonus = false;
_state.AppearanceModPriority = int.MaxValue; _state.AppearanceModPriority = int.MaxValue;
_state.ScalingStatDistributionPriority = int.MaxValue; _state.ScalingStatDistributionPriority = int.MaxValue;
_state.ItemLevelOverridePriority = int.MaxValue;
_state.HasQualityBonus = false; _state.HasQualityBonus = false;
} }
@@ -2807,13 +2804,6 @@ namespace Game.Entities
_state.ScalingStatDistributionPriority = values[1]; _state.ScalingStatDistributionPriority = values[1];
} }
break; break;
case ItemBonusType.ItemLevelOverride:
if (values[1] < _state.ItemLevelOverridePriority)
{
ItemLevelOverride = (uint)values[0];
_state.ItemLevelOverridePriority = values[1];
}
break;
case ItemBonusType.Bounding: case ItemBonusType.Bounding:
Bonding = (ItemBondingType)values[0]; Bonding = (ItemBondingType)values[0];
break; break;
@@ -2835,7 +2825,6 @@ namespace Game.Entities
public uint AppearanceModID; public uint AppearanceModID;
public float RepairCostMultiplier; public float RepairCostMultiplier;
public uint ScalingStatDistribution; public uint ScalingStatDistribution;
public uint ItemLevelOverride;
public uint[] GemItemLevelBonus = new uint[ItemConst.MaxGemSockets]; public uint[] GemItemLevelBonus = new uint[ItemConst.MaxGemSockets];
public int[] GemRelicType = new int[ItemConst.MaxGemSockets]; public int[] GemRelicType = new int[ItemConst.MaxGemSockets];
public ushort[] GemRelicRankBonus = new ushort[ItemConst.MaxGemSockets]; public ushort[] GemRelicRankBonus = new ushort[ItemConst.MaxGemSockets];
@@ -2847,7 +2836,6 @@ namespace Game.Entities
{ {
public int AppearanceModPriority; public int AppearanceModPriority;
public int ScalingStatDistributionPriority; public int ScalingStatDistributionPriority;
public int ItemLevelOverridePriority;
public bool HasQualityBonus; public bool HasQualityBonus;
} }
} }
+1
View File
@@ -1271,6 +1271,7 @@ namespace Game.Entities
UpdateCriteria(CriteriaTypes.ReceiveEpicItem, itemId, count); UpdateCriteria(CriteriaTypes.ReceiveEpicItem, itemId, count);
UpdateCriteria(CriteriaTypes.OwnItem, itemId, 1); UpdateCriteria(CriteriaTypes.OwnItem, itemId, 1);
item.SetFlag(ItemFields.Flags, ItemFieldFlags.NewItem);
item.SetItemRandomProperties(randomPropertyId); item.SetItemRandomProperties(randomPropertyId);
uint upgradeID = Global.DB2Mgr.GetRulesetItemUpgrade(itemId); uint upgradeID = Global.DB2Mgr.GetRulesetItemUpgrade(itemId);
+17
View File
@@ -1152,5 +1152,22 @@ namespace Game
// Placeholder to prevent completely locking out bags clientside // Placeholder to prevent completely locking out bags clientside
SendPacket(new SortBagsResult()); SendPacket(new SortBagsResult());
} }
[WorldPacketHandler(ClientOpcodes.RemoveNewItem)]
void HandleRemoveNewItem(RemoveNewItem removeNewItem)
{
Item item = _player.GetItemByGuid(removeNewItem.ItemGuid);
if (!item)
{
Log.outDebug(LogFilter.Network, $"WorldSession.HandleRemoveNewItem: Item ({removeNewItem.ItemGuid.ToString()}) not found for {GetPlayerInfo()}!");
return;
}
if (item.HasFlag(ItemFields.Flags, ItemFieldFlags.NewItem))
{
item.RemoveFlag(ItemFields.Flags, ItemFieldFlags.NewItem);
item.SetState(ItemUpdateState.Changed, _player);
}
}
} }
} }
+12
View File
@@ -692,6 +692,18 @@ namespace Game.Network.Packets
public override void Write() { } public override void Write() { }
} }
class RemoveNewItem : ClientPacket
{
public RemoveNewItem(WorldPacket packet) : base(packet) { }
public override void Read()
{
ItemGuid = _worldPacket.ReadPackedGuid();
}
public ObjectGuid ItemGuid { get; set; }
}
//Structs //Structs
public class ItemBonusInstanceData public class ItemBonusInstanceData
{ {