Core/Items: Implemented ItemLimitCategoryCondition.db2

This commit is contained in:
hondacrx
2018-04-18 19:43:29 -04:00
parent 9b927f8093
commit ef05e1f113
7 changed files with 59 additions and 7 deletions
@@ -503,6 +503,10 @@ namespace Framework.Database
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 = ?");
// ItemLimitCategoryCondition.db2
PrepareStatement(HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_CONDITION, "SELECT ID, AddQuantity, PlayerConditionID, ParentItemLimitCategoryID " +
" FROM item_limit_category_condition ORDER BY ID DESC");
// ItemModifiedAppearance.db2
PrepareStatement(HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ItemID, ID, ItemAppearanceModifierID, ItemAppearanceID, OrderIndex, " +
"TransmogSourceTypeEnum FROM item_modified_appearance ORDER BY ID DESC");
@@ -1305,6 +1309,8 @@ namespace Framework.Database
SEL_ITEM_LIMIT_CATEGORY,
SEL_ITEM_LIMIT_CATEGORY_LOCALE,
SEL_ITEM_LIMIT_CATEGORY_CONDITION,
SEL_ITEM_MODIFIED_APPEARANCE,
SEL_ITEM_PRICE_BASE,
+2
View File
@@ -144,6 +144,7 @@ namespace Game.DataStorage
ItemLevelSelectorQualityStorage = DBReader.Read<ItemLevelSelectorQualityRecord>("ItemLevelSelectorQuality.db2", HotfixStatements.SEL_ITEM_LEVEL_SELECTOR_QUALITY);
ItemLevelSelectorQualitySetStorage = DBReader.Read<ItemLevelSelectorQualitySetRecord>("ItemLevelSelectorQualitySet.db2", HotfixStatements.SEL_ITEM_LEVEL_SELECTOR_QUALITY_SET);
ItemLimitCategoryStorage = DBReader.Read<ItemLimitCategoryRecord>("ItemLimitCategory.db2", HotfixStatements.SEL_ITEM_LIMIT_CATEGORY, HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_LOCALE);
ItemLimitCategoryConditionStorage = DBReader.Read<ItemLimitCategoryConditionRecord>("ItemLimitCategoryCondition.db2", HotfixStatements.SEL_ITEM_LIMIT_CATEGORY_CONDITION);
ItemModifiedAppearanceStorage = DBReader.Read<ItemModifiedAppearanceRecord>("ItemModifiedAppearance.db2", HotfixStatements.SEL_ITEM_MODIFIED_APPEARANCE);
ItemPriceBaseStorage = DBReader.Read<ItemPriceBaseRecord>("ItemPriceBase.db2", HotfixStatements.SEL_ITEM_PRICE_BASE);
ItemRandomPropertiesStorage = DBReader.Read<ItemRandomPropertiesRecord>("ItemRandomProperties.db2", HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES, HotfixStatements.SEL_ITEM_RANDOM_PROPERTIES_LOCALE);
@@ -476,6 +477,7 @@ namespace Game.DataStorage
public static DB6Storage<ItemLevelSelectorQualityRecord> ItemLevelSelectorQualityStorage;
public static DB6Storage<ItemLevelSelectorQualitySetRecord> ItemLevelSelectorQualitySetStorage;
public static DB6Storage<ItemLimitCategoryRecord> ItemLimitCategoryStorage;
public static DB6Storage<ItemLimitCategoryConditionRecord> ItemLimitCategoryConditionStorage;
public static DB6Storage<ItemModifiedAppearanceRecord> ItemModifiedAppearanceStorage;
public static DB6Storage<ItemPriceBaseRecord> ItemPriceBaseStorage;
public static DB6Storage<ItemRandomPropertiesRecord> ItemRandomPropertiesStorage;
+9
View File
@@ -227,6 +227,9 @@ namespace Game.DataStorage
CliDB.ItemCurrencyCostStorage.Clear();
foreach (ItemLimitCategoryConditionRecord condition in CliDB.ItemLimitCategoryConditionStorage.Values)
_itemCategoryConditions.Add((uint)condition.ParentItemLimitCategoryID, condition);
foreach (ItemLevelSelectorQualityRecord itemLevelSelectorQuality in CliDB.ItemLevelSelectorQualityStorage.Values)
_itemLevelQualitySelectorQualities.Add(itemLevelSelectorQuality.ParentILSQualitySetID, itemLevelSelectorQuality);
@@ -944,6 +947,11 @@ namespace Game.DataStorage
return _itemClassByOldEnum[(int)itemClass];
}
public List<ItemLimitCategoryConditionRecord> GetItemLimitCategoryConditions(uint categoryId)
{
return _itemCategoryConditions.LookupByKey(categoryId);
}
public uint GetItemDisplayId(uint itemId, uint appearanceModId)
{
ItemModifiedAppearanceRecord modifiedAppearance = GetItemModifiedAppearance(itemId, appearanceModId);
@@ -1511,6 +1519,7 @@ namespace Game.DataStorage
Dictionary<uint, ItemChildEquipmentRecord> _itemChildEquipment = new Dictionary<uint, ItemChildEquipmentRecord>();
Array<ItemClassRecord> _itemClassByOldEnum = new Array<ItemClassRecord>(19);
List<uint> _itemsWithCurrencyCost = new List<uint>();
MultiMap<uint, ItemLimitCategoryConditionRecord> _itemCategoryConditions = new MultiMap<uint, ItemLimitCategoryConditionRecord>();
MultiMap<uint, ItemLevelSelectorQualityRecord> _itemLevelQualitySelectorQualities = new MultiMap<uint, ItemLevelSelectorQualityRecord>();
Dictionary<uint, ItemModifiedAppearanceRecord> _itemModifiedAppearancesByItem = new Dictionary<uint, ItemModifiedAppearanceRecord>();
MultiMap<uint, uint> _itemToBonusTree = new MultiMap<uint, uint>();
@@ -233,6 +233,14 @@ namespace Game.DataStorage
public byte Flags;
}
public sealed class ItemLimitCategoryConditionRecord
{
public uint Id;
public sbyte AddQuantity;
public uint PlayerConditionID;
public int ParentItemLimitCategoryID;
}
public sealed class ItemModifiedAppearanceRecord
{
public uint ItemID;
+21 -6
View File
@@ -1375,7 +1375,6 @@ namespace Game.Entities
// check unique-equipped limit
if (pProto.GetItemLimitCategory() != 0)
{
ItemLimitCategoryRecord limitEntry = CliDB.ItemLimitCategoryStorage.LookupByKey(pProto.GetItemLimitCategory());
if (limitEntry == null)
{
@@ -1385,10 +1384,11 @@ namespace Game.Entities
if (limitEntry.Flags == 0)
{
byte limitQuantity = GetItemLimitCategoryQuantity(limitEntry);
uint curcount = GetItemCountWithLimitCategory(pProto.GetItemLimitCategory(), pItem);
if (curcount + count > limitEntry.Quantity)
if (curcount + count > limitQuantity)
{
no_space_count = count + curcount - limitEntry.Quantity;
no_space_count = count + curcount - limitQuantity;
offendingItemId = pProto.GetId();
return InventoryResult.ItemMaxLimitCategoryCountExceededIs;
}
@@ -3221,6 +3221,20 @@ namespace Game.Entities
return count;
}
public byte GetItemLimitCategoryQuantity(ItemLimitCategoryRecord limitEntry)
{
byte limit = limitEntry.Quantity;
var limitConditions = Global.DB2Mgr.GetItemLimitCategoryConditions(limitEntry.Id);
foreach (ItemLimitCategoryConditionRecord limitCondition in limitConditions)
{
PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(limitCondition.PlayerConditionID);
if (playerCondition == null || ConditionManager.IsPlayerMeetingCondition(this, playerCondition))
limit += (byte)limitCondition.AddQuantity;
}
return limit;
}
public void DestroyConjuredItems(bool update)
{
@@ -5340,14 +5354,15 @@ namespace Game.Entities
return InventoryResult.NotEquippable;
// NOTE: limitEntry.mode not checked because if item have have-limit then it applied and to equip case
byte limitQuantity = GetItemLimitCategoryQuantity(limitEntry);
if (limit_count > limitEntry.Quantity)
if (limit_count > limitQuantity)
return InventoryResult.ItemMaxLimitCategoryEquippedExceededIs;
// there is an equip limit on this item
if (HasItemWithLimitCategoryEquipped(itemProto.GetItemLimitCategory(), limitEntry.Quantity - limit_count + 1, except_slot))
if (HasItemWithLimitCategoryEquipped(itemProto.GetItemLimitCategory(), limitQuantity - limit_count + 1, except_slot))
return InventoryResult.ItemMaxLimitCategoryEquippedExceededIs;
else if (HasGemWithLimitCategoryEquipped(itemProto.GetItemLimitCategory(), limitEntry.Quantity - limit_count + 1, except_slot))
else if (HasGemWithLimitCategoryEquipped(itemProto.GetItemLimitCategory(), limitQuantity - limit_count + 1, except_slot))
return InventoryResult.ItemMaxCountEquippedSocketed;
}
+1 -1
View File
@@ -903,7 +903,7 @@ namespace Game
}
}
if (limit_newcount > 0 && limit_newcount > limitEntry.Quantity)
if (limit_newcount > 0 && limit_newcount > _player.GetItemLimitCategoryQuantity(limitEntry))
{
GetPlayer().SendEquipError(InventoryResult.ItemUniqueEquippableSocketed, itemTarget);
return;