diff --git a/src/game/Item.cpp b/src/game/Item.cpp index 7f9f2145b..cbdcc0ca6 100644 --- a/src/game/Item.cpp +++ b/src/game/Item.cpp @@ -204,6 +204,10 @@ bool ItemCanGoIntoBag(ItemPrototype const *pProto, ItemPrototype const *pBagProt if(!(pProto->BagFamily & BAG_FAMILY_MASK_LEATHERWORKING_SUPP)) return false; return true; + case ITEM_SUBCLASS_INSCRIPTION_CONTAINER: + if(!(pProto->BagFamily & BAG_FAMILY_MASK_INSCRIPTION_SUPP)) + return false; + return true; default: return false; } @@ -448,7 +452,7 @@ uint32 Item::GetSkill() const static uint32 item_armor_skills[MAX_ITEM_SUBCLASS_ARMOR] = { - 0,SKILL_CLOTH,SKILL_LEATHER,SKILL_MAIL,SKILL_PLATE_MAIL,0,SKILL_SHIELD,0,0,0 + 0,SKILL_CLOTH,SKILL_LEATHER,SKILL_MAIL,SKILL_PLATE_MAIL,0,SKILL_SHIELD,0,0,0,0 }; ItemPrototype const* proto = GetProto(); @@ -763,9 +767,9 @@ void Item::SetEnchantment(EnchantmentSlot slot, uint32 id, uint32 duration, uint if((GetEnchantmentId(slot) == id) && (GetEnchantmentDuration(slot) == duration) && (GetEnchantmentCharges(slot) == charges)) return; - SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET,id); - SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration); - SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges); + SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET,id); + SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration); + SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges); SetState(ITEM_CHANGED); } @@ -774,7 +778,7 @@ void Item::SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration) if(GetEnchantmentDuration(slot) == duration) return; - SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration); + SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET,duration); SetState(ITEM_CHANGED); } @@ -783,7 +787,7 @@ void Item::SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges) if(GetEnchantmentCharges(slot) == charges) return; - SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges); + SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET,charges); SetState(ITEM_CHANGED); } @@ -793,7 +797,7 @@ void Item::ClearEnchantment(EnchantmentSlot slot) return; for(uint8 x = 0; x < 3; ++x) - SetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + x, 0); + SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + x, 0); SetState(ITEM_CHANGED); } diff --git a/src/game/Item.h b/src/game/Item.h index c1430beab..1580d92d7 100644 --- a/src/game/Item.h +++ b/src/game/Item.h @@ -146,29 +146,30 @@ enum SellFailure // -1 from client enchantment slot number enum EnchantmentSlot { - PERM_ENCHANTMENT_SLOT = 0, - TEMP_ENCHANTMENT_SLOT = 1, - SOCK_ENCHANTMENT_SLOT = 2, - SOCK_ENCHANTMENT_SLOT_2 = 3, - SOCK_ENCHANTMENT_SLOT_3 = 4, - BONUS_ENCHANTMENT_SLOT = 5, - MAX_INSPECTED_ENCHANTMENT_SLOT = 6, + PERM_ENCHANTMENT_SLOT = 0, + TEMP_ENCHANTMENT_SLOT = 1, + SOCK_ENCHANTMENT_SLOT = 2, + SOCK_ENCHANTMENT_SLOT_2 = 3, + SOCK_ENCHANTMENT_SLOT_3 = 4, + BONUS_ENCHANTMENT_SLOT = 5, + WOTLK_ENCHANTMENT_SLOT = 6, + MAX_INSPECTED_ENCHANTMENT_SLOT = 7, - PROP_ENCHANTMENT_SLOT_0 = 6, // used with RandomSuffix - PROP_ENCHANTMENT_SLOT_1 = 7, // used with RandomSuffix - PROP_ENCHANTMENT_SLOT_2 = 8, // used with RandomSuffix and RandomProperty - PROP_ENCHANTMENT_SLOT_3 = 9, // used with RandomProperty - PROP_ENCHANTMENT_SLOT_4 = 10, // used with RandomProperty - MAX_ENCHANTMENT_SLOT = 11 + PROP_ENCHANTMENT_SLOT_0 = 7, // used with RandomSuffix + PROP_ENCHANTMENT_SLOT_1 = 8, // used with RandomSuffix + PROP_ENCHANTMENT_SLOT_2 = 9, // used with RandomSuffix and RandomProperty + PROP_ENCHANTMENT_SLOT_3 = 10, // used with RandomProperty + PROP_ENCHANTMENT_SLOT_4 = 11, // used with RandomProperty + MAX_ENCHANTMENT_SLOT = 12 }; -#define MAX_VISIBLE_ITEM_OFFSET 16 // 16 fields per visible item (creator(2) + enchantments(12) + properties(1) + pad(1)) +#define MAX_VISIBLE_ITEM_OFFSET 18 // 18 fields per visible item (creator(2) + enchantments(13) + properties(1) + seed(1) + pad(1)) enum EnchantmentOffset { ENCHANTMENT_ID_OFFSET = 0, ENCHANTMENT_DURATION_OFFSET = 1, - ENCHANTMENT_CHARGES_OFFSET = 2 + ENCHANTMENT_CHARGES_OFFSET = 2 // now here not only charges, but something new in wotlk }; #define MAX_ENCHANTMENT_OFFSET 3 @@ -254,9 +255,9 @@ class MANGOS_DLL_SPEC Item : public Object void SetEnchantmentDuration(EnchantmentSlot slot, uint32 duration); void SetEnchantmentCharges(EnchantmentSlot slot, uint32 charges); void ClearEnchantment(EnchantmentSlot slot); - uint32 GetEnchantmentId(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET);} - uint32 GetEnchantmentDuration(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET);} - uint32 GetEnchantmentCharges(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET);} + uint32 GetEnchantmentId(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_ID_OFFSET);} + uint32 GetEnchantmentDuration(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_DURATION_OFFSET);} + uint32 GetEnchantmentCharges(EnchantmentSlot slot) const { return GetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1 + slot*MAX_ENCHANTMENT_OFFSET + ENCHANTMENT_CHARGES_OFFSET);} void SendTimeUpdate(Player* owner); void UpdateDuration(Player* owner, uint32 diff); diff --git a/src/game/ItemHandler.cpp b/src/game/ItemHandler.cpp index 04355c85d..3e7d654f8 100644 --- a/src/game/ItemHandler.cpp +++ b/src/game/ItemHandler.cpp @@ -286,7 +286,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data ) data << pProto->ItemId; data << pProto->Class; data << pProto->SubClass; - data << uint32(-1); // new 2.0.3, not exist in wdb cache? + data << pProto->Unk0; // new 2.0.3, not exist in wdb cache? data << Name; data << uint8(0x00); //pProto->Name2; // blizz not send name there, just uint8(0x00); <-- \0 = empty string = empty name... data << uint8(0x00); //pProto->Name3; // blizz not send name there, just uint8(0x00); @@ -311,11 +311,14 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data ) data << pProto->MaxCount; data << pProto->Stackable; data << pProto->ContainerSlots; + data << uint32(10); // item stats count? for(int i = 0; i < 10; i++) { data << pProto->ItemStat[i].ItemStatType; data << pProto->ItemStat[i].ItemStatValue; } + data << pProto->ScalingStatDistribution; // scaling stats distribution + data << pProto->ScalingStatValue; // some kind of flags used to determine stat values column for(int i = 0; i < 5; i++) { data << pProto->Damage[i].DamageMin; @@ -333,7 +336,7 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data ) data << pProto->ArcaneRes; data << pProto->Delay; - data << pProto->Ammo_type; + data << pProto->AmmoType; data << pProto->RangedModRange; for(int s = 0; s < 5; s++) @@ -399,7 +402,8 @@ void WorldSession::HandleItemQuerySingleOpcode( WorldPacket & recv_data ) data << pProto->GemProperties; data << pProto->RequiredDisenchantSkill; data << pProto->ArmorDamageModifier; - data << uint32(0); // added in 2.4.2.8209, duration (seconds) + data << pProto->Duration; // added in 2.4.2.8209, duration (seconds) + data << pProto->ItemLimitCategory; // WotLK, ItemLimitCategory SendPacket( &data ); } else diff --git a/src/game/ItemPrototype.h b/src/game/ItemPrototype.h index 9dd7fd701..fa2e8b48c 100644 --- a/src/game/ItemPrototype.h +++ b/src/game/ItemPrototype.h @@ -55,10 +55,18 @@ enum ItemModType ITEM_MOD_CRIT_TAKEN_RATING = 34, ITEM_MOD_RESILIENCE_RATING = 35, ITEM_MOD_HASTE_RATING = 36, - ITEM_MOD_EXPERTISE_RATING = 37 + ITEM_MOD_EXPERTISE_RATING = 37, + ITEM_MOD_ATTACK_POWER = 38, + ITEM_MOD_RANGED_ATTACK_POWER = 39, + ITEM_MOD_FERAL_ATTACK_POWER = 40, + ITEM_MOD_SPELL_HEALING_DONE = 41, + ITEM_MOD_SPELL_DAMAGE_DONE = 42, + ITEM_MOD_MANA_REGENERATION = 43, + ITEM_MOD_ARMOR_PENETRATION_RATING = 44, + ITEM_MOD_SPELL_POWER = 45 }; -#define MAX_ITEM_MOD 38 +#define MAX_ITEM_MOD 46 enum ItemSpelltriggerType { @@ -183,10 +191,11 @@ enum ItemClass ITEM_CLASS_QUEST = 12, ITEM_CLASS_KEY = 13, ITEM_CLASS_PERMANENT = 14, - ITEM_CLASS_JUNK = 15 + ITEM_CLASS_MISC = 15, + ITEM_CLASS_GLYPH = 16 }; -#define MAX_ITEM_CLASS 16 +#define MAX_ITEM_CLASS 17 enum ItemSubclassConsumable { @@ -212,10 +221,11 @@ enum ItemSubclassContainer ITEM_SUBCLASS_ENGINEERING_CONTAINER = 4, ITEM_SUBCLASS_GEM_CONTAINER = 5, ITEM_SUBCLASS_MINING_CONTAINER = 6, - ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7 + ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7, + ITEM_SUBCLASS_INSCRIPTION_CONTAINER = 8 }; -#define MAX_ITEM_SUBCLASS_CONTAINER 8 +#define MAX_ITEM_SUBCLASS_CONTAINER 9 enum ItemSubclassWeapon { @@ -270,10 +280,11 @@ enum ItemSubclassArmor ITEM_SUBCLASS_ARMOR_SHIELD = 6, ITEM_SUBCLASS_ARMOR_LIBRAM = 7, ITEM_SUBCLASS_ARMOR_IDOL = 8, - ITEM_SUBCLASS_ARMOR_TOTEM = 9 + ITEM_SUBCLASS_ARMOR_TOTEM = 9, + ITEM_SUBCLASS_ARMOR_SIGIL = 10 }; -#define MAX_ITEM_SUBCLASS_ARMOR 10 +#define MAX_ITEM_SUBCLASS_ARMOR 11 enum ItemSubclassReagent { @@ -308,10 +319,12 @@ enum ItemSubclassTradeGoods ITEM_SUBCLASS_ELEMENTAL = 10, ITEM_SUBCLASS_TRADE_GOODS_OTHER = 11, ITEM_SUBCLASS_ENCHANTING = 12, - ITEM_SUBCLASS_MATERIAL = 13 // Added in 2.4.2 + ITEM_SUBCLASS_MATERIAL = 13, + ITEM_SUBCLASS_ARMOR_ENCHANTMENT = 14, + ITEM_SUBCLASS_WEAPON_ENCHANTMENT = 15 }; -#define MAX_ITEM_SUBCLASS_TRADE_GOODS 14 +#define MAX_ITEM_SUBCLASS_TRADE_GOODS 16 enum ItemSubclassGeneric { @@ -421,7 +434,8 @@ const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] = MAX_ITEM_SUBCLASS_QUEST, MAX_ITEM_SUBCLASS_KEY, MAX_ITEM_SUBCLASS_PERMANENT, - MAX_ITEM_SUBCLASS_JUNK + MAX_ITEM_SUBCLASS_JUNK, + MAX_ITEM_SUBCLASS_GLYPH }; inline uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass) @@ -443,17 +457,15 @@ inline uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemS struct _Damage { - float DamageMin; - float DamageMax; - uint32 DamageType; // id from Resistances.dbc - + float DamageMin; + float DamageMax; + uint32 DamageType; // id from Resistances.dbc }; struct _ItemStat { - uint32 ItemStatType; - int32 ItemStatValue; - + uint32 ItemStatType; + int32 ItemStatValue; }; struct _Spell { @@ -464,7 +476,6 @@ struct _Spell int32 SpellCooldown; uint32 SpellCategory; // id from SpellCategory.dbc int32 SpellCategoryCooldown; - }; struct _Socket @@ -479,7 +490,7 @@ struct ItemPrototype uint32 Class; // id from ItemClass.dbc uint32 SubClass; // id from ItemSubClass.dbc uint32 Unk0; - char* Name1; + char* Name1; uint32 DisplayInfoID; // id from ItemDisplayInfo.dbc uint32 Quality; uint32 Flags; @@ -502,6 +513,8 @@ struct ItemPrototype uint32 Stackable; uint32 ContainerSlots; _ItemStat ItemStat[10]; + uint32 ScalingStatDistribution; // id from ScalingStatDistribution.dbc + uint32 ScalingStatValue; // mask for selecting column in ScalingStatValues.dbc _Damage Damage[5]; uint32 Armor; uint32 HolyRes; @@ -511,12 +524,11 @@ struct ItemPrototype uint32 ShadowRes; uint32 ArcaneRes; uint32 Delay; - uint32 Ammo_type; + uint32 AmmoType; float RangedModRange; - _Spell Spells[5]; uint32 Bonding; - char* Description; + char* Description; uint32 PageText; uint32 LanguageID; uint32 PageMaterial; @@ -538,12 +550,13 @@ struct ItemPrototype uint32 GemProperties; // id from GemProperties.dbc uint32 RequiredDisenchantSkill; float ArmorDamageModifier; - char* ScriptName; + int32 Duration; // negative = realtime, positive = ingame time + uint32 ItemLimitCategory; // id from ItemLimitCategory.dbc + char* ScriptName; uint32 DisenchantID; uint32 FoodType; uint32 MinMoneyLoot; uint32 MaxMoneyLoot; - int32 Duration; // negative = realtime, positive = ingame time // helpers bool CanChangeEquipStateInCombat() const @@ -564,6 +577,46 @@ struct ItemPrototype return false; } + + uint32 GetScalingStatValuesColumn() const + { + if(ScalingStatValue & 0x00000001) // stat mod + return 0; + if(ScalingStatValue & 0x00000002) // stat mod + return 1; + if(ScalingStatValue & 0x00000004) // stat mod + return 2; + if(ScalingStatValue & 0x00000008) // stat mod + return 3; + if(ScalingStatValue & 0x00000010) // stat mod + return 4; + if(ScalingStatValue & 0x00000020) // armor mod + return 5; + if(ScalingStatValue & 0x00000040) // armor mod + return 6; + if(ScalingStatValue & 0x00000080) // armor mod + return 7; + if(ScalingStatValue & 0x00000100) // armor mod + return 8; + if(ScalingStatValue & 0x00000200) // damage mod + return 9; + if(ScalingStatValue & 0x00000400) // damage mod + return 10; + if(ScalingStatValue & 0x00000800) // damage mod + return 11; + if(ScalingStatValue & 0x00001000) // damage mod + return 12; + if(ScalingStatValue & 0x00002000) // damage mod + return 13; + if(ScalingStatValue & 0x00004000) // damage mod + return 14; + if(ScalingStatValue & 0x00008000) // spell power + return 15; + if(ScalingStatValue & 0x00020000) // feral AP + return 16; + + return 0; + } }; struct ItemLocale