Advertisement
Guest User

Untitled

a guest
Feb 2nd, 2018
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 30.99 KB | None | 0 0
  1. /*
  2.  * Copyright (C) 2008-2018 TrinityCore <https://www.trinitycore.org/>
  3.  * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify it
  6.  * under the terms of the GNU General Public License as published by the
  7.  * Free Software Foundation; either version 2 of the License, or (at your
  8.  * option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful, but WITHOUT
  11.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12.  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13.  * more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License along
  16.  * with this program. If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18.  
  19. #ifndef _ITEMPROTOTYPE_H
  20. #define _ITEMPROTOTYPE_H
  21.  
  22. #include "Common.h"
  23. #include "SharedDefines.h"
  24. #include "WorldPacket.h"
  25. #include <vector>
  26.  
  27. class ObjectMgr;
  28.  
  29. enum ItemModType
  30. {
  31.     ITEM_MOD_MANA                     = 0,
  32.     ITEM_MOD_HEALTH                   = 1,
  33.     ITEM_MOD_AGILITY                  = 3,
  34.     ITEM_MOD_STRENGTH                 = 4,
  35.     ITEM_MOD_INTELLECT                = 5,
  36.     ITEM_MOD_SPIRIT                   = 6,
  37.     ITEM_MOD_STAMINA                  = 7,
  38.     ITEM_MOD_DEFENSE_SKILL_RATING     = 12,
  39.     ITEM_MOD_DODGE_RATING             = 13,
  40.     ITEM_MOD_PARRY_RATING             = 14,
  41.     ITEM_MOD_BLOCK_RATING             = 15,
  42.     ITEM_MOD_HIT_MELEE_RATING         = 16,
  43.     ITEM_MOD_HIT_RANGED_RATING        = 17,
  44.     ITEM_MOD_HIT_SPELL_RATING         = 18,
  45.     ITEM_MOD_CRIT_MELEE_RATING        = 19,
  46.     ITEM_MOD_CRIT_RANGED_RATING       = 20,
  47.     ITEM_MOD_CRIT_SPELL_RATING        = 21,
  48.     ITEM_MOD_HIT_TAKEN_MELEE_RATING   = 22,
  49.     ITEM_MOD_HIT_TAKEN_RANGED_RATING  = 23,
  50.     ITEM_MOD_HIT_TAKEN_SPELL_RATING   = 24,
  51.     ITEM_MOD_CRIT_TAKEN_MELEE_RATING  = 25,
  52.     ITEM_MOD_CRIT_TAKEN_RANGED_RATING = 26,
  53.     ITEM_MOD_CRIT_TAKEN_SPELL_RATING  = 27,
  54.     ITEM_MOD_HASTE_MELEE_RATING       = 28,
  55.     ITEM_MOD_HASTE_RANGED_RATING      = 29,
  56.     ITEM_MOD_HASTE_SPELL_RATING       = 30,
  57.     ITEM_MOD_HIT_RATING               = 31,
  58.     ITEM_MOD_CRIT_RATING              = 32,
  59.     ITEM_MOD_HIT_TAKEN_RATING         = 33,
  60.     ITEM_MOD_CRIT_TAKEN_RATING        = 34,
  61.     ITEM_MOD_RESILIENCE_RATING        = 35,
  62.     ITEM_MOD_HASTE_RATING             = 36,
  63.     ITEM_MOD_EXPERTISE_RATING         = 37,
  64.     ITEM_MOD_ATTACK_POWER             = 38,
  65.     ITEM_MOD_RANGED_ATTACK_POWER      = 39,
  66.     //ITEM_MOD_FERAL_ATTACK_POWER       = 40, not in 3.3
  67.     ITEM_MOD_SPELL_HEALING_DONE       = 41,                 // deprecated
  68.     ITEM_MOD_SPELL_DAMAGE_DONE        = 42,                 // deprecated
  69.     ITEM_MOD_MANA_REGENERATION        = 43,
  70.     ITEM_MOD_ARMOR_PENETRATION_RATING = 44,
  71.     ITEM_MOD_SPELL_POWER              = 45,
  72.     ITEM_MOD_HEALTH_REGEN             = 46,
  73.     ITEM_MOD_SPELL_PENETRATION        = 47,
  74.     ITEM_MOD_BLOCK_VALUE              = 48
  75. };
  76.  
  77. #define MAX_ITEM_MOD                    49
  78.  
  79. enum ItemSpelltriggerType
  80. {
  81.     ITEM_SPELLTRIGGER_ON_USE          = 0,                  // use after equip cooldown
  82.     ITEM_SPELLTRIGGER_ON_EQUIP        = 1,
  83.     ITEM_SPELLTRIGGER_CHANCE_ON_HIT   = 2,
  84.     ITEM_SPELLTRIGGER_SOULSTONE       = 4,
  85.     /*
  86.      * ItemSpelltriggerType 5 might have changed on 2.4.3/3.0.3: Such auras
  87.      * will be applied on item pickup and removed on item loss - maybe on the
  88.      * other hand the item is destroyed if the aura is removed ("removed on
  89.      * death" of spell 57348 makes me think so)
  90.      */
  91.     ITEM_SPELLTRIGGER_ON_NO_DELAY_USE = 5,                  // no equip cooldown
  92.     ITEM_SPELLTRIGGER_LEARN_SPELL_ID  = 6                   // used in item_template.spell_2 with spell_id with SPELL_GENERIC_LEARN in spell_1
  93. };
  94.  
  95. #define MAX_ITEM_SPELLTRIGGER           7
  96.  
  97. enum ItemBondingType
  98. {
  99.     NO_BIND                                     = 0,
  100.     BIND_WHEN_PICKED_UP                         = 1,
  101.     BIND_WHEN_EQUIPED                           = 2,
  102.     BIND_WHEN_USE                               = 3,
  103.     BIND_QUEST_ITEM                             = 4,
  104.     BIND_QUEST_ITEM1                            = 5         // not used in game
  105. };
  106.  
  107. #define MAX_BIND_TYPE                             6
  108.  
  109. /* /// @todo: Requiring actual cases in which using (an) item isn't allowed while shapeshifted. Else, this flag would need an implementation.
  110.     ITEM_FLAG_USE_WHEN_SHAPESHIFTED    = 0x00800000, // Item can be used in shapeshift forms */
  111.  
  112. // ITEM_FIELD_FLAGS
  113. enum ItemFieldFlags : uint32
  114. {
  115.     ITEM_FIELD_FLAG_SOULBOUND     = 0x00000001, // Item is soulbound and cannot be traded <<--
  116.     ITEM_FIELD_FLAG_UNK1          = 0x00000002, // ?
  117.     ITEM_FIELD_FLAG_UNLOCKED      = 0x00000004, // Item had lock but can be opened now
  118.     ITEM_FIELD_FLAG_WRAPPED       = 0x00000008, // Item is wrapped and contains another item
  119.     ITEM_FIELD_FLAG_UNK2          = 0x00000010, // ?
  120.     ITEM_FIELD_FLAG_UNK3          = 0x00000020, // ?
  121.     ITEM_FIELD_FLAG_UNK4          = 0x00000040, // ?
  122.     ITEM_FIELD_FLAG_UNK5          = 0x00000080, // ?
  123.     ITEM_FIELD_FLAG_BOP_TRADEABLE = 0x00000100, // Allows trading soulbound items
  124.     ITEM_FIELD_FLAG_READABLE      = 0x00000200, // Opens text page when right clicked
  125.     ITEM_FIELD_FLAG_UNK6          = 0x00000400, // ?
  126.     ITEM_FIELD_FLAG_UNK7          = 0x00000800, // ?
  127.     ITEM_FIELD_FLAG_REFUNDABLE    = 0x00001000, // Item can be returned to vendor for its original cost (extended cost)
  128.     ITEM_FIELD_FLAG_UNK8          = 0x00002000, // ?
  129.     ITEM_FIELD_FLAG_UNK9          = 0x00004000, // ?
  130.     ITEM_FIELD_FLAG_UNK10         = 0x00008000, // ?
  131.     ITEM_FIELD_FLAG_UNK11         = 0x00010000, // ?
  132.     ITEM_FIELD_FLAG_UNK12         = 0x00020000, // ?
  133.     ITEM_FIELD_FLAG_UNK13         = 0x00040000, // ?
  134.     ITEM_FIELD_FLAG_UNK14         = 0x00080000, // ?
  135.     ITEM_FIELD_FLAG_UNK15         = 0x00100000, // ?
  136.     ITEM_FIELD_FLAG_UNK16         = 0x00200000, // ?
  137.     ITEM_FIELD_FLAG_UNK17         = 0x00400000, // ?
  138.     ITEM_FIELD_FLAG_UNK18         = 0x00800000, // ?
  139.     ITEM_FIELD_FLAG_UNK19         = 0x01000000, // ?
  140.     ITEM_FIELD_FLAG_UNK20         = 0x02000000, // ?
  141.     ITEM_FIELD_FLAG_UNK21         = 0x04000000, // ?
  142.     ITEM_FIELD_FLAG_UNK22         = 0x08000000, // ?
  143.     ITEM_FIELD_FLAG_UNK23         = 0x10000000, // ?
  144.     ITEM_FIELD_FLAG_UNK24         = 0x20000000, // ?
  145.     ITEM_FIELD_FLAG_UNK25         = 0x40000000, // ?
  146.     ITEM_FIELD_FLAG_UNK26         = 0x80000000, // ?
  147.  
  148.     ITEM_FLAG_MAIL_TEXT_MASK = ITEM_FIELD_FLAG_READABLE | ITEM_FIELD_FLAG_UNK13 | ITEM_FIELD_FLAG_UNK14
  149. };
  150.  
  151. enum ItemFlags : uint32
  152. {
  153.     ITEM_FLAG_NO_PICKUP                         = 0x00000001,
  154.     ITEM_FLAG_CONJURED                          = 0x00000002, // Conjured item
  155.     ITEM_FLAG_HAS_LOOT                          = 0x00000004, // Item can be right clicked to open for loot
  156.     ITEM_FLAG_HEROIC_TOOLTIP                    = 0x00000008, // Makes green "Heroic" text appear on item
  157.     ITEM_FLAG_DEPRECATED                        = 0x00000010, // Cannot equip or use
  158.     ITEM_FLAG_NO_USER_DESTROY                   = 0x00000020, // Item can not be destroyed, except by using spell (item can be reagent for spell)
  159.     ITEM_FLAG_PLAYERCAST                        = 0x00000040, // Item's spells are castable by players
  160.     ITEM_FLAG_NO_EQUIP_COOLDOWN                 = 0x00000080, // No default 30 seconds cooldown when equipped
  161.     ITEM_FLAG_MULTI_LOOT_QUEST                  = 0x00000100,
  162.     ITEM_FLAG_IS_WRAPPER                        = 0x00000200, // Item can wrap other items
  163.     ITEM_FLAG_USES_RESOURCES                    = 0x00000400,
  164.     ITEM_FLAG_MULTI_DROP                        = 0x00000800, // Looting this item does not remove it from available loot
  165.     ITEM_FLAG_ITEM_PURCHASE_RECORD              = 0x00001000, // Item can be returned to vendor for its original cost (extended cost)
  166.     ITEM_FLAG_PETITION                          = 0x00002000, // Item is guild or arena charter
  167.     ITEM_FLAG_HAS_TEXT                          = 0x00004000, // Only readable items have this (but not all)
  168.     ITEM_FLAG_NO_DISENCHANT                     = 0x00008000,
  169.     ITEM_FLAG_REAL_DURATION                     = 0x00010000,
  170.     ITEM_FLAG_NO_CREATOR                        = 0x00020000,
  171.     ITEM_FLAG_IS_PROSPECTABLE                   = 0x00040000, // Item can be prospected
  172.     ITEM_FLAG_UNIQUE_EQUIPPABLE                 = 0x00080000, // You can only equip one of these
  173.     ITEM_FLAG_IGNORE_FOR_AURAS                  = 0x00100000,
  174.     ITEM_FLAG_IGNORE_DEFAULT_ARENA_RESTRICTIONS = 0x00200000, // Item can be used during arena match
  175.     ITEM_FLAG_NO_DURABILITY_LOSS                = 0x00400000, // Some Thrown weapons have it (and only Thrown) but not all
  176.     ITEM_FLAG_USE_WHEN_SHAPESHIFTED             = 0x00800000, // Item can be used in shapeshift forms
  177.     ITEM_FLAG_HAS_QUEST_GLOW                    = 0x01000000,
  178.     ITEM_FLAG_HIDE_UNUSABLE_RECIPE              = 0x02000000, // Profession recipes: can only be looted if you meet requirements and don't already know it
  179.     ITEM_FLAG_NOT_USEABLE_IN_ARENA              = 0x04000000, // Item cannot be used in arena
  180.     ITEM_FLAG_IS_BOUND_TO_ACCOUNT               = 0x08000000, // Item binds to account and can be sent only to your own characters
  181.     ITEM_FLAG_NO_REAGENT_COST                   = 0x10000000, // Spell is cast ignoring reagents
  182.     ITEM_FLAG_IS_MILLABLE                       = 0x20000000, // Item can be milled
  183.     ITEM_FLAG_REPORT_TO_GUILD_CHAT              = 0x40000000,
  184.     ITEM_FLAG_NO_PROGRESSIVE_LOOT               = 0x80000000
  185. };
  186.  
  187. enum ItemFlags2 : uint32
  188. {
  189.     ITEM_FLAG2_FACTION_HORDE                            = 0x00000001,
  190.     ITEM_FLAG2_FACTION_ALLIANCE                         = 0x00000002,
  191.     ITEM_FLAG2_DONT_IGNORE_BUY_PRICE                    = 0x00000004, // when item uses extended cost, gold is also required
  192.     ITEM_FLAG2_CLASSIFY_AS_CASTER                       = 0x00000008,
  193.     ITEM_FLAG2_CLASSIFY_AS_PHYSICAL                     = 0x00000010,
  194.     ITEM_FLAG2_EVERYONE_CAN_ROLL_NEED                   = 0x00000020,
  195.     ITEM_FLAG2_NO_TRADE_BIND_ON_ACQUIRE                 = 0x00000040,
  196.     ITEM_FLAG2_CAN_TRADE_BIND_ON_ACQUIRE                = 0x00000080,
  197.     ITEM_FLAG2_CAN_ONLY_ROLL_GREED                      = 0x00000100,
  198.     ITEM_FLAG2_CASTER_WEAPON                            = 0x00000200,
  199.     ITEM_FLAG2_DELETE_ON_LOGIN                          = 0x00000400,
  200.     ITEM_FLAG2_INTERNAL_ITEM                            = 0x00000800,
  201.     ITEM_FLAG2_NO_VENDOR_VALUE                          = 0x00001000,
  202.     ITEM_FLAG2_SHOW_BEFORE_DISCOVERED                   = 0x00002000,
  203.     ITEM_FLAG2_OVERRIDE_GOLD_COST                       = 0x00004000,
  204.     ITEM_FLAG2_IGNORE_DEFAULT_RATED_BG_RESTRICTIONS     = 0x00008000,
  205.     ITEM_FLAG2_NOT_USABLE_IN_RATED_BG                   = 0x00010000,
  206.     ITEM_FLAG2_BNET_ACCOUNT_TRADE_OK                    = 0x00020000,
  207.     ITEM_FLAG2_CONFIRM_BEFORE_USE                       = 0x00040000,
  208.     ITEM_FLAG2_REEVALUATE_BONDING_ON_TRANSFORM          = 0x00080000,
  209.     ITEM_FLAG2_NO_TRANSFORM_ON_CHARGE_DEPLETION         = 0x00100000,
  210.     ITEM_FLAG2_NO_ALTER_ITEM_VISUAL                     = 0x00200000,
  211.     ITEM_FLAG2_NO_SOURCE_FOR_ITEM_VISUAL                = 0x00400000,
  212.     ITEM_FLAG2_IGNORE_QUALITY_FOR_ITEM_VISUAL_SOURCE    = 0x00800000,
  213.     ITEM_FLAG2_NO_DURABILITY                            = 0x01000000,
  214.     ITEM_FLAG2_ROLE_TANK                                = 0x02000000,
  215.     ITEM_FLAG2_ROLE_HEALER                              = 0x04000000,
  216.     ITEM_FLAG2_ROLE_DAMAGE                              = 0x08000000,
  217.     ITEM_FLAG2_CAN_DROP_IN_CHALLENGE_MODE               = 0x10000000,
  218.     ITEM_FLAG2_NEVER_STACK_IN_LOOT_UI                   = 0x20000000,
  219.     ITEM_FLAG2_DISENCHANT_TO_LOOT_TABLE                 = 0x40000000,
  220.     ITEM_FLAG2_USED_IN_A_TRADESKILL                     = 0x80000000
  221. };
  222.  
  223. enum ItemFlagsCustom
  224. {
  225.     ITEM_FLAGS_CU_DURATION_REAL_TIME    = 0x0001,   // Item duration will tick even if player is offline
  226.     ITEM_FLAGS_CU_IGNORE_QUEST_STATUS   = 0x0002,   // No quest status will be checked when this item drops
  227.     ITEM_FLAGS_CU_FOLLOW_LOOT_RULES     = 0x0004    // Item will always follow group/master/need before greed looting rules
  228. };
  229.  
  230. enum BAG_FAMILY_MASK
  231. {
  232.     BAG_FAMILY_MASK_NONE                      = 0x00000000,
  233.     BAG_FAMILY_MASK_ARROWS                    = 0x00000001,
  234.     BAG_FAMILY_MASK_BULLETS                   = 0x00000002,
  235.     BAG_FAMILY_MASK_SOUL_SHARDS               = 0x00000004,
  236.     BAG_FAMILY_MASK_LEATHERWORKING_SUPP       = 0x00000008,
  237.     BAG_FAMILY_MASK_INSCRIPTION_SUPP          = 0x00000010,
  238.     BAG_FAMILY_MASK_HERBS                     = 0x00000020,
  239.     BAG_FAMILY_MASK_ENCHANTING_SUPP           = 0x00000040,
  240.     BAG_FAMILY_MASK_ENGINEERING_SUPP          = 0x00000080,
  241.     BAG_FAMILY_MASK_KEYS                      = 0x00000100,
  242.     BAG_FAMILY_MASK_GEMS                      = 0x00000200,
  243.     BAG_FAMILY_MASK_MINING_SUPP               = 0x00000400,
  244.     BAG_FAMILY_MASK_SOULBOUND_EQUIPMENT       = 0x00000800,
  245.     BAG_FAMILY_MASK_VANITY_PETS               = 0x00001000,
  246.     BAG_FAMILY_MASK_CURRENCY_TOKENS           = 0x00002000,
  247.     BAG_FAMILY_MASK_QUEST_ITEMS               = 0x00004000
  248. };
  249.  
  250. enum SocketColor
  251. {
  252.     SOCKET_COLOR_META                           = 1,
  253.     SOCKET_COLOR_RED                            = 2,
  254.     SOCKET_COLOR_YELLOW                         = 4,
  255.     SOCKET_COLOR_BLUE                           = 8
  256. };
  257.  
  258. #define SOCKET_COLOR_ALL (SOCKET_COLOR_META | SOCKET_COLOR_RED | SOCKET_COLOR_YELLOW | SOCKET_COLOR_BLUE)
  259.  
  260. enum InventoryType : uint8
  261. {
  262.     INVTYPE_NON_EQUIP                           = 0,
  263.     INVTYPE_HEAD                                = 1,
  264.     INVTYPE_NECK                                = 2,
  265.     INVTYPE_SHOULDERS                           = 3,
  266.     INVTYPE_BODY                                = 4,
  267.     INVTYPE_CHEST                               = 5,
  268.     INVTYPE_WAIST                               = 6,
  269.     INVTYPE_LEGS                                = 7,
  270.     INVTYPE_FEET                                = 8,
  271.     INVTYPE_WRISTS                              = 9,
  272.     INVTYPE_HANDS                               = 10,
  273.     INVTYPE_FINGER                              = 11,
  274.     INVTYPE_TRINKET                             = 12,
  275.     INVTYPE_WEAPON                              = 13,
  276.     INVTYPE_SHIELD                              = 14,
  277.     INVTYPE_RANGED                              = 15,
  278.     INVTYPE_CLOAK                               = 16,
  279.     INVTYPE_2HWEAPON                            = 17,
  280.     INVTYPE_BAG                                 = 18,
  281.     INVTYPE_TABARD                              = 19,
  282.     INVTYPE_ROBE                                = 20,
  283.     INVTYPE_WEAPONMAINHAND                      = 21,
  284.     INVTYPE_WEAPONOFFHAND                       = 22,
  285.     INVTYPE_HOLDABLE                            = 23,
  286.     INVTYPE_AMMO                                = 24,
  287.     INVTYPE_THROWN                              = 25,
  288.     INVTYPE_RANGEDRIGHT                         = 26,
  289.     INVTYPE_QUIVER                              = 27,
  290.     INVTYPE_RELIC                               = 28
  291. };
  292.  
  293. #define MAX_INVTYPE                               29
  294.  
  295. enum ItemClass : uint8
  296. {
  297.     ITEM_CLASS_CONSUMABLE                       = 0,
  298.     ITEM_CLASS_CONTAINER                        = 1,
  299.     ITEM_CLASS_WEAPON                           = 2,
  300.     ITEM_CLASS_GEM                              = 3,
  301.     ITEM_CLASS_ARMOR                            = 4,
  302.     ITEM_CLASS_REAGENT                          = 5,
  303.     ITEM_CLASS_PROJECTILE                       = 6,
  304.     ITEM_CLASS_TRADE_GOODS                      = 7,
  305.     ITEM_CLASS_GENERIC                          = 8,
  306.     ITEM_CLASS_RECIPE                           = 9,
  307.     ITEM_CLASS_MONEY                            = 10,
  308.     ITEM_CLASS_QUIVER                           = 11,
  309.     ITEM_CLASS_QUEST                            = 12,
  310.     ITEM_CLASS_KEY                              = 13,
  311.     ITEM_CLASS_PERMANENT                        = 14,
  312.     ITEM_CLASS_MISC                             = 15,
  313.     ITEM_CLASS_GLYPH                            = 16
  314. };
  315.  
  316. #define MAX_ITEM_CLASS                            17
  317.  
  318. enum ItemSubclassConsumable
  319. {
  320.     ITEM_SUBCLASS_CONSUMABLE                    = 0,
  321.     ITEM_SUBCLASS_POTION                        = 1,
  322.     ITEM_SUBCLASS_ELIXIR                        = 2,
  323.     ITEM_SUBCLASS_FLASK                         = 3,
  324.     ITEM_SUBCLASS_SCROLL                        = 4,
  325.     ITEM_SUBCLASS_FOOD                          = 5,
  326.     ITEM_SUBCLASS_ITEM_ENHANCEMENT              = 6,
  327.     ITEM_SUBCLASS_BANDAGE                       = 7,
  328.     ITEM_SUBCLASS_CONSUMABLE_OTHER              = 8
  329. };
  330.  
  331. #define MAX_ITEM_SUBCLASS_CONSUMABLE              9
  332.  
  333. enum ItemSubclassContainer
  334. {
  335.     ITEM_SUBCLASS_CONTAINER                     = 0,
  336.     ITEM_SUBCLASS_SOUL_CONTAINER                = 1,
  337.     ITEM_SUBCLASS_HERB_CONTAINER                = 2,
  338.     ITEM_SUBCLASS_ENCHANTING_CONTAINER          = 3,
  339.     ITEM_SUBCLASS_ENGINEERING_CONTAINER         = 4,
  340.     ITEM_SUBCLASS_GEM_CONTAINER                 = 5,
  341.     ITEM_SUBCLASS_MINING_CONTAINER              = 6,
  342.     ITEM_SUBCLASS_LEATHERWORKING_CONTAINER      = 7,
  343.     ITEM_SUBCLASS_INSCRIPTION_CONTAINER         = 8
  344. };
  345.  
  346. #define MAX_ITEM_SUBCLASS_CONTAINER               9
  347.  
  348. enum ItemSubclassWeapon
  349. {
  350.     ITEM_SUBCLASS_WEAPON_AXE                    = 0,
  351.     ITEM_SUBCLASS_WEAPON_AXE2                   = 1,
  352.     ITEM_SUBCLASS_WEAPON_BOW                    = 2,
  353.     ITEM_SUBCLASS_WEAPON_GUN                    = 3,
  354.     ITEM_SUBCLASS_WEAPON_MACE                   = 4,
  355.     ITEM_SUBCLASS_WEAPON_MACE2                  = 5,
  356.     ITEM_SUBCLASS_WEAPON_POLEARM                = 6,
  357.     ITEM_SUBCLASS_WEAPON_SWORD                  = 7,
  358.     ITEM_SUBCLASS_WEAPON_SWORD2                 = 8,
  359.     ITEM_SUBCLASS_WEAPON_obsolete               = 9,
  360.     ITEM_SUBCLASS_WEAPON_STAFF                  = 10,
  361.     ITEM_SUBCLASS_WEAPON_EXOTIC                 = 11,
  362.     ITEM_SUBCLASS_WEAPON_EXOTIC2                = 12,
  363.     ITEM_SUBCLASS_WEAPON_FIST                   = 13,
  364.     ITEM_SUBCLASS_WEAPON_MISC                   = 14,
  365.     ITEM_SUBCLASS_WEAPON_DAGGER                 = 15,
  366.     ITEM_SUBCLASS_WEAPON_THROWN                 = 16,
  367.     ITEM_SUBCLASS_WEAPON_SPEAR                  = 17,
  368.     ITEM_SUBCLASS_WEAPON_CROSSBOW               = 18,
  369.     ITEM_SUBCLASS_WEAPON_WAND                   = 19,
  370.     ITEM_SUBCLASS_WEAPON_FISHING_POLE           = 20
  371. };
  372.  
  373. #define ITEM_SUBCLASS_MASK_WEAPON_RANGED (\
  374.     (1 << ITEM_SUBCLASS_WEAPON_BOW) | (1 << ITEM_SUBCLASS_WEAPON_GUN) |\
  375.     (1 << ITEM_SUBCLASS_WEAPON_CROSSBOW) | (1 << ITEM_SUBCLASS_WEAPON_THROWN))
  376.  
  377. #define MAX_ITEM_SUBCLASS_WEAPON                  21
  378.  
  379. enum ItemSubclassGem
  380. {
  381.     ITEM_SUBCLASS_GEM_RED                       = 0,
  382.     ITEM_SUBCLASS_GEM_BLUE                      = 1,
  383.     ITEM_SUBCLASS_GEM_YELLOW                    = 2,
  384.     ITEM_SUBCLASS_GEM_PURPLE                    = 3,
  385.     ITEM_SUBCLASS_GEM_GREEN                     = 4,
  386.     ITEM_SUBCLASS_GEM_ORANGE                    = 5,
  387.     ITEM_SUBCLASS_GEM_META                      = 6,
  388.     ITEM_SUBCLASS_GEM_SIMPLE                    = 7,
  389.     ITEM_SUBCLASS_GEM_PRISMATIC                 = 8
  390. };
  391.  
  392. #define MAX_ITEM_SUBCLASS_GEM                     9
  393.  
  394. enum ItemSubclassArmor
  395. {
  396.     ITEM_SUBCLASS_ARMOR_MISC                    = 0,
  397.     ITEM_SUBCLASS_ARMOR_CLOTH                   = 1,
  398.     ITEM_SUBCLASS_ARMOR_LEATHER                 = 2,
  399.     ITEM_SUBCLASS_ARMOR_MAIL                    = 3,
  400.     ITEM_SUBCLASS_ARMOR_PLATE                   = 4,
  401.     ITEM_SUBCLASS_ARMOR_BUCKLER                 = 5,
  402.     ITEM_SUBCLASS_ARMOR_SHIELD                  = 6,
  403.     ITEM_SUBCLASS_ARMOR_LIBRAM                  = 7,
  404.     ITEM_SUBCLASS_ARMOR_IDOL                    = 8,
  405.     ITEM_SUBCLASS_ARMOR_TOTEM                   = 9,
  406.     ITEM_SUBCLASS_ARMOR_SIGIL                   = 10
  407. };
  408.  
  409. #define MAX_ITEM_SUBCLASS_ARMOR                   11
  410.  
  411. enum ItemSubclassReagent
  412. {
  413.     ITEM_SUBCLASS_REAGENT                       = 0
  414. };
  415.  
  416. #define MAX_ITEM_SUBCLASS_REAGENT                 1
  417.  
  418. enum ItemSubclassProjectile
  419. {
  420.     ITEM_SUBCLASS_WAND                          = 0,        // ABS
  421.     ITEM_SUBCLASS_BOLT                          = 1,        // ABS
  422.     ITEM_SUBCLASS_ARROW                         = 2,
  423.     ITEM_SUBCLASS_BULLET                        = 3,
  424.     ITEM_SUBCLASS_THROWN                        = 4         // ABS
  425. };
  426.  
  427. #define MAX_ITEM_SUBCLASS_PROJECTILE              5
  428.  
  429. enum ItemSubclassTradeGoods
  430. {
  431.     ITEM_SUBCLASS_TRADE_GOODS                   = 0,
  432.     ITEM_SUBCLASS_PARTS                         = 1,
  433.     ITEM_SUBCLASS_EXPLOSIVES                    = 2,
  434.     ITEM_SUBCLASS_DEVICES                       = 3,
  435.     ITEM_SUBCLASS_JEWELCRAFTING                 = 4,
  436.     ITEM_SUBCLASS_CLOTH                         = 5,
  437.     ITEM_SUBCLASS_LEATHER                       = 6,
  438.     ITEM_SUBCLASS_METAL_STONE                   = 7,
  439.     ITEM_SUBCLASS_MEAT                          = 8,
  440.     ITEM_SUBCLASS_HERB                          = 9,
  441.     ITEM_SUBCLASS_ELEMENTAL                     = 10,
  442.     ITEM_SUBCLASS_TRADE_GOODS_OTHER             = 11,
  443.     ITEM_SUBCLASS_ENCHANTING                    = 12,
  444.     ITEM_SUBCLASS_MATERIAL                      = 13,
  445.     ITEM_SUBCLASS_ARMOR_ENCHANTMENT             = 14,
  446.     ITEM_SUBCLASS_WEAPON_ENCHANTMENT            = 15
  447. };
  448.  
  449. #define MAX_ITEM_SUBCLASS_TRADE_GOODS             16
  450.  
  451. enum ItemSubclassGeneric
  452. {
  453.     ITEM_SUBCLASS_GENERIC                       = 0
  454. };
  455.  
  456. #define MAX_ITEM_SUBCLASS_GENERIC                 1
  457.  
  458. enum ItemSubclassRecipe
  459. {
  460.     ITEM_SUBCLASS_BOOK                          = 0,
  461.     ITEM_SUBCLASS_LEATHERWORKING_PATTERN        = 1,
  462.     ITEM_SUBCLASS_TAILORING_PATTERN             = 2,
  463.     ITEM_SUBCLASS_ENGINEERING_SCHEMATIC         = 3,
  464.     ITEM_SUBCLASS_BLACKSMITHING                 = 4,
  465.     ITEM_SUBCLASS_COOKING_RECIPE                = 5,
  466.     ITEM_SUBCLASS_ALCHEMY_RECIPE                = 6,
  467.     ITEM_SUBCLASS_FIRST_AID_MANUAL              = 7,
  468.     ITEM_SUBCLASS_ENCHANTING_FORMULA            = 8,
  469.     ITEM_SUBCLASS_FISHING_MANUAL                = 9,
  470.     ITEM_SUBCLASS_JEWELCRAFTING_RECIPE          = 10
  471. };
  472.  
  473. #define MAX_ITEM_SUBCLASS_RECIPE                  11
  474.  
  475. enum ItemSubclassMoney
  476. {
  477.     ITEM_SUBCLASS_MONEY                         = 0
  478. };
  479.  
  480. #define MAX_ITEM_SUBCLASS_MONEY                   1
  481.  
  482. enum ItemSubclassQuiver
  483. {
  484.     ITEM_SUBCLASS_QUIVER0                       = 0,        // ABS
  485.     ITEM_SUBCLASS_QUIVER1                       = 1,        // ABS
  486.     ITEM_SUBCLASS_QUIVER                        = 2,
  487.     ITEM_SUBCLASS_AMMO_POUCH                    = 3
  488. };
  489.  
  490. #define MAX_ITEM_SUBCLASS_QUIVER                  4
  491.  
  492. enum ItemSubclassQuest
  493. {
  494.     ITEM_SUBCLASS_QUEST                         = 0
  495. };
  496.  
  497. #define MAX_ITEM_SUBCLASS_QUEST                   1
  498.  
  499. enum ItemSubclassKey
  500. {
  501.     ITEM_SUBCLASS_KEY                           = 0,
  502.     ITEM_SUBCLASS_LOCKPICK                      = 1
  503. };
  504.  
  505. #define MAX_ITEM_SUBCLASS_KEY                     2
  506.  
  507. enum ItemSubclassPermanent
  508. {
  509.     ITEM_SUBCLASS_PERMANENT                     = 0
  510. };
  511.  
  512. #define MAX_ITEM_SUBCLASS_PERMANENT               1
  513.  
  514. enum ItemSubclassJunk
  515. {
  516.     ITEM_SUBCLASS_JUNK                          = 0,
  517.     ITEM_SUBCLASS_JUNK_REAGENT                  = 1,
  518.     ITEM_SUBCLASS_JUNK_PET                      = 2,
  519.     ITEM_SUBCLASS_JUNK_HOLIDAY                  = 3,
  520.     ITEM_SUBCLASS_JUNK_OTHER                    = 4,
  521.     ITEM_SUBCLASS_JUNK_MOUNT                    = 5
  522. };
  523.  
  524. #define MAX_ITEM_SUBCLASS_JUNK                    6
  525.  
  526. enum ItemSubclassGlyph
  527. {
  528.     ITEM_SUBCLASS_GLYPH_WARRIOR                 = 1,
  529.     ITEM_SUBCLASS_GLYPH_PALADIN                 = 2,
  530.     ITEM_SUBCLASS_GLYPH_HUNTER                  = 3,
  531.     ITEM_SUBCLASS_GLYPH_ROGUE                   = 4,
  532.     ITEM_SUBCLASS_GLYPH_PRIEST                  = 5,
  533.     ITEM_SUBCLASS_GLYPH_DEATH_KNIGHT            = 6,
  534.     ITEM_SUBCLASS_GLYPH_SHAMAN                  = 7,
  535.     ITEM_SUBCLASS_GLYPH_MAGE                    = 8,
  536.     ITEM_SUBCLASS_GLYPH_WARLOCK                 = 9,
  537.     ITEM_SUBCLASS_GLYPH_DRUID                   = 11
  538. };
  539.  
  540. #define MAX_ITEM_SUBCLASS_GLYPH                   12
  541.  
  542. const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] =
  543. {
  544.     MAX_ITEM_SUBCLASS_CONSUMABLE,
  545.     MAX_ITEM_SUBCLASS_CONTAINER,
  546.     MAX_ITEM_SUBCLASS_WEAPON,
  547.     MAX_ITEM_SUBCLASS_GEM,
  548.     MAX_ITEM_SUBCLASS_ARMOR,
  549.     MAX_ITEM_SUBCLASS_REAGENT,
  550.     MAX_ITEM_SUBCLASS_PROJECTILE,
  551.     MAX_ITEM_SUBCLASS_TRADE_GOODS,
  552.     MAX_ITEM_SUBCLASS_GENERIC,
  553.     MAX_ITEM_SUBCLASS_RECIPE,
  554.     MAX_ITEM_SUBCLASS_MONEY,
  555.     MAX_ITEM_SUBCLASS_QUIVER,
  556.     MAX_ITEM_SUBCLASS_QUEST,
  557.     MAX_ITEM_SUBCLASS_KEY,
  558.     MAX_ITEM_SUBCLASS_PERMANENT,
  559.     MAX_ITEM_SUBCLASS_JUNK,
  560.     MAX_ITEM_SUBCLASS_GLYPH
  561. };
  562.  
  563. inline uint8 ItemSubClassToDurabilityMultiplierId(uint32 ItemClass, uint32 ItemSubClass)
  564. {
  565.     switch (ItemClass)
  566.     {
  567.         case ITEM_CLASS_WEAPON: return ItemSubClass;
  568.         case ITEM_CLASS_ARMOR:  return ItemSubClass + 21;
  569.     }
  570.     return 0;
  571. }
  572.  
  573. #pragma pack(push, 1)
  574.  
  575. struct _Damage
  576. {
  577.     float   DamageMin;
  578.     float   DamageMax;
  579.     uint32  DamageType;                                     // id from Resistances.dbc
  580. };
  581.  
  582. struct _ItemStat
  583. {
  584.     uint32  ItemStatType;
  585.     int32   ItemStatValue;
  586. };
  587. struct _Spell
  588. {
  589.     int32 SpellId;                                         // id from Spell.dbc
  590.     uint32 SpellTrigger;
  591.     int32  SpellCharges;
  592.     float  SpellPPMRate;
  593.     int32  SpellCooldown;
  594.     uint32 SpellCategory;                                   // id from SpellCategory.dbc
  595.     int32  SpellCategoryCooldown;
  596. };
  597.  
  598. struct _Socket
  599. {
  600.     uint32 Color;
  601.     uint32 Content;
  602. };
  603.  
  604. #pragma pack(pop)
  605.  
  606. #define MAX_ITEM_PROTO_DAMAGES 2                            // changed in 3.1.0
  607. #define MAX_ITEM_PROTO_SOCKETS 3
  608. #define MAX_ITEM_PROTO_SPELLS  5
  609. #define MAX_ITEM_PROTO_STATS  10
  610.  
  611. struct ItemTemplate
  612. {
  613.     friend class ObjectMgr;
  614.  
  615.     uint32 ItemId;
  616.     uint32 Class;                                           // id from ItemClass.dbc
  617.     uint32 SubClass;                                        // id from ItemSubClass.dbc
  618.     int32  SoundOverrideSubclass;                           // < 0: id from ItemSubClass.dbc, used to override weapon sound from actual SubClass
  619.     std::string Name1;
  620.     uint32 DisplayInfoID;                                   // id from ItemDisplayInfo.dbc
  621.     uint32 Quality;
  622.     uint32 Flags;
  623.     uint32 Flags2;
  624.     uint32 BuyCount;
  625.     int32  BuyPrice;
  626.     uint32 SellPrice;
  627.     uint32 InventoryType;
  628.     uint32 AllowableClass;
  629.     uint32 AllowableRace;
  630.     uint32 ItemLevel;
  631.     uint32 RequiredLevel;
  632.     uint32 RequiredSkill;                                   // id from SkillLine.dbc
  633.     uint32 RequiredSkillRank;
  634.     uint32 RequiredSpell;                                   // id from Spell.dbc
  635.     uint32 RequiredHonorRank;
  636.     uint32 RequiredCityRank;
  637.     uint32 RequiredReputationFaction;                       // id from Faction.dbc
  638.     uint32 RequiredReputationRank;
  639.     int32  MaxCount;                                        // <= 0: no limit
  640.     int32  Stackable;                                       // 0: not allowed, -1: put in player coin info tab and don't limit stacking (so 1 slot)
  641.     uint32 ContainerSlots;
  642.     uint32 StatsCount;
  643.     _ItemStat ItemStat[MAX_ITEM_PROTO_STATS];
  644.     uint32 ScalingStatDistribution;                         // id from ScalingStatDistribution.dbc
  645.     uint32 ScalingStatValue;                                // mask for selecting column in ScalingStatValues.dbc
  646.     _Damage Damage[MAX_ITEM_PROTO_DAMAGES];
  647.     uint32 Armor;
  648.     uint32 HolyRes;
  649.     uint32 FireRes;
  650.     uint32 NatureRes;
  651.     uint32 FrostRes;
  652.     uint32 ShadowRes;
  653.     uint32 ArcaneRes;
  654.     uint32 CustomARes;
  655.     uint32 CustomBRes;
  656.     uint32 CustomCRes;
  657.     uint32 Delay;
  658.     uint32 AmmoType;
  659.     float  RangedModRange;
  660.     _Spell Spells[MAX_ITEM_PROTO_SPELLS];
  661.     uint32 Bonding;
  662.     std::string  Description;
  663.     uint32 PageText;
  664.     uint32 LanguageID;
  665.     uint32 PageMaterial;
  666.     uint32 StartQuest;                                      // id from QuestCache.wdb
  667.     uint32 LockID;
  668.     int32  Material;                                        // id from Material.dbc
  669.     uint32 Sheath;
  670.     int32  RandomProperty;                                  // id from ItemRandomProperties.dbc
  671.     int32  RandomSuffix;                                    // id from ItemRandomSuffix.dbc
  672.     uint32 Block;
  673.     uint32 ItemSet;                                         // id from ItemSet.dbc
  674.     uint32 MaxDurability;
  675.     uint32 Area;                                            // id from AreaTable.dbc
  676.     uint32 Map;                                             // id from Map.dbc
  677.     uint32 BagFamily;                                       // bit mask (1 << id from ItemBagFamily.dbc)
  678.     uint32 TotemCategory;                                   // id from TotemCategory.dbc
  679.     _Socket Socket[MAX_ITEM_PROTO_SOCKETS];
  680.     uint32 socketBonus;                                     // id from SpellItemEnchantment.dbc
  681.     uint32 GemProperties;                                   // id from GemProperties.dbc
  682.     uint32 RequiredDisenchantSkill;
  683.     float  ArmorDamageModifier;
  684.     uint32 Duration;
  685.     uint32 ItemLimitCategory;                               // id from ItemLimitCategory.dbc
  686.     uint32 HolidayId;                                       // id from Holidays.dbc
  687.     uint32 ScriptId;
  688.     uint32 DisenchantID;
  689.     uint32 FoodType;
  690.     uint32 MinMoneyLoot;
  691.     uint32 MaxMoneyLoot;
  692.     uint32 FlagsCu;
  693.     WorldPacket QueryData[TOTAL_LOCALES];
  694.  
  695.     // helpers
  696.     bool CanChangeEquipStateInCombat() const;
  697.  
  698.     bool IsCurrencyToken() const { return (BagFamily & BAG_FAMILY_MASK_CURRENCY_TOKENS) != 0; }
  699.  
  700.     uint32 GetMaxStackSize() const
  701.     {
  702.         return (Stackable == 2147483647 || Stackable <= 0) ? uint32(0x7FFFFFFF-1) : uint32(Stackable);
  703.     }
  704.  
  705.     float getDPS() const;
  706.  
  707.     int32 getFeralBonus(int32 extraDPS = 0) const;
  708.     int32 GetTotalAPBonus() const { return _totalAP; }
  709.  
  710.     float GetItemLevelIncludingQuality() const;
  711.  
  712.     uint32 GetSkill() const;
  713.  
  714.     bool IsPotion() const { return Class == ITEM_CLASS_CONSUMABLE && SubClass == ITEM_SUBCLASS_POTION; }
  715.     bool IsWeaponVellum() const { return Class == ITEM_CLASS_TRADE_GOODS && SubClass == ITEM_SUBCLASS_WEAPON_ENCHANTMENT; }
  716.     bool IsArmorVellum() const { return Class == ITEM_CLASS_TRADE_GOODS && SubClass == ITEM_SUBCLASS_ARMOR_ENCHANTMENT; }
  717.     bool IsConjuredConsumable() const { return Class == ITEM_CLASS_CONSUMABLE && (Flags & ITEM_FLAG_CONJURED); }
  718.  
  719.     void InitializeQueryData();
  720.     WorldPacket BuildQueryData(LocaleConstant loc) const;
  721.  
  722. private:
  723.     // Cached info
  724.     int32 _totalAP;
  725.  
  726.     // Loading Helpers
  727.     void _LoadTotalAP();
  728. };
  729.  
  730. struct ItemLocale
  731. {
  732.     std::vector<std::string> Name;
  733.     std::vector<std::string> Description;
  734. };
  735.  
  736. struct ItemSetNameEntry
  737. {
  738.     std::string name;
  739.     uint32 InventoryType;
  740. };
  741.  
  742. struct ItemSetNameLocale
  743. {
  744.     std::vector<std::string> Name;
  745. };
  746.  
  747. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement